Twoim zadaniem jest napisanie programu o równej długości , który drukuje kwadrat ASCII-art (opisany poniżej), który zwiększa jego długość boku o 1 jednostkę za każdym razem, gdy oryginalny kod źródłowy jest wklejany w środku bieżącego kodu.
Bardzo trudno jest mi bardzo dobrze zdefiniować to zadanie, dlatego dam wam przykład:
Powiedzmy, że twój początkowy kod był
CODE
i że został wydrukowany:0
Następnie wstaw
CODE
w środku: kod staje sięCOCODEDE
i powinien zostać wydrukowany:00 00
Ponownie wstaw
CODE
w środku: kod staje sięCOCOCODEDEDE
i powinien zostać wydrukowany:000 000 000
I tak dalej. Twoja odpowiedź powinna teoretycznie zadziałać po dowolnej liczbie iteracji, ale rozumiem, czy z powodu ograniczeń wydajności językowej nie można rozsądnie przekroczyć określonego progu.
Niektóre zasady:
Możesz użyć dowolnego drukowalnego ASCII (32-127) jako znaku używanego dla twojego kwadratu. Twój wybór musi być stały (powinieneś używać tego samego znaku dla każdej iteracji).
Początkowy kwadrat wyjściowy musi mieć długość boku 1 .
Kwadrat ascii-art jest zdefiniowany jako ciąg z N liniami (oddzielonymi liniami N-1 linii / znaków nowej linii), a każda linia zawiera N kopii wybranego znaku.
Twoje dane wyjściowe nie mogą zawierać żadnych obcych znaków innych niż końcowy znak nowej linii.
Możesz użyć wartości domyślnych dla wejścia i wyjścia (programy lub funkcje są dozwolone, ale fragmenty nie są).
Środkowy o kodzie jest zdefiniowany jako punkt, gdzie kod źródłowy może być podzielona na dwie części tak, że dwie są równe.
Twoje odpowiedzi zostaną ocenione według długości oryginalnego programu , w bajtach. Wygrywa najniższa liczba bajtów. W przypadku remisu odpowiedź przesłana wcześniej wygrywa.
Możesz użyć tego programu do zastosowania wstawek bez konieczności robienia tego ręcznie.
Odpowiedzi:
Pyth , 2 bajty
Wypróbuj online! Spróbuj także dwukrotnie , trzykrotnie !
Jak to działa?
\n
to polecenie, które wypisuje swój argument na końcu nowej linii, jednocześnie zwracając go . Tak więc, za każdym razem, gdy wstawiasz, zamieniasz literał całkowitą 5 na liczbę zawierającą N kopii 5 połączonych, a wiodące znaki nowej linii w zasadzie upewniają się, że drukowana jest odpowiednia liczba razy, dzięki czemu jest kwadratowa.źródło
JavaScript (ES6),
423230 bajtówDruga iteracja:
Działa to poprzez dołączanie a
0
dos
każdorazowego uruchomienia pierwszej połowy kodu i drukowanies
się za każdym razem, gdy uruchamiana jest druga połowa. Wykorzystuje cztery dziwactwa JavaScript:this
. To pozwala nam zrobićthis.s
zamiasts
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
jest konwertowana na pusty ciąg znaków, co oznacza, że[undefined] + 0 === "0"
.Podsumowując, oznacza to, że możemy wyrazić pierwszą połowę (generowanie ciągu zer) w zaledwie 13 bajtach. Jeśli użycie
alert
zamiastconsole.log
jest dozwolone, możemy zaoszczędzić 4 bajty, skracając drugą połowę.źródło
05AB1E , 2 bajty
Wypróbuj online!
Port mojej odpowiedzi na Pythona .
źródło
Python 2 ,
423828 bajtówWypróbuj online! . Możesz także wypróbować drugą i trzecią iterację
źródło
Python 2 , 22 bajty
Wypróbuj online!
Podwojony:
Zauważ, że druga połowa zaczyna się od znaku nowej linii.
źródło
C (gcc) ,
17016896807270 bajtówZnacznie krótsza wersja. Nadal chciałbym znaleźć rozwiązanie bez preprocesora.
Wypróbuj online!
Stara 168 bajtowa wersja:
Wypróbuj online!
źródło
Python 2 , 30 bajtów
Wypróbuj online! , 2. i 3. iteracja
To sprawia, że korzystać z faktu, że bools w Pythonie są zasadniczo ints i nazwiska
False
iTrue
były ponownie przypisać w Pythonie 2.Python 1 , 32 bajty
Wypróbuj online! , 2. i 3. iteracja
W Pythonie 1 struny wbudowanych
exit
iquit
istniał do informowania użytkownika o interaktywnej powłoki jak to wyjść. Wartość domyślna to"Use Ctrl-D (i.e. EOF) to exit."
.źródło
n=False+=1;print'*'*n;
, ale ciągle zapominam, że to nie jest funkcja Pythona ...Węgiel , 6 bajtów
Wypróbuj online! Wyjaśnienie:
υ
kończy się na długości liczby powtórzeń.źródło
Haskell , 68 bajtów
Wypróbuj online raz , dwa lub trzy razy .
Ze względu na lenistwo Haskella wyrażenie takie jak powyższe liczy się jako funkcja, która nie przyjmuje żadnych argumentów, jak na to pytanie Meta .
źródło
pieprzenie mózgu ,
4434 bajtówprzekreślone 44 jest nadal regularne 44; (
Wypróbuj online!
Spróbuj podwoić , potroić . Spójrz, bez wyściółki!
Drukuje kwadraty
U
. Dzieli się w połowie 10+
sekund.źródło
Rubinowy, 18 bajtów
Wypróbuj online! Podwojony! Trzykrotnie!
źródło
Brain-Flak , 74 bajty
Wypróbuj online!
Spróbuj podwoić i potroić .
Wyjaśnienie
Punkt przerwania znajduje się pośrodku
<>
sekcji „push 10”. Zerwanie tego spowoduje pozostawienie 5 na trzecim stosie, aż dojdziemy do odpowiedniej drugiej połowy, w którym to momencie pchanie 10 wznawia się tam, gdzie zostało przerwane.Chociaż możliwe jest wypchnięcie drukowanej wartości ASCII (spacji) do 22 bajtów, spowodowałoby to, że centrala
<>
byłaby wykonywana po wypchnięciu5
. Dodając jeszcze dwa bajty, byłem w stanie przenieść<>
tak, że cały postęp w kierunku pchania10
był na trzecim stosie. Jako bonus, to również sprawiło, że powstały kwadrat był bardziej estetyczny.źródło
tinylisp , 112 bajtów
Wypróbuj online! Również dwukrotnie i pięciokrotnie .
Podejście „buduj łańcuch w pierwszej połowie, drukuj w drugiej połowie”, że wiele języków używa, nie będzie działać w tinylisp, ponieważ nie ma zmiennych zmiennych. Zamiast tego wykonujemy poważne zagnieżdżanie kodu.
Po wstawieniu drugiej kopii kodu jest on umieszczany wewnątrz
(q())
, który zawija go na liście. Następnie(h(t(t(h(t(...))))))
przechodzi do tej listy do następnej części(d N
.(v(...))
ocenia to; następnie przekazujemy ją do funkcji bez nazwy(q((x)(i x(inc x)1)))
, która zwiększa wynikową wartość, jeśli jest liczbą, i zwraca 1, jeśli jest to pusta lista. Ostateczny wynik w najbardziej zagnieżdżonej wersji kodu jest przypisany doN
. Zasadniczo stworzyliśmy dziwny rodzaj rekurencji, który liczy liczbę poziomów zagnieżdżenia.Druga połowa kodu tworzy następnie ciąg
N
gwiazdek, następnie listęN
takich ciągów, a następnie dołącza się do listy w nowej linii. Wynik jest wyświetlany z końcowym znakiem nowej linii.źródło
R , 44 bajty
Wypróbuj online!
Drukuje z końcowym znakiem nowej linii. To
T=TRUE*TRUE+12
po prostu podbić długość.Spróbuj podwoić i spróbuj potroić .
źródło
F=F+1;T=TRUE*TRUE+12#
<newline>write(strrep(1,F),"")
Julia 0.6 , 29 bajtów
Wszystkie moje pomysły były dłuższe niż dostosowanie sprytnego rozwiązania pythonowego xnor.
Staje się
Wypróbuj online!
źródło
SNOBOL4 (CSNOBOL4) ,
13068 bajtówTeraz bez komentarzy! Zobacz historię edycji, aby uzyskać wyjaśnienie starego algorytmu.
Wypróbuj online!
Spróbuj podwoić i potroić
Wyjaśnienie:
Ponieważ
END
etykieta jest wymagana i wszystko po pierwszejEND
etykiecie jest ignorowane, otrzymujemy dwie zalety tego wyzwania:X
razy dlaX
powtórzeńSugeruje to, że używamy powtórzeń w pierwszej połowie, a następnie możemy zastosować bardziej „konwencjonalne” podejście do etykietowania, aby powtórzyć
X
czasy wyjściowe .Pierwsza połowa to
który, po powtórzeniu, zwiększa
X
odpowiednią liczbę razy i tworzyARRAY
A
indeksy od1
doX
i gdzie każdy elementA
ciągu jest1
powtarzanyX
razy.Następnie, bez względu na to, ile razy program się powtarza, interpreter widzi tylko:
który jest typowym programem SNOBOL, który drukuje elementy
A
pojedynczo, aż indeks przekroczy limit, a następnie kończy działanie programu.;
jest opcjonalnym zakończeniem linii zwykle zarezerwowanym dla jednowierszowychEVAL
lubCODE
instrukcji, które dość starannie zwiększają liczbę bajtów do 68 i oznaczają punkt w połowie, pozwalając na dołączenie tam kodu.źródło
shortC ,
5644 bajtów-12 bajtów: poczekaj, używam shortC, dlaczego nie użyć skróconych rzeczy w C.
Użyłbym standardowego C, ale to wymaga
}
na końcu bałaganu z replikacją. shortC wstawia go domyślnie w EOF.źródło
Perl 5 , 25 bajtów
24 bajtowy kod + 1 dla
-p
.Doceń, że możesz nie chcieć zezwalać na flagi linii poleceń. Daj mi znać, jeśli nie jest to poprawne.
Wypróbuj online!
źródło
Zsh , 10 bajtów
Wypróbuj pełny pakiet testowy online!
... tak, to jest trochę lepsze. Dołącz do ciągu N razy, a następnie wydrukuj N razy. Okazuje się, że
<<<foo<<<foo
działa dobrze.Zsh , 64 bajty
Zastosowana postać:
(spacja).
Wypróbuj pełny pakiet testowy online!
Punkt środkowy znajduje się między drugą
E
a następującą po nim nową linią. Heredoc zakończy się, gdy pojawi sięE
sam wiersz, co dzieje się w samym środku kodu.źródło
s+=0;<<<$s