Imprimer tous les entiers

48

Ecrivez un programme ou une fonction qui imprimera de manière vérifiable tous les nombres entiers exactement une fois, avec un temps et une mémoire infinis.

Les sorties possibles pourraient être:

0, 1, -1, 2, -2, 3, -3, 4, -4, …

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -2, -3, -4, -5, -6, -7, -8, -9, 10, 11, …

Ce n'est pas une sortie valide, car cela n'énumérerait jamais de nombres négatifs:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,…

  • La sortie doit être en décimal, sauf si votre langue ne prend pas en charge l'entier décimal (dans ce cas, utilisez la représentation naturelle des entiers utilisée par votre langue).

  • Votre programme doit travailler jusqu’aux nombres avec la plus grande magnitude du type entier standard de votre langue.

  • Chaque entier doit être séparé du suivant à l'aide d'un séparateur quelconque (un espace, une virgule, un saut de ligne, etc.) qui n'est ni un chiffre ni le signe négatif de votre langue.

  • Le séparateur ne doit changer à aucun moment.

  • Le séparateur peut être composé de plusieurs caractères, à condition qu'aucun d'entre eux ne soit un chiffre ni un signe négatif (par exemple, il est aussi valide que juste ,).

  • Tout entier pris en charge doit éventuellement être imprimé après un laps de temps déterminé.

Notation

C'est du , donc la réponse la plus courte en octets gagne

Classement

Fataliser
la source
3
Si notre langue supporte des listes infinies, pouvons-nous sortir la liste d'une fonction plutôt que de l'imprimer? (Appeler print sur une telle liste imprimerait ses éléments un par un pour toujours.)
xnor
5
J'ai l'impression que l'exigence sur les entiers de taille arbitraire ne fait que décourager les langues sans que de tels entiers ne participent. Ils doivent soit avoir une importation qu'ils peuvent utiliser, soit résoudre un défi totalement différent de celui des autres.
xnor
2
@xnor changé, bien que ce genre de ruines soit le nom même du défi.
Fataliser
5
@xnor, les langues avec des entiers de précision arbitraire doivent encore résoudre un problème différent de tous les autres. Tout ce que ce changement a permis de faire est de rendre ce problème ennuyeux dans de nombreuses langues.
Peter Taylor
2
@ PeterTaylor Ouais, c'est malheureux. Les solutions d’emballage ne me donnent pas l’impression d’imprimer des négatifs, mais je ne vois pas le moyen de préciser la différence quand il s’agit d’une question de représentation.
xnor

Réponses:

19

Sesos , 11 3 3 octets

0000000: c4ceb9                                            ...

Essayez-le en ligne! Cochez Debug pour voir le code SBIN généré.

Assemblage Sesos

Le fichier binaire ci-dessus a été généré en assemblant le code SASM suivant.

set numout

jmp ; implicitly promoted to nop
    put,   fwd 1
    sub 1, put
    rwd 1, add 1
; jnz (implicit)
Dennis
la source
comment est ce 3 octets?
Espérons-
1
Le fichier lisez-moi sur GitHub (lié dans l'en-tête) explique en détail comment les instructions sont codées.
Dennis
1
6 chiffres hexadécimaux / 2 = 3 octets @HopefullyHelpful
Stan Strum
@StanStrum merci
espérons-
47

Haskell, 19 octets

do n<-[1..];[1-n,n]

Produit la liste infinie [0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7...

Haskell permet des listes infinies de manière native. Imprimer une telle liste imprimera ses éléments un à la fois pour toujours.

Xnor
la source
2
J'adore [n,1-n]!
Flawr
3
IMHO [1-n,n]produirait une meilleure sortie.
Neil
@ Neil Je suis d'accord, ça a changé.
xnor
2
Ah, c'est monadese pour concatMap (\n -> [1-n, n]) [1..], non? Agréable!
Carsten S
@CarstenS Oui, exactement.
xnor
29

Brainfuck, 6 octets

Cela utilise le retour à la ligne et imprime toutes les valeurs possibles. Dans Brainfuck, la représentation native sous forme d’ octets .

.+[.+]

Essayez-le en ligne!

flawr
la source
2
Bien, c'est la réponse la plus courte de Brainfuck que j'ai vue jusqu'à présent sur PPCG.
Kevin Cruijssen le
1
Cela ne fonctionnera pas pour les versions brainfuck avec des cellules non liées. S'il vous plaît réparer (même si comme une réponse séparée)
John Dvorak
16
@JanDvorak Les réponses ne doivent pas nécessairement fonctionner dans toutes les mises en œuvre, mais dans toutes les applications.
Martin Ender
7
Pourrais-je avoir une explication de la raison pour laquelle c'est valide? Il n'y a pas de séparateurs comme mentionné dans la question et pas de négatifs. En plus du fait que vous pouvez générer des valeurs supérieures à 9 dans le brainfuck. Je manque d’expérience au code-golf et je commence à travailler sur quelque chose qui produit des nombres négatifs et positifs séparés jusqu’à des nombres plus élevés avant de gravir les échelons.
gtwebb
5
@SQB Même avec une mémoire illimitée, le type natif d'entiers est toujours 8 bits. Un Java intn'a pas soudainement plus ou moins de bits simplement parce que vous avez ajouté ou supprimé de la RAM.
flawr
26

Cubix , 14 12 octets

.(.\OSo;?.>~

Testez-le en ligne! Vous pouvez maintenant régler la vitesse si vous voulez qu'elle soit plus rapide ou plus lente.

Comment ça fonctionne

La première chose que fait l’interprète consiste à supprimer tous les espaces et à compléter le code avec no-ops .jusqu’à ce qu’il soit parfaitement adapté à un cube. Cela signifie que le code ci-dessus peut également être écrit comme ceci:

    . (
    . \
O S o ; ? . > ~
. . . . . . . .
    . .
    . .

Maintenant, le code est exécuté. L’IP (pointeur d’instruction) commence dans le coin supérieur gauche de la face gauche extrême, en direction de l’est. Voici les chemins qu'il faut suivre tout au long de l'exécution du programme:

entrez la description de l'image ici

L'IP commence sur la piste rouge à l'extrême gauche de l'image. Il s'exécute ensuite OSo;et effectue les tâches suivantes:

  • OImprimer le TOS (sommet de la pile) sous forme d’entier. Au début du programme, la pile contient des zéros infinis, ainsi ceci est imprimé 0.
  • SPush 32, le code de caractère pour le caractère d'espace.
  • oImprimer le TOS en tant que personnage. Cela imprime un espace.
  • ;Pop le TOS. Supprime le 32de la pile.

Maintenant, l'IP frappe le ?, ce qui le dirige à gauche, à droite ou directement selon le signe du TOS. En ce moment, le TOS est 0, donc ça va tout droit. C'est le chemin bleu; .ne fait rien, et l'IP frappe la flèche >, ce qui le redirige vers l'est le long du chemin rouge. ~prend le bitwise PAS du TOS, en le changeant en -1.

Ici, l’IP atteint le bord droit du filet, qui le retourne à gauche; ceci affiche à nouveau le TOS (cette fois -1) et un espace.

Maintenant, l'IP frappe le ? nouveau. Cette fois, le TOS est -1; comme c'est négatif, l'IP tourne à gauche, en prenant le chemin vert. Le miroir \renvoie l'adresse IP vers le (, ce qui décrémente le TOS et le change en -2. Il revient et frappe la flèche; ~prend bitwise pas encore, en tournant -2à 1.

Là encore, le TOS est sorti et un espace est imprimé. Cette fois, lorsque l'IP frappe le ?, le TOS est 1; puisque c'est positif, l'IP tourne à droite, prenant le chemin jaune. Le premier opérateur qu’il rencontre est Sen poussant un extra 32; le fait ;apparaître avant qu'il puisse causer des ennuis.

Maintenant, l’IP revient à la flèche et effectue sa routine, ~ changeant le TOS -2et en l' Oimprimant. Comme le TOS est à nouveau négatif, l’IP reprend le chemin vert. Et ça continue comme ça pour toujours *: rouge, vert, rouge, jaune, rouge, vert, rouge, jaune ..., dans le cycle suivant:

0 -1 1 -2 2 -3 3 -4 4 -5 5 -6 6 -7 7 -8 8 -9 9 -10 10 ...

TL; DR

Ce programme passe à plusieurs reprises par ces 3 étapes simples:

  1. Affiche le nombre actuel et un espace.
  2. Si le nombre actuel est négatif, décrémentez-le de 1.
  3. Prenez bitwise PAS du nombre actuel.

Version non séparée, 6 octets

nO?~>~

La suppression de la séparation simplifie tellement le programme qu'il peut tenir sur un cube d'unité:

  n
O ? ~ >
  ~

* Remarque : aucun programme n'est vraiment infini, car ils ne comptent que jusqu'à 2 52 (où JavaScript commence à perdre de la précision en nombre entier).

ETHproductions
la source
4
Joli diagramme! :) L'avez-vous créé à la main ou avez-vous écrit un outil pour le générer?
Martin Ender
5
@MartinEnder Merci! Cela a été inspiré par vos diagrammes Hexagony. J'ai créé celui-ci à la main; Bien que j'aimerais écrire un outil pour les générer quand j'ai assez de temps pour le faire.
ETHproductions
18

MATL , 8 octets

0`@_@XDT

Ceci utilise le type de données par défaut de MATL double, c’est-à-dire qu’il fonctionne jusqu’à 2^53valeur absolue. La sortie est

0
-1
1
-2
2
···

Essayez-le en ligne!

Explication

0            % Push 0
  `     T    % Do...while true: infinite loop
   @_        % Push iteration index and negate
     @       % Push iteration index
      XD     % Display the whole stack
Luis Mendo
la source
Pourquoi y a-t-il un si long délai avant que l'impression ne commence?
Fataliser
@Fatalize Je pense qu'Octave doit être redémarré à chaque fois que vous exécutez un programme MATL dans TIO, et cela prend un certain temps.
flawr
@Fatalize Je ne suis pas sûr. Cela se produit dans le compilateur en ligne, pas hors ligne. Je pensais que cela pourrait avoir un rapport avec Octave paginant la sortie, mais maintenant je ne suis pas sûr que ce soit la raison
Luis Mendo
1
C'est une bonne idée à faire @_@XDplutôt que d' @_D@Dinclure le 0 dans la première manche.
Sanchises
3
XD+1 pour smiley
TuxCrafting
16

Langage de programmation Shakespeare , 227 octets

.
Ajax,.
Puck,.
Act I:
Scene I:
[Enter Ajax,Puck]
Puck:You ox!
Ajax:Be me without myself.Open thy heart.
Scene II:      
Ajax:Be thyself and ash.Open thy heart.Be me times you.Open thy heart.Be me times you.Let us return to scene II.

Évidemment, cette réponse est loin d’être gagnante, mais j’ai bien aimé qu’il s’agisse d’un cas d’utilisation à laquelle le SPL est relativement bien adapté.

A expliqué:

// Everything before the first dot is the play's title, the parser treats it as a comment.
.

// Dramatis personae. Must be characters from Shakespeare's plays, again with a comment.
Ajax,.
Puck,.

// Acts and scenes serve as labels. Like the whole play, they can have titles too,
// but for the sake of golfing I didn't give them any.
Act I:

// This scene would've been named "You are nothing"
Scene I:

// Characters can talk to each other when on stage
[Enter Ajax,Puck]

// Characters can assign each other values by talking. Nice nouns = 1, ugly nouns = -1.
Puck: You ox!                 // Assignment: $ajax = -1;
Ajax: Be me without myself.   // Arithmetic: $puck = $ajax - $ajax;
      Open thy heart.         // Standard output in numerical form: echo $puck;

// Working title "The circle of life"
Scene II:

// Poor Ajax always doing all the work for us
Ajax: Be thyself and ash.          // $puck = $puck + (-1);
      Open thy heart.              // echo $puck;
      Be me times you.             // $puck *= $ajax;  (remember $ajax==-1 from scene I)
      Open thy heart.              // echo $puck;
      Be me times you.             // negate again
      Let us return to scene II.   // infinite goto loop

Comme vous pouvez le constater lorsque je compare ce code à ma réponse au défi connexe consistant à compter pour toujours (imprimer tous les nombres naturels), la longueur du code SPL augmente plutôt mal lorsque la taille du problème augmente ...

Christallkeks
la source
1
J'aime ça. C'est terrible pour le golf, mais merveilleux pour la lecture.
poissons
Typo sur la dernière ligne de l'explication. Let us return to scene II.devrait être scene I.
Oliver Ni
Merci d'avoir signalé la différence! La faute de frappe était en fait dans le code supérieur: nous ne devons pas répéter la scène I car elle serait réinitialisée $puckà 0 et le décompte ne fonctionnerait plus. J'ai ajouté les éléments manquants Idans le code et corrigé la longueur en octets (ce qui était un peu décalé quand même oups)
Christallkeks
14

Python 2, 27 octets

n=0
while 1:print~n,n,;n+=1

Impressions -1 0 -2 1 -3 2 -4 3 ...

Xnor
la source
10

05AB1E , 9 6 octets

3 octets sauvés grâce à Adnan

[ND,±,

Essayez-le en ligne!

Impressions 0, -1, 1, -2, 2 ...séparées par des nouvelles lignes.

Emigna
la source
2
J'ai pu obtenir jusqu'à 6 octets en utilisant un peu de magie au niveau du bit: [N,N±,.
Adnan
1
@Adnan: Nice! J'ai essayé de faire quelque chose de similaire plus tôt, mais je ne l'ai pas utilisé ±et il s'est avéré 3 octets plus longs que le vôtre.
Emigna
Je sais que cela fait un moment, mais D,peut être remplacé par =pour enregistrer un octet.
Kevin Cruijssen
10

GNU sed, 189 + 2 (drapeaux rn) = 191 octets

C'est probablement la solution la plus longue, car sed n'a pas de type entier ni d'opération arithmétique. En tant que tel, je devais émuler un opérateur d'incrément de taille arbitraire en utilisant uniquement des expressions régulières.

s/^/0/p
:
:i;s/9(@*)$/@\1/;ti
s/8(@*)$/9\1/
s/7(@*)$/8\1/
s/6(@*)$/7\1/
s/5(@*)$/6\1/
s/4(@*)$/5\1/
s/3(@*)$/4\1/
s/2(@*)$/3\1/
s/1(@*)$/2\1/
s/0(@*)$/1\1/
s/^@+/1&/;y/@/0/
s/^/-/p;s/-//p
t

Courir:

echo | sed -rnf all_integers.sed

Sortie:

0
-1
1
-2
2
-3
3
etc.
seshoumara
la source
10

Brainfuck, 127 octets

+[-->+>+[<]>-]>-->+[[.<<<]>>-.>>+<[[-]>[->+<]++++++++[-<++++++>>-<]>--[++++++++++>->-<<[-<+<+>>]]>+>+<]<<<[.<<<]>>.+.>[>>>]<<<]

Essayez-le en ligne!

Étant donné une bande infinie serait théoriquement courir pour toujours.

0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10,11,-11,12,-12,13,-13,14,-14,15,-15,16,-16,17,-17,18,-18,19,-19,20,-20,21,-21,22,-22,23,-23,24,-24,25,-25,26,-26,27,-27,28,-28,29,-29,30,-30,31,-31,32,-32,33,-33,34,-34,35,-35,36,-36,37,-37,38,-38,39,-39,40,-40,41,-41,42,-42,43,-43,44,-44,45,-45,46,-46,47,-47,48,-48,49,-49,50,-50,51,-51,52,-52,53,-53,54,-54,55,-55,56,-56,57,-57,58,-58,59,-59,60,-60,61,-61,62,-62,63,-63,64,-64,65,-65,66,-66,67,-67,68,-68,69,-69,70,-70,71,-71,72,-72,73,-73,74,-74,75,-75,76,-76,77,-77,78,-78,79,-79,80,-80,81,-81,82,-82,83,-83,84,-84,85,-85,86,-86,87,-87,88,-88,89,-89,90,-90,91,-91,92,-92,93,-93,94,-94,95,-95,96,-96,97,-97,98,-98,99,-99,...

Non compressé

+[-->+>+[<]>-]>-->+
[
  [.<<<]>>-.>>+<
  [[-]>[->+<]
    ++++++++[-<++++++>>-<]>--
    [++++++++++>->-<<[-<+<+>>]]>+>+<
  ]<<<
  [.<<<]>>.+.>
  [>>>]<<<
]
primo
la source
9

ShadyAsFuck , 3 octets

FVd

Explication:

F     prints the current cell value (0) and increases it by 1
 V    starts a loop and prints the current value
  d   increases the current value and ends the loop

Cela utilise le retour à la ligne et imprime toutes les valeurs possibles. En SAF, la représentation entière native est exprimée en octets .

flawr
la source
5
Cette réponse est ... louche.
Conor O'Brien
1
Je me demandais qui avait proposé le nom de la langue, puis j'ai remarqué de quelle langue il descendait.
John Dvorak
8

R, 25 24 octets

Golfé un octet grâce à @JDL.

repeat cat(-F,F<-F+1,'')

Essayez-le en ligne!

Exemple de sortie:

0 1 -1 2 -2 3 -3 4 -4 5 -5 6 -6 7 -7 8 -8 9 -9 10 
tourbull
la source
2
Vous pouvez remplacer while(1)par repeat pour enregistrer un caractère.
JDL
@JDL Merci! J'oublie que la construction existe parfois.
rturnbull
7

Lot, 56 octets

@set n=0
:l
@echo %n%
@set/an+=1
@echo -%n%
@goto l

Sortie:

0
-1
1
-2
2
-3

etc. Fonctionne jusqu'à 2147483647; 58 octets si vous voulez (-) 2147483648 dans la sortie:

@set n=0
:l
@echo %n:-=%
@set/an-=1
@echo %n%
@goto l

44 octets si tous les entiers positifs pris en charge sont affichés, puis tous les entiers négatifs pris en charge, puis se répétant indéfiniment, est acceptable:

@set n=0
:l
@echo %n%
@set/an+=1
@goto l
Neil
la source
7

Java 7, 151 134 122 118 octets

import java.math.*;void c(){for(BigInteger i=BigInteger.ONE,y=i;;i=i.add(y))System.out.println(y.subtract(i)+"\n"+i);}

12 octets enregistrés grâce à @flawr (et @xnor indirectement)

Après le changement de règle .. ( 59 56 63 octets)

void c(){for(int i=0;i>1<<31;)System.out.println(~--i+"\n"+i);}

Depuis Java 2147483647 + 1 = -2147483648, nous ne pouvons pas simplement faire i++et continuer à l'infini, car le défi consistait à imprimer tous les chiffres une fois. Avec le code ci - dessus avec une plage ajoutée, il sera au lieu d' imprimer tous les entiers de -2147483648la 2147483647fois par, dans l'ordre suivant: 0, -1, 1, -2, 2, -3, 3, -4, ..., 2147483646, -2147483647, 2147483647, -2147483648. Merci à @ OlivierGrégoire pour avoir souligné le comportement de Java concernant MIN_VALUE-1/ MAX_VALUE+1. Essayez ici.

Ungolfed & code de test:

Essayez-le ici - entraînant une erreur d'exécution

import java.math.*;
class M{
  static void c() {
    for(BigInteger i = BigInteger.ONE, y = i; ; i = i.add(y)){
      System.out.println(y.subtract(i) + "\n" + i);
    }
  }

  public static void main(String[] a){
    c();
  }
}

Sortie:

0
1
-1
2
-2
3
-3
4
-4
5
-5
...
Kevin Cruijssen
la source
1
Je pense que vous pourriez économiser quelques octets en imprimant n et 1-n en même temps, de cette façon, vous pourriez supprimer la compraision. @xnor a été le premier à utiliser cette idée ici.
Flawr
1
Votre intprogramme -version, à temps infini, affichera chaque entier pendant un temps infini.
Olivier Grégoire
1
@ OlivierGrégoire Ah, bien sûr, MAX_VALUE + 1 est MIN_VALUE .. soupir. Je l'ai édité, merci de l'avoir signalé.
Kevin Cruijssen
1
Si vous voulez jouer plus au golf (c'est-à-dire vous en débarrasser MAX_VALUE, vous pouvez consulter ma réponse (probablement toujours à la dernière page).
Olivier Grégoire
1
Votre solution de 53 octets est un extrait de code, et non une fonction ou un programme, et n'est donc pas valide.
Mego
6

DC (version GNU ou OpenBSD) - 16 octets

Cette version n’est pas plus courte que la version ci-dessous mais devrait pouvoir fonctionner sans que la pile n’explose sur votre PC. Néanmoins, un nombre infini de grands nombres occupera une quantité infinie de mémoire ... un peu ...

En raison de la rcommande, il nécessite GNU-DC ou OpenBSD-DC .

0[rp1+45Pprdx]dx

Tester:

$ dc -e '0[rp1+45Pprdx]dx' | head
0
-1
1
-2
2
-3
3
-4
4
-5

DC - 16 octets

Un peu méchant maintenant. ;-)

Cette version abuse de la longueur de la pile en tant que compteur tout en laissant la pile grandir.

z[pz45Ppllx]dslx

Tester:

$ dc -e 'z[pz45Ppllx]dslx' | head
0
-1
1
-2
2
-3
3
-4
4
-5

DC - 17 octets

Sans astuces sales.

0[p1+45Ppllx]dslx

Tester:

$ dc -e '0[p1+45Ppllx]dslx' | head
0
-1
1
-2
2
-3
3
-4
4
-5
disparu
la source
+? pour "tôt ou tard ... plus tôt que prévu"
Greg Martin
2
Au lieu de [-]P, fais 45P. "GNU-Dc ou OpenBSD-Dc" - Existe-t-il d'autres versions couramment trouvées dans la nature?
Digital Trauma
1
J'ai une autre solution (ou quelques-unes), mais elles impliquent des nombres négatifs réels. Puis-je les poster dans une nouvelle réponse? Je leur pose la question car ils ressemblent beaucoup à ceux-ci, car ils dcne comptent que quelques opérateurs. Je les ai développés indépendamment de ceux-ci.
Joe
@ DigitalTrauma ... bien sûr ... le Dc d'origine n'a / n'avait pas rcomme "échange". Je suis parfois dérouté lorsque je regarde les versions différentes. Probablement personne ne veut plus coder en ancien Dc (et rla pile serait vide). Peut-être que je changerais "Dc" en "AT & T dc"? ... et merci pour l' 45Pallusion ...
parti le
2
@yeti je viens de mettre "dc" sur mes réponses. Je ne pense pas que les gens ici s’inquiètent trop, surtout compte tenu de l’omniprésence des arômes "modernes" en courant continu.
Digital Trauma
6

C # 74 octets

class P{void Main(){for(var x=0m;;System.Console.Write(x+++","+-x+","));}}

class P
{
    void Main()
    {
        for(var x = 0m; ; System.Console.Write(x++ + "," + -x + ","));
    }
}

Sortie:

0,-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,...

Essayez le:

dotnetfiddle.net (limité à 1000)

alex
la source
Ces extraits ne sont-ils pas des fonctions / programmes complets?
pinkfloydx33
Désolé, programme complet ajouté
alex
2
Vous pouvez omettre les publicmodificateurs et économiser 14 octets. Les valeurs par défaut feront également bien l'affaire.
Alejandro
@Alejandro merci, c'est mon premier post :)
alex
6

Ruby, 26 22 19 16 octets

Imprime les nombres séparés par des nouvelles lignes. -3 octets de @manatwork. -3 octets de @ m-chrzan.

0.step{|n|p~n,n}
Valeur d'encre
la source
Vous produisez des valeurs numériques ici, donc vous ple ferez aussi.
Manatwork
0.step{|n|p n,~n}pour 17 octets.
m-chrzan
1
@ m-chrzan parce que l'ordre importe moins, j'ai réussi à obtenir un octet supplémentaire, en plus de votre suggestion!
Value Ink
6

JavaScript, 29 26 octets

Version non infinie, 26 octets

3 octets sauvés grâce à ETHproductions

for(n=1;;)alert([1-n,n++])

affichera tous les entiers compris entre -9007199254740991 et 9007199254740992.

Version infinie (ES6), 114 112 octets

2 octets sauvés grâce à ETHproductions

for(n=[-1];1;alert(n[a||n.unshift(1),0]?(x=n.join``)+' -'+x:0))for(i=n.length,a=0;i--;a=(n[i]+=1-a)>9?n[i]=0:1);

affichera tous les nombres entiers, compte tenu du temps infini et de la mémoire.

Arnauld
la source
Vous pouvez supprimer la fonction passe-partout et l'appeler programme complet.
Conor O'Brien
@ ConorO'Brien - Oh, tu as raison. Merci :)
Arnauld
n[a,b,c]renvoie n[c], vous pouvez donc supprimer les parenthèses dans n[(a||n.unshift(1),0)].
ETHproductions
Vous n'avez pas besoin de l'une 1ou l'autre boucle; for(;;)fonctionne pour toujours. Vous pouvez enregistrer deux autres octets avec for(n=1;;)alert([1-n,n++]). De plus, cela n'utilise plus aucune fonctionnalité de l'ES6 ;-)
ETHproductions
5

> <> , 19 15 octets

1::1$-naonao1+!

Cela imprime ce qui suit:

0
1
-1
2
-2
3
-3

... etc. Le séparateur est une nouvelle ligne.

Re-écrit après avoir lu la réponse de @ xnor pour utiliser une version de cet algorithme. À partir de n=1, le programme est imprimé 1-net nsuivi d'une nouvelle ligne avant d'être incrémenté n. Après avoir dépassé la valeur maximale, le programme se termine par une erreur de something smells fishy.... Le moment exact où cela se produira dépend de la mise en œuvre de l'interprète.


La version précédente:

0:nao0$-:10{0(?$~+!

À partir de 0, le programme se poursuit indéfiniment. Sur chaque boucle, la valeur actuelle est imprimée avec une nouvelle ligne. Il est ensuite annulé et incrémenté s'il est positif.

Sok
la source
Xnor est-il sans ambiguïté un "il"? Ou est-ce que nos préjugés inconscients montrent ...?
Greg Martin
2
@ GregMartin C'est intéressant, je ne pense pas avoir jamais mentionné un genre.
xnor
5

Utilitaires Bash + GNU, 26

seq NaN|sed '1i0
p;s/^/-/'
Trauma numérique
la source
Je n'ai jamais vu seq utilisé de cette façon, est-ce un bug? De plus, va-t-il commencer à répéter les chiffres après un débordement de type? Je sais que le $[++i]fait en bash.
Seshoumara
Ressemble à une fonctionnalité plus récente - voir le code source . L'ajout de 1 à NaN ne devrait pas causer de bouclage.
Digital Trauma
Je suis parti seq NaNpour courir et après 999999, l’impression est faite en notation scientifique avec une précision de 5 chiffres. En ce qui concerne le défi, cette valeur est alors le plus grand entier que vous imprimez, ce qui est correct car le reste ne répète pas un nombre précédent. Vous remarquerez également que vous pouvez exécuter seq avec inf, insensible à la casse, tout comme pour nan. +1
seshoumara
5

bc, 17 16 octets

Edit: 1 octet en moins grâce à Digital Trauma .

Ajoutant à la diversité des langages utilisés jusqu’à présent, je présente une solution bc qui fonctionne avec des entiers de taille arbitraire. . Une nouvelle ligne est requise après le code et est comptée dans le nombre total d'octets.

for(;;){i;-++i}

Dans la première itération in'est pas définie, mais l'impression donne 0 à ma grande surprise.

seshoumara
la source
1 octet plus court:for(;;){i;-++i}
Digital Trauma,
@ DigitalTrauma Merci, j'ai mis à jour ma réponse. Ce qui est amusant, c’est que j’ai utilisé cette construction de boucle aujourd’hui dans mon autre réponse bash , mais j’ai oublié qu’il en bcavait aussi.
Seshoumara
Ou for(;;){i++;-i}(même longueur).
sch
5

Labyrinthe , 9 octets

!`
\:"
 (

Essayez-le en ligne!

Cela fonctionne aussi et est essentiellement le même:

 "
`:(
\!

Explication

Le flux de contrôle dans ce code est plutôt amusant. N'oubliez pas que le pointeur d'instruction (IP) dans un programme Labyrinth suit le chemin des caractères non-espaces et examine le haut de la pile à n'importe quelle jonction pour décider du chemin à suivre:

  • Si le haut de la pile est positif, tournez à droite.
  • Si le sommet de la pile est nul, continuez tout droit.
  • Si le haut de la pile est négatif, tournez à gauche.

Lorsque l'IP frappe une impasse, il tourne (en exécutant la commande à la fin seulement une fois). Et l’IP commence dans le coin supérieur gauche en direction est. Notez également que la pile est implicitement remplie avec une quantité infinie de zéros pour commencer.

Le programme commence par ce petit bit:

!    Print top of stack (0).
`    Multiply by -1 (still 0).
:    Duplicate.

Maintenant, l'IP est à la jonction appropriée et va tout droit sur ce (qui décrémente le haut de la pile -1. L'IP se trouve dans une impasse et se retourne. :duplique le haut de la pile une fois de plus. Maintenant, le sommet de la pile est négatif et l'adresse IP tourne à gauche (ouest). Nous exécutons maintenant une autre itération de la boucle principale:

\   Print linefeed.
!   Print top of stack (-1).
`   Multiply by -1 (1).
:   Duplicate.

Cette fois, le sommet de la pile est positif, donc IP tourne à droite (ouest) et exécute immédiatement une autre itération de la boucle principale, qui affiche le 1. Puis, une fois que cela est annulé, nous frappons le :avec -1sur la pile.

Cette fois, l'IP tourne à gauche (est). Il "s’agit simplement d’un non-fonctionnement et l’adresse IP tourne dans l’impasse. :fait une autre copie et cette fois l'IP tourne au sud. (décrémente la valeur à -2, l’IP se retourne à nouveau. Avec le haut de la pile toujours négatif, l’IP passe maintenant à l’ouest :et effectue la prochaine itération de la boucle principale.

De cette manière, l’IP va effectuer une itération entre une itération de boucle étroite, l’impression d’un nombre positif, et une itération qui passe par les deux impasses pour décrémenter la valeur avant l’impression d’un nombre négatif.

Vous vous demandez peut-être pourquoi il y a la "deuxième ligne si cela ne fait rien: sans cela, lorsque l'IP atteint :une valeur négative, il ne peut pas tourner à gauche (est), mais plutôt à droite (ouest). (En règle générale, si la direction habituelle à une jonction n'est pas disponible, l'IP prendra la direction opposée). Cela signifie que la propriété intellectuelle n'atteindrait jamais la limite (inférieure et que nous ne pouvions pas distinguer les itérations positives des négatives.

Martin Ender
la source
C'est ce que j'ai proposé avant de voir votre réponse: pastebin.com/VHzAvABe
Robert Hickman
5

JavaScript (ES5), 32 31 30 29 octets

for(i=0;;)[i++,-i].map(alert)

Impressions 0 -1 1 -2 2 -3 3 -4 4 -5 5 ...

Sauvé 1 octet grâce à Patrick Roberts! 2 octets sauvés grâce à Conor O'Brien!

Paul Schmitz
la source
1
Que diriez-vous [i++,-i].map(alert)au lieu de alert(i++),alert(-i)?
Conor O'Brien
for(;;)est un octet plus court quewhile(1)
Patrick Roberts
@ ConorO'Brien mapest ES6
Paul Schmitz
@PaulSchmitz Nope, 5ème édition.
Conor O'Brien
Vous pouvez déplacer le i=0;bit dans la boucle for pour enregistrer un octet.
Conor O'Brien
4

Java, 65 54 octets

i->{for(;;)System.out.print(i+++" "+(-i<i?-i+" ":""));

Code de test non-golfé

public static void main(String[] args) {
    Consumer<Integer> r = i -> {
        for (;;) {
            System.out.print(i++ + " " + (-i < i ? -i + " " : ""));
        }
    };

    r.accept(0);
}
Shaun Wild
la source
3
biggest magnitude of the standard integer type of your language intest le type entier standard de Java.
Shaun Wild
1
Désolé, les exigences ont changé entre-temps ...
flawr
2
Vous pouvez ()->{for(int i=0;;)System.out.print(i+" "+(1-i++));};
jouer au
@KevinCruijssen Qui fout l'espacement ...
Shaun Wild
1
Étant donné le temps infini, il imprimera chaque entier une quantité infinie de fois chacun.
Olivier Grégoire
4

C #, 83 octets

void f(){for(decimal n=0;;n++){Console.Write(n+",");if(n>0)Console.Write(-n+",");}}

Ungolfed:

void f()
{
  for (decimal n=0;;n++)
  {
    Console.Write(n + ",");
    if (n > 0) Console.Write(-n + ",");
   }
}

Les sorties:

0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6.......
Pete Arden
la source
Il y a pas mal de choses qui peuvent être faites pour réduire les caractères. D'abord, votre programme n'a pas besoin d'un espace de noms. Deuxièmement, le nom de la classe n'a pas besoin d'être aussi long. De plus, vous appelez console.writeline à deux reprises, ce qui peut être simplifié pour un délégué. Le while true peut être simplifié à aa pour (;;) et l’instruction if peut être supprimée en affichant la valeur zéro d’abord par le biais du délégué.
Nico
Merci. Je ne savais pas si un délégué pourrait "tricher"?
Pete Arden
Bonjour, bienvenue sur PPCG! Je pense que vous trouverez cela intéressant à lire: Conseils pour jouer au golf en C # . De plus, vous n’avez pas besoin d’un programme complet, vous avez juste besoin d’une fonction (sauf indication contraire du défi). Donc void f(){code_present_in_main}suffit pour le nombre d'octets. En ce qui concerne le code lui-même, vous pouvez en jouer un peu plus comme ceci: void f(){for(decimal n=1;;)Console.Write((1-n)+","+n+++",");}( 61 octets )
jouer au
1
Oh génial, c'est bien plus sain 85 maintenant, merci! Je ne me serais pas senti bien en utilisant toute votre réponse, mais c’est définitivement une amélioration et ces conseils aideront mon futur golf!
Pete Arden
@PeteArden Je comprends pour ne pas utiliser mon code, car c'est une approche différente. Hmm, vous pouvez toujours jouer au golf 2 octets dans votre propre réponse en plaçant le decimal n=0et n++;à l'intérieur de la boucle bien que: void f(){for(decimal n=0;;n++){Console.Write(n+",");if(n>0)Console.Write(-n+",");}}:)
Kevin Cruijssen
4

C # 86 66 octets

Nouvelle réponse:

void b(){for(var i=0;;i++)Console.Write(i==0?","+i:","+i+",-"+i);}

Clair:

void b() 
{
    for(var i=0;;i++)
        Console.Write(i == 0 ? "," + i : "," + i + ",-" + i);
}

Ancienne réponse (86 octets):

void a(){Console.Write(String.Join(",",Enumerable.Range(int.MinValue,int.MaxValue)));}

Ungolfed:

void a()
{
    Console.Write(String.Join(",", Enumerable.Range(int.MinValue, int.MaxValue)));
}
Daniel Lerps
la source
1
Il y a 2 espaces blancs inutiles. Un avant Enumerable.Rangeet un avant int.MaxValue.
Yytsi
1
Bienvenue chez PPCG! +1 Vous trouverez peut-être cela intéressant à lire: Astuces pour jouer au golf en C # . Dans votre ou vos réponses actuelles, les crochets de la boucle for peuvent être supprimés, car il ne contient qu'une seule ligne. Sinon, il s'agit d'une approche plus courte: void f(){for(var n=1;;)Console.Write((1-n)+","+n+++",");}( 57 octets ) .
Kevin Cruijssen le
@ KevinCruijssen Merci. Les paniers sont partis.
Daniel Lerps
4

J, 25 octets

([:$:1:`-`(1+-)@.*[echo)0

Fonctionne sur le site en ligne , mais je ne peux pas encore le vérifier sur ordinateur. Imprime des nombres comme:

0
1
_1
2
_2
3
_3
4

etc.

Conor O'Brien
la source
4

Powershell, 20 ans 19 18 octets

Amélioré en volant sans vergogne de la réponse de TimmyD

0;for(){-++$i;$i}

Sortie:

0
-1
1
-2
2
-3
3
-4
4

Ancienne version:

for(){-$i;$i++;$i}

Vous ne savez pas pourquoi tbh, mais - la variable non déclarée (ou - $ null) est évaluée à 0, ce qui nous a sauvé 2 octets dans cette version ...

peu importe
la source
1
Bienvenue chez PPCG!
AdmBorkBork le
4

Brachylog , 2 octets

ẉ⊥

Essayez-le en ligne!

ẉ     Print with a newline
      the input,
 ⊥    then try again.

Étant donné que le programme ne reçoit aucune entrée, la variable d'entrée du prédicat principal n'est pas contrainte. Au début, on suppose que c'est 0, mais quand l'exécution est réussie , elle retourne au seul point d'échec possible: le choix de la valeur pour la variable d'entrée. Alors, il essaie 1, et -1, et tous les autres entiers, en les imprimant séparés pour toujours par des nouvelles lignes car force toujours le retour en arrière, et l’effet de est immédiatement exécuté.

Chaîne non liée
la source