Grandir jusqu'à 2017

16

Dans ce défi, vous construirez un programme qui grandit au fil des âges… jusqu'à 2017.

Défi

Chaque fois que cette description de défi indique «programme», vous pouvez également lire «fonction».

Votre soumission, une fois exécutée, générera un programme de THE LENGTH OF YOUR SUBMISSION+ 1octets.

Lorsque ce programme est exécuté, il affichera un programme de THE LENGTH OF YOUR SUBMISSION+ 2octets de long… et ainsi de suite.

Cependant , lorsque votre programme a atteint une longueur de 2017 octets, il doit à la place sortir 2017et quitter.

Règles

  • Le résultat du programme final doit être 2017et seulement 2017. Il peut s'agir d'une chaîne ou d'un entier, mais il doit lire 2017et non 2017.0ou 0x7E1un autre non-sens.
  • Pas de failles standard .
  • Seul votre programme initial est autorisé à nécessiter une entrée, qui sera ajoutée à votre bytecount.
    Donc, si votre programme initial comporte 324 caractères et prend une entrée de 13 octets, votre score total sera de 324 + 13 = 337 et le programme émis par celui-ci doit être de 338 octets.
    • L'utilisation d'indicateurs de ligne de commande (par exemple perl -X) est très bien, cependant - tant que votre programme initial ainsi que tous les programmes générés utilisent les mêmes indicateurs. De plus, ils comptent également dans le total des octets. Les tirets, les barres obliques, etc. devant un drapeau de ligne de commande ne comptent pas dans le total, par exemple, perl -Xcompte comme un octet supplémentaire.
  • Si vous renvoyez une fonction, il doit s'agir d'une fonction réelle et non d'une chaîne qui, lorsqu'elle est évaluée, produit une fonction.
  • Les quines incorrects (si votre programme est un quine) sont interdits.

Exemple

Pseudocode, 99 octets

IF (PROGRAM LENGTH == 2017)
  PRINT 2017
ELSE
  PRINT (THE SOURCE OF THIS PROGRAM + 1 BYTE PADDING)

Votre soumission peut fonctionner différemment, tant qu'elle respecte les règles ci-dessus.

user2428118
la source
L'ajout de NOP est-il uniquement ;;;autorisé?
FlipTack
@FlipTack Oui. ·
user2428118
"Les tirets, les barres obliques, etc. devant un drapeau de ligne de commande ne comptent pas dans le total, donc par exemple perl -X compte comme un octet supplémentaire." - Est-ce intentionnellement contraire à la norme décrite ici sur Meta? Normalement, les tirets, les barres obliques, etc. doivent parfois être comptés, selon l'apparence de l'invocation sans cette option: meta.codegolf.stackexchange.com/questions/273/…
hvd
@hvd Ne pensez pas que je l'ai lu, alors non, ce n'est pas intentionnel. Cela dit, je ne pense pas qu'il y ait beaucoup de mal à les ignorer, donc je ne le changerai pas pour ce défi.
user2428118

Réponses:

6

*> <> , 29 28 30 octets

" r::2+l'-':*7-(?ul1-n;Ol?!;ou

Essayez-le ici! (* essayez avec 2017 octets )
* réglez le délai à 0 ms ou vous devrez peut-être attendre longtemps

Cela ajoute une exécution supplémentaire à chaque sous-séquence. S'il a 2017 octets et est exécuté, il affichera 2017 et arrêtera l'exécution sans aucune autre sortie.

Mise à jour: enregistré 1 octet en vérifiant si la longueur est inférieure à 2017 au lieu d'être égale

Mise à jour 2: sortie fixe pour +2 octets

Explication

" r: 2+                         build quine
    :                           copy extra " "
       l                        push length to stack
        '-':*7-                 push "2018" to stack
               (?u     O        if not length < 2018:
                  l1-n;           output length-1 and exit
                       Ol?!;ou  output entire stack and exit
redstarcoder
la source
oui, pas tout à fait raison when your program has reached a length of 2017 bytes, pas 2016
Destructible Lemon
@DestructibleWatermelon fixed
redstarcoder
4

Python 2.7, 90 octets

En voici une relativement simple:

p='q';s=r"p+='q';print('p=\''+p+'\';s=r\"'+s+'\";exec s')if len(p)<1929 else'2017'";exec s

Essayez la première itération ici! Essayez l'avant-dernière itération ici! Essayez l'itération finale ici!

Non golfé:

p='q'      # The length of string p is the number of iterations so far.

s=r"p+='q';print('p=\''+p+'\';s=r\"'+s+'\";exec s')if len(p)<1928 else'2017'"

exec s     # s contains the source code, but also contains a line saying "p += 'q'",
           # which makes the byte count longer. When the length of p is 1928 (i.e. when the
           # entire program is 2017 bytes long), 2017 is printed instead.
Calconym
la source
@redstarcoder L'itération finale contient exactement 2017 caractères. Vous pouvez voir le nombre d'octets dans le coin supérieur droit, je pense ....
Calconym
Ah mon erreur, je ne sais pas comment cela s'est produit, désolé!
redstarcoder
Vous pouvez utiliser p='';...et 1929else, mais notez que l'impression imprime également une nouvelle ligne à la fin, vous devez donc ajouter une nouvelle ligne à votre programme, sinon elle augmente de deux octets après la première exécution.
mbomb007
2

Microscript II, 38 octets

{v{h}sl+s""+vK#s2017=(2017ph)lp"~"ph}~
SuperJedi224
la source
1

> <> , 34 octets

":l' '95**)b*f3++0.1-}'#'r>o<:ln;#

Essayez-le en ligne! Notez que, pour tester cela pour des valeurs plus petites, votre valeur (moins 1) doit pouvoir être générée en 7 octets.

Explication

":l' '95**)b*f3++0.1-}'#'r>o<:ln;#
".................................   push this string
 :                                   duplicate
  l                                  push length of stack
   ' '95**                           push 2016
          )                          1, if length > 2016, 0 otherwise
           b*                        multiply by 11
             f3++                    add 18
                 0.                  jump to that character on this line
                                     if the length is sufficiently long, this skips the
                                     next 10 characters, to the 11th (`b` from earlier):
                             :ln;    (if length is > 2016)
                             :         duplicate
                              l        push length
                               n       output as number
                                ;      terminate
                   1-}'#'r>o<        (if length <= 2016)
                   1-                  subtract 1 from the last char, `#`, to get `"`,
                     }                 which is then moved to the bottom
                      '#'              pushes `#` (will be appended)
                         r             reverses the stack
                          >o<          output stack, until error (accepted by default)
                                 #   This is never reached, but is used to generate `"`
Conor O'Brien
la source
1

Java, 251 octets (IDE Eclipse)

import java.io.*;class G{public static void main(String[]args) throws Exception{File x=new File("./src/G.java");if(x.length()==2017){System.out.print("2017");}else{PrintWriter y=new PrintWriter(new FileOutputStream(x,1>0));y.print("A");y.close();}}}//

Cela suppose que le projet a été réalisé dans Eclipse, en utilisant la convention de .java fichiers dans le SRC du répertoire de travail. Il existe d'autres moyens de détecter où se trouve la source, mais je ne pense pas que ce soit contraire aux règles.

Ouvre essentiellement le code source .java et l'ajoute jusqu'en 2017 (après un commentaire). Lorsque la taille de fichier de la source atteint un total de 2017 octets, elle imprimera à la place 2017.

Urne de poulpe magique
la source
1

C, 197 octets

#define A ""
char*s="#define A %c %s%c%cchar*s=%c%s%c;%cmain(){printf(sizeof A==1820?%c2017%c:s,34,A,34,10,34,s,34,10,34,34);}";
main(){printf(sizeof A==1820?"2017":s,34,A,34,10,34,s,34,10,34,34);}
Giacomo Garabello
la source
1

Python 2, 217 167 78 octets

Notez qu'il devrait y avoir une nouvelle ligne de fin. J'ai utilisé des concepts similaires à ceux utilisés par Calconym, alors merci pour l'inspiration!

p='q';s='p+=p[0];print"p=%r;s=%r;exec s"%(p,s)if len(p)<1941else 2017';exec s

Essayez-le en ligne

Essayez en 2016 ; Essayez en 2017


La version précédente:

Ce programme utilise le inspectmodule pour obtenir le numéro de ligne actuel. Ensuite, il s'imprime mais avec une ligne supplémentaire après l'importation, ce qui modifie le numéro de ligne pour le programme suivant. Il devrait également y avoir une nouvelle ligne de fin ici.

from inspect import*
n=stack()[0][2];s='from inspect import*%sn=stack()[0][2];s=%r;print(s%%(chr(10)*n,s))if n<1852else 2017';print(s%(chr(10)*n,s))if n<1852else 2017

Essayez-le en ligne

mbomb007
la source
1

CJam , 39 33 30 octets

33q:X~

avec l'entrée

2017:N=N{33')X+`":X~"+}?

Essayez-le en ligne!

Ceci est fonctionnellement équivalent à ma version précédente, sauf qu'il évite d'avoir à écrire et à échapper les guillemets. La version précédente:

33"2017:N=N{33')X+`\":X~\"+}?":X~

Quelles sorties

33")2017:N=N{33')X+`\":X~\"+}?":X~

qui sort

33"))2017:N=N{33')X+`\":X~\"+}?":X~

etc. Enfin, le programme

33"))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))2017:N=N{33')X+`\":X~\"+}?":X~

Sorties 2017.

Comment ça fonctionne

33      Push 33
  q     Read the input: 2017:N=N{33')X+`":X~"+}?
   :X   Store it in variable X
     ~  Eval it

Mais que fait réellement le code dans l'entrée?

 2017:N                      Push 2017 and store it in N
       =                     Check if the other number (33 on first run) equals 2017
        N                     If it does, push 2017
         {                    Else, execute this block:
          33                   Push 33
            ')                 Push the ) character
              X                Push X
               +               Concatenate with ')
                `              String representation (wraps it in quotes, escapes quotes inside)
                 ":X~"       Push the string ":X~"
                      +      Concatenate
                       }?    (end of block)

Si le premier numéro du programme n'est pas égal à 2017, il affichera un programme dans lequel ce nombre est incrémenté une fois de plus qu'il ne l'était cette fois. Si elle est égale à 2017 (c'est-à-dire qu'elle a été incrémentée 1984 fois), appuyez simplement sur 2017 et terminez. Le premier nombre commence par 33 (la longueur du code); chaque incrément augmente la longueur du code de 1 ET ce nombre de 1, donc lorsque 33 a été suffisamment incrémenté pour devenir 2017, le code aura également une longueur de 2017 octets.

Chat d'affaires
la source
0

JavaScript, 98 83 octets

C'était tout un défi… Je suppose que c'est ce que j'obtiens pour exiger le retour de fonctions réelles et pas seulement la source de la fonction.

Fonction originale

function x(){return "3".length>1933?2017:Function(`return ${x}`.replace(/3/,33))()}

J'utilise à la functionplace d' =>ici car ce dernier ne prend pas en charge les fonctions nommées, il suffit d'assigner des fonctions anonymes à une variable.

Première itération

L'exécution de ce qui précède dans la console de votre navigateur renvoie une fonction qui, lorsqu'elle est convertie en chaîne, ressemble à:

function x(){return "33".length>1933?2017:Function(`return ${x}`.replace(/3/,33))()}

Se rendre en 2017

Étant donné que chaque fonction renvoie une nouvelle fonction, vous pouvez appeler la fonction d'origine / son résultat 1934 fois pour obtenir 2017 .

console.log((
function x(){return "3".length>1933?2017:Function(`return ${x}`.replace(/3/,33))()}
)()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
)

Testé avec Firefox.

user2428118
la source