Napisz prostokątny blok tekstu, który po ułożeniu w dywanie Sierpińskiego , używając bloków o tej samej wielkości dla pustych części, tworzy program, który wyświetla numer iteracji dywanu.
Na przykład, jeśli masz blok tekstowy
TXT
BLK
następnie uruchom program
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
powinien wyjść, 1
ponieważ kształt programu reprezentuje pierwszą iterację dywanu Sierpińskiego.
Podobnie działa
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
powinien wypisać 2, ponieważ jest to kształt drugiej iteracji dywanu Sierpińskiego.
Uruchamianie bloku tekstu bez zmian
TXT
BLK
powinien generować, 0
ponieważ można to uznać za iterację zerową.
Powinno to działać dla wszystkich dalszych iteracji. (Przynajmniej teoretycznie, zakładając, że komputer ma pamięć i wszystko.)
Detale
- Programy nie mogą czytać ani uzyskiwać dostępu do informacji o kodzie źródłowym. Traktuj to jak surowe wyzwanie quine.
- Dane wyjściowe trafiają do standardowej lub podobnej alternatywy. Podaj tylko liczbę i opcjonalny znak nowej linii. Brak danych wejściowych.
- Blok tekstowy może zawierać dowolne znaki, które nie są uważane za terminatory linii . Blok tekstowy może zawierać spacje.
- „Pusta przestrzeń” na dywanie musi składać się wyłącznie ze znaków spacji .
- Opcjonalnie możesz założyć, że wszystkie programy mają końcowy znak nowej linii.
Możesz użyć tego fragmentu stosu do wygenerowania dywanu dla danego bloku tekstu w dowolnej iteracji:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
Punktacja
Zwycięzcą jest zgłoszenie, którego początkowy blok tekstowy jest najmniejszy pod względem obszaru (szerokość razy wysokość). TXT\nBLK
Przykładem jest 3 od 2 do 6. (wynik w zasadzie najkrótszej wygranych kod, tym samym znacznikiem kod golfa).
Tiebreaker przechodzi do zgłoszenia, w którym w bloku tekstu jest najmniej różnych znaków. Jeśli nadal jest remis, odpowiedź opublikowana jako pierwsza wygrywa.
źródło
Perl, 30 (15 × 2)
Przede wszystkim zamierzam twierdzić, że 10 iteracji to rozsądny limit, a nie 2 32 . Po 10 iteracjach program składający się z N bajtów zostanie rozszerzony do ( N × 3 20 ) bajtów (plus podział wiersza), co stanowi ponad 3 gigabajty nawet dla N = 1. Architektura 32-bitowa byłaby całkowicie niezdolna do obsługi 11 iteracji. (I oczywiście nie ma wystarczającej liczby cząstek we wszechświecie dla 2 32 iteracji).
Oto moje rozwiązanie:
Działa to poprzez inkrementację zmiennej
$n
w pierwszym wierszu i obliczanie jej logarytmu na każdym kroku. Drugi wiersz wypisuje całkowitą część tego logarytmu i kończy pracę.Prosty logarytm do podstawy e (2.718 ..) jest wystarczająco blisko, aby dać poprawne wyniki dla pierwszych 10 iteracji.
źródło
Golfscript, 9 * 2 = 18
(Zauważ, że pierwsza linia ma końcowe spacje, aby była prostokątna)
Nie mogłem znaleźć funkcji dziennika dla Golfscript, więc
base
musiałem to zrobić.Golfscript zaczyna się od pustego łańcucha, więc
0+
po prostu zwiększa długość łańcucha o 1 (przez skręcenie). Zanim skończy się pierwsza linia, stos będzie miał ciąg długości3^n
, który przyjmujemy logarytmiczną podstawę 3 przed super komentarzem.n
jest następnie automatycznie drukowany.źródło
,
drugą linię. Pierwsza linia0or)
:; druga linia3base,(}
. Drugim oczywistym celem jest(
druga linia. Jest to trudniejsze, ale można je również usunąć, zastępując pierwszą linię1+~abs(
prostokątem 7 * 2.C, 12 x 8 = 96
Zainspirowany przez @ciamej, zmniejszyłem go. Wykorzystuje dzielenie przez 3 lewę, a także świadomość, że dywan skutecznie przekształca pętlę if w pętlę while.
Kod został przetestowany na gcc / Ubuntu dla iteracji do 3.
Poprzednie rozwiązanie: C, 11x12
Nie jest zwycięzcą, ale hej, to C.
Znajduje log2 liczby bloków poprzez przesunięcie bitów, a następnie używa magicznych liczb i obcięcia do oszacowania log3. Matematyka powinna działać do 26 iteracji (liczba 42-bitowa).
źródło
CJam, 9 bajtów
Pomysł użycia
]
pochodzi z Optymalizatora, ale używa zupełnie innej metody liczenia.Wypróbuj online
Jak to działa:
Dwa inne 9-bajtowe rozwiązania
źródło
Python 2, 15 * 3 = 45
Kolejna implementacja pomysłu liczenia pierwszego rzędu, a następnie logowania trzy i wyjścia. Prawdopodobnie można jeszcze grać w golfa nieco więcej.
źródło
bc, 2 * 16 + 1 = 33
Dodatkowe +1 w wyniku wynika z tego, że
-l
wymagana jest opcja bc:źródło
Golfscript, 7 * 2 = 14
To jest inspirowana przez SP3000 za odpowiedź , aw szczególności poprzez dążenie do optymalizacji długą drugą linię.
3base,
jest tak krótki, jak logarytm bazowy 3 otrzyma w GS, a super komentarz}
jest wyraźnie optymalny.W pierwszym wierszu wymagane jest odwzorowanie pustego ciągu
''
od początkowej wartości standardowej na 0, a następnie odwzorowanie każdej nieujemnej liczby całkowitej na jej następcę. W ten sposób kończymy pierwszą linię3^n - 1
na stosie i3base,
nie wymagamy żadnego zmniejszenia.źródło
C, 13 x 8
źródło
Perl, 76
Wiem, że opublikowanie tego prawdopodobnie nie ma większego sensu, ponieważ zostało już całkowicie pobite, ale oto moje obecne rozwiązanie.
źródło
> <> (Ryby), 12 * 3 = 36
Bardziej proste rozwiązanie> <>:
Najpierw uruchamiamy górny rząd górnych bloków.
'v'00p
ustawiav
pierwszą pozycję całego programu, kierując wskaźnik programu w dół, gdy wraca do początku po osiągnięciu końca linii. Wcześniej każdy blok wypycha na niego 0 i długość stosu + 1. (stos będzie0 2 0 4 0 6 ...
)W pierwszej połowie drugiej i trzeciej policzymy, ile razy możemy podzielić górny element stosu, zanim otrzymamy 2 (przechowujemy to w elemencie od drugiego do górnego).
Na koniec wyprowadzamy element od drugiego do górnego stosu.
źródło
Lua, 3 * 17 = 51
Taka sama strategia jak większość ludzi:
źródło
PHP, 22 × 2 = 44
27 × 2 = 54Kolejne podejście do wylogowania. Niezbyt mały, ale mój pierwszy golf;)
źródło