Rosnąć aż do 2017 roku

16

W tym wyzwaniu zbudujesz program, który rośnie wraz z upływem wieków… Aż do 2017 roku.

Wyzwanie

Ilekroć w opisie wyzwania jest napisane „program”, można również przeczytać „funkcja”.

Po przesłaniu dane wyjściowe wygenerują program o długości THE LENGTH OF YOUR SUBMISSION+ 1bajtów.

Gdy ten program zostanie wykonany, wyświetli program o długości THE LENGTH OF YOUR SUBMISSION+ 2bajtów… i tak dalej.

Jednak gdy program osiągnie długość 2017 bajtów, musi zamiast tego wyjść 2017i wyjść.

Zasady

  • Wynik końcowego programu musi być 2017i tylko 2017. To może być ciągiem lub liczbę całkowitą, ale musi to czytać 2017i nie 2017.0lub 0x7E1czy inne tego typu bzdury.
  • Brak standardowych luk .
  • Tylko twój początkowy program może wymagać danych wejściowych, które zostaną dodane do twojego bajtu.
    Więc jeśli twój program początkowy ma 324 znaki i zajmuje 13 bajtów, twój wynik będzie wynosił 324 + 13 = 337, a program przez niego wyprowadzony musi mieć 338 bajtów.
    • Używanie flag wiersza poleceń (np. perl -X) Jest jednak w porządku - o ile zarówno program początkowy, jak i wszystkie generowane programy używają tych samych flag. Również one liczą się do całkowitej liczby bajtów. Kreski, ukośniki itp. Przed flagą wiersza poleceń nie liczą się do sumy, więc np. perl -XLiczy się jako jeden dodatkowy bajt.
  • Jeśli zwrócisz funkcję, powinna to być funkcja rzeczywista, a nie ciąg znaków, który po ocenie tworzy funkcję.
  • Niewłaściwe quiny (jeśli twój program jest quine) są niedozwolone.

Przykład

Pseudokod, 99 bajtów

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

Twoje zgłoszenie może działać inaczej, o ile będzie zgodne z powyższymi zasadami.

użytkownik2428118
źródło
Czy tylko dodawanie NOP, takich jak ;;;dozwolone, jest dozwolone?
FlipTack
@FlipTack Tak. ·
user2428118
„Myślniki, ukośniki itp. Przed flagą wiersza poleceń nie liczą się do sumy, więc np. Perl -X liczy się jako jeden dodatkowy bajt.” - Czy jest to celowo sprzeczne z normą opisaną tutaj na Meta? Zwykle należy liczyć myślniki, ukośniki itp., W zależności od tego, jak wygląda wywołanie bez tej opcji: meta.codegolf.stackexchange.com/questions/273/…
hvd
@hvd Nie sądzę, że to przeczytałem, więc nie, to nie jest zamierzone. To powiedziawszy, nie sądzę, aby ignorowanie ich było bardzo szkodliwe, więc nie zmienię tego dla tego wyzwania.
user2428118

Odpowiedzi:

6

*> <> , 29 28 30 bajtów

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

Wypróbuj tutaj! (* spróbuj z 2017 bajtami )
* ustaw opóźnienie na 0ms lub być może będziesz musiał długo czekać

Dodaje to dodatkowe każde kolejne uruchomienie. Jeśli ma 2017 bajtów i jest uruchomiony, wygeneruje 2017 i zatrzyma wykonywanie bez innych danych wyjściowych.

Aktualizacja: Zapisano 1 bajt, sprawdzając, czy długość jest mniejsza niż 2017, a nie równa

Aktualizacja 2: Naprawiono wyjście dla +2 bajtów

Wyjaśnienie

" 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
źródło
tak, niezupełnie racja when your program has reached a length of 2017 bytes, nie 2016
Destructible Lemon
@DestructibleWatermelon naprawiono
redstarcoder
4

Python 2.7, 90 bajtów

Oto stosunkowo prosty:

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

Spróbuj pierwszej iteracji tutaj! Spróbuj tutaj przedostatniej iteracji! Wypróbuj ostatnią iterację tutaj!

Nie golfowany:

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
źródło
@redstarcoder Ostatnia iteracja ma dokładnie 2017 znaków.
Liczbę
Ach mój błąd, nie jestem pewien, jak to się stało, przepraszam!
redstarcoder
Możesz użyć p='';...i 1929else, ale pamiętaj, że drukowanie drukuje również nowy wiersz na końcu, więc powinieneś dodać końcowy znak nowej linii do swojego programu, w przeciwnym razie powiększy się o dwa bajty po pierwszym uruchomieniu.
mbomb007
2

Microscript II, 38 bajtów

{v{h}sl+s""+vK#s2017=(2017ph)lp"~"ph}~
SuperJedi224
źródło
1

> <> , 34 bajty

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

Wypróbuj online! Zauważ, że aby przetestować to dla mniejszych wartości, twoja wartość (minus 1) musi być możliwa do wygenerowania w 7 bajtach.

Wyjaśnienie

":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
źródło
1

Java, 251 bajtów (Eclipse IDE)

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();}}}//

Zakłada się, że projekt został wykonany w środowisku Eclipse, przy użyciu konwencji .javaplików w SRC działającego katalogu. Istnieją inne sposoby wykrycia źródła, ale nie sądzę, aby było to sprzeczne z regułami.

Zasadniczo otwiera kod źródłowy .java i dołącza As do 2017 r. (Po komentarzu). Gdy rozmiar pliku źródłowego osiągnie w sumie 2017 bajtów, zamiast tego zostanie wydrukowany 2017.

Urna Magicznej Ośmiornicy
źródło
1

C, 197 bajtów

#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
źródło
1

Python 2, 217 167 78 bajtów

Zauważ, że powinna pojawić się nowa linia. Użyłem podobnych koncepcji do tego, co użył Calconym, więc dziękuję za inspirację!

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

Wypróbuj online

Spróbuj w 2016 roku ; Wypróbuj w 2017 roku


Poprzednia wersja:

Ten program używa inspectmodułu do uzyskania bieżącego numeru linii. Następnie drukuje się sam z dodatkową linią po imporcie, która zmienia numer linii dla następnego programu. Powinien tu również znajdować się nowy wiersz.

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

Wypróbuj online

mbomb007
źródło
1

CJam , 39 33 30 bajtów

33q:X~

z wejściem

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

Wypróbuj online!

Jest to funkcjonalnie równoważne z moją poprzednią wersją, z tym wyjątkiem, że unika potrzeby pisania i unikania cudzysłowów. Poprzednia wersja:

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

Które wyjścia

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

które wyjścia

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

i tak dalej. Wreszcie program

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

Wyjścia 2017.

Jak to działa

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

Ale co właściwie robi kod na wejściu?

 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)

Jeśli pierwsza liczba programu nie jest równa 2017, to wypisze program, w którym liczba ta zostanie zwiększona jeszcze raz, niż była tym razem. Jeśli ma wartość równą 2017 r. (Tzn. Została zwiększona 1984 razy), po prostu pchnij 2017 i zakończ. Pierwszy numer zaczyna się od 33 (długość kodu); każdy przyrost zwiększa długość kodu o 1 ORAZ tę liczbę o 1, więc gdy liczba 33 zostanie zwiększona na tyle, aby stać się 2017, kod będzie również miał długość 2017 bajtów.

Business Cat
źródło
0

JavaScript, 98 83 bajty

To było spore wyzwanie… Zgaduję, że otrzymałem to, że wymagałem zwrotu rzeczywistych funkcji, a nie tylko źródła funkcji.

Oryginalna funkcja

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

Używam functionzamiast =>tutaj, ponieważ ten ostatni nie obsługuje nazwanych funkcji, po prostu przypisując funkcje anonimowe do zmiennej.

Pierwsza iteracja

Uruchomienie powyższego w konsoli przeglądarki zwraca funkcję, która po rzutowaniu na ciąg wygląda następująco:

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

Dostać się do 2017 roku

Ponieważ każda funkcja zwraca nową funkcję, możesz wywołać oryginalną funkcję / jej wynik 1934 razy, aby uzyskać 2017 .

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

Testowane z Firefoksem.

użytkownik2428118
źródło