Napisz program, który wyjdzie
Do not repeat yourself!
Twój kod programu musi przestrzegać następujących ograniczeń:
- jego długość musi być liczbą parzystą
- każdy znak na pozycji
2n
(gdzien
liczba całkowita> 0) musi być równy znakowi na pozycji2n-1
. Drugi znak programu jest równy pierwszemu, czwarty jest równy trzeciemu itd.
Nowe linie liczą się jako znaki!
To jest golf golfowy, więc wygrywa najkrótszy kod!
Przykłady
HHeellllooWWoorrlldd
jest prawidłowym programem
123
lub AAABBB
lub HHeello
są niepoprawne
Weryfikacja
Za pomocą tego skryptu CJam można sprawdzić, czy kod źródłowy jest prawidłowy. Wystarczy wkleić kod w polu „Input” i uruchomić skrypt.
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
to byłaby poprawna odpowiedź w TriggerOdpowiedzi:
Sześciokąty ,
166126124 bajtówWstawienie niejawnych zakazów i białych znaków odpowiada następującemu kodowi źródłowemu:
Jestem pewien, że można to jeszcze bardziej skrócić, a może nawet rozwiązać to z boku o długości 6, ale robi się to trudne ...
Jak to działa
Schemat wygenerowany przy użyciu Sześciokąta Colorer Timwi .
Kod jest całkowicie liniowy. Na
\
samym początku przekierowuje adres IP na przekątną, tak że nie musimy się w ogóle martwić o podwojone znaki. Kolorowe ścieżki są wykonywane w kolejności pomarańczowy / czerwony, niebieski / szary, zielony, fioletowy (gdy są dwie ścieżki tego samego koloru, najpierw wykonuje się ścieżkę po lewej stronie, a następnie owija się ją po prawej).Jeśli zignorujemy brak operacji, mirrory i polecenia, które są nadpisywane przez innych, kod liniowy sprowadza się do tego:
Litery w Hexagony po prostu ustawiają bieżącą wartość krawędzi pamięci na kod literowy litery.
;
drukuje bieżącą krawędź pamięci jako znak. Używamy&
do resetowania krawędzi pamięci0
i drukowania miejsca za pomocą32;
.}
przesuwa się na inną krawędź, abyśmy mogli zapamiętać32
kolejne miejsca. Reszta kodu po prostu drukuje litery na nowej krawędzi i od czasu do czasu przesuwa się tam iz powrotem,';}
aby wydrukować spację. Na koniec ponownie przechodzimy do krawędzi spacji za pomocą'
, zwiększamy wartość do 33 za pomocą)
i drukujemy wykrzyknik.@
kończy program.źródło
;
, absolutnie nie ma ponownego użycia między parami znaków w kodzie. Obecny kod jest właściwie pierwszą rzeczą, jaka przyszła mi do głowy, więc myślę, że jeśli spróbuje się wystarczająco mocno, powinno być możliwe znalezienie znacznie bardziej skomplikowanego rozwiązania, które ponownie użyje średników, a może nawet liter, aby pasowały na bok długości 6.;
tylko raz, ponieważ nie może przechodzić przez nie w poziomie. W;
twoim kodzie są tylko 23 s i tylko 6 powtórzeń znaków (2 × o, 1 × t, 1 × r, 2 × e), co daje tylko 29. Osobiście to bardziej niż przekonuje mnie, że rozmiar 6 jest niemożliwy .. ,GolfScript,
1308476 bajtówWypróbuj online w Web GolfScript .
Jak to działa
Interpreter GolfScript rozpoczyna się od umieszczenia pustego łańcucha na stosie.
Łączenie tablicy z ciągiem spłaszcza się, więc wynikiem jest pożądany wynik.
źródło
Unary , ~ 1,86 × 10 222
Proste pieprzenie mózgu -> jednoznaczna odpowiedź. Bardzo nieoptymalne;).
Program składa się z parzystej liczby zer; konkretnie:
z nich.
Oryginalny kod pieprzenia mózgu:
źródło
1
s w programie Unary, który generuje żądany ciąg. Drugi blok kodu to program BF, który został użyty do jego wytworzenia. Ponieważ program Unary jest całkowicie wykonany z1
s, w trywialny sposób spełnia wymóg powtórzenia.Rubinowy -
210014281032820670 bajtówZakłada się, że wyjście może być wartością zwracaną z funkcji (nie określono, że wyjście musi być do STDOUT)
Kod:
Sztuką jest zbudowanie ciągu z pustego ciągu
""
przy użyciu operacji dołączania<<
i kodów ASCII znaków.Aby uzyskać liczby dla kodów ASCII, próbuję rozłożyć liczbę na wartości, które mogę łatwo wygenerować. Na przykład ASCII
90
jest po prostu88+1+1
:88
sam jest w porządku11**00
jest11^0
, co jest po prostu1
Na szczęście jedno
++
i drugie--
oznaczałobyadd
rubin, więc mogę pisać90
jako88++11**00++11**00
Jest kilka sztuczek, aby łatwiej dostać się do niektórych liczb niż dodawanie 1, oto kod, którego używam do wygenerowania powyższego (który obejmuje wszystkie mapowania, których używam):
Nadal myślę o innych sztuczkach, aby zmniejszyć liczbę znaków wymaganych do uzyskania liczby.
Pamiętaj, że jeśli użyjesz
-rpp
flagi i dodaszpp
na początku kodu w następujący sposób:następnie dla dodatkowych 2 + 4 bajtów może to działać jako w pełni kompletny program, ale wypisze dodatkowy
"
przed i po wymaganym ciągu:Przykład:
źródło
pp
klejnot to podwójna litera ..."
znaki na wyjściu i 2. potrzeba-rpp
flagi (co nie jest podobne--rrpp
)> <> , 174 bajty
Na szczęście w pewnym sensie ograniczenie nie ma zastosowania w pionie. Jednak największym problemem jest to, że musimy podwoić każdą nową linię.
Kod, który działa z grubsza, wygląda następująco:
Zauważ, że program nie ma podwójnych spacji - w trybie łańcuchowym> <> wypycha spacje dla pustych komórek. Odwrotnie jednak oznacza to, że rozwiązanie wykorzystujące
g
(odczyt pojedynczej komórki z kodu źródłowego) byłoby trudniejsze, ponieważ przestrzenie w programie stają się NUL podczas odczytu.(Uwaga: Może być o 50 bajtów krótszy, jeśli zakończy się błędem , ale podoba mi się to w ten sposób.)
źródło
Sclipting ,
186146 bajtówŻeby było jasne, istnieją trzy linie kodu, z których środek jest pusty, ponieważ nowa linia musi zostać zduplikowana. Liczba bajtów oparta jest na kodowaniu UTF-16.
Wyjaśnienie
Blok koreańskich znaków na początku popycha ciąg
"DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012"
. Zauważysz, że co trzecia postać jest postacią, której chcemy; reszta to bełkot. Dlatego:W Sclipting dwa koreańskie znaki kodują trzy bajty. Zatem każdy znak koreański skutecznie koduje 12 bitów. Aby otrzymać ciąg zaczynający się od
D
, pierwsze 8 bitów musi być0x44
; reszta nie ma znaczenia, ale ponieważ musimy powtarzać każdą postać, od 12 do 20 bitów też będą0x44
. Tak więc0x44n44n
dla pewnej liczby n będziemy mieli wartość postaci , która rozkłada się na trzy bajty0x44 0xn4 0x4n
.Dla
o
, czyli0x6F
dostajemy bajty0x6F 0xn6 0xFn
.Ponieważ jestem leniwy, zacząłem od kodowania,
"DDDooo nnnooottt (etc.)"
a następnie zamieniłem każdy inny znak na poprzedni, dlatego otrzymuję0x444444
="DDD"
dlaD
i0x6F66F6
="of�"
dlao
.�
Ma ponieważ0xF6
sama jest nieprawidłowy kodowania UTF-8.Wróćmy do programu. Reszta programu przebiega w następujący sposób:
Teraz chcę użyć
"..."
wyrażenia regularnego, dzięki czemu mogę dopasować trzy znaki z oryginalnego ciągu jednocześnie, używając konstrukcji pętli 替 ... 終. Ponieważ jednak każda instrukcja jest zduplikowana, muszę mieć dwie takie pętle wyrażeń regularnych zagnieżdżone w sobie, a jeśli zapełni się stos, otrzymuję błąd czasu wykonywania. W związku z tym,a następnie uruchom pętle. W ten sposób zewnętrzna pętla iteruje tylko raz, ponieważ dopasowuje wyrażenie regularne
""
do łańcucha""
, co daje pojedyncze dopasowanie. Wewnętrzna pętla działa raz na każde dopasowanie"..."
do dużego łańcucha. Ciało pętli to:Pętla wewnętrzna kończy się tutaj, więc każde dopasowanie wyrażenia regularnego jest zastępowane pierwszym znakiem tego dopasowania. Pozostawia to żądany ciąg na stosie.
Następnie kończy się zewnętrzna pętla, w którym to momencie pożądany ciąg jest usuwany ze stosu, a jedyne dopasowanie
""
ciągu w łańcuchu""
jest zastępowane nim, pozostawiając pożądany ciąg ponownie na stosie.źródło
Labirynt , 528 bajtów
Podwójne znaki nowej linii bolą, ale przynajmniej to dowodzi, że jest to wykonalne!
Każdy znak jest drukowany jeden po drugim, najpierw przez utworzenie punktu kodowego, a następnie wydrukowanie pojedynczego znaku. Punkty kodowe są tworzone przez:
gdzie
Niezwykłe zachowanie cyfr Labiryntu jest wykorzystywane, w
33::00&&
rzeczywistościKażdy pojedynczy znak jest drukowany z mechanizmem
xx
Istnieć tylko pad siatkę tak, że jest to 5 wysokie. Najpierw__
wciśnij dwa zera, a następnie uderzymy w operatora obrotu siatkiv
. Wystawiamy zero i obracamy:i znowu:
Następnie przechodzimy w prawo do
.
trzeciego wiersza, wykonując polecenie drukowania tylko raz.źródło
CJam -
176136 bajtówDzięki Sp3000 za podzielenie mojego programu przez dwa :-)
Wyjaśnienie
HH77++
,GG00++
... obliczają całkowity kod ascii znaków, dodając liczby (na przykład: `HH77 ++ 'wypycha 17, 17 i 77 na stos, a następnie dodaje te 3 liczby)]]{{cc}}//
zapętla się przez kody ascii i konwertuje je na znaki.Wypróbuj tutaj
źródło
33cc
, ale jestem pewien, że istnieją lepsze sposoby dla niektórych innychcc
wszędzie zrobić]]{{cc}}//
na końcuSamo-modyfikujący Brainf *** , 72 bajty
Zauważ, że
\x00
reprezentuje dosłownyNUL
bajt szesnastkowy (pusta komórka). Kod źródłowy jest umieszczony na taśmie po lewej stronie komórki początkowej.Wyjaśnienie
Ponadto, przed stworzeniem tego programu, robiłem taki, używając tylko znaków BF w źródle. To jest możliwe! Jest także znacznie dłuższy, ponieważ dla nieparzystej wartości ASCII zamierzałem utworzyć podwójną wartość, a następnie podzielić przez dwa. Nieco krócej byłoby zmodyfikować całe źródło, aby generować nieparzyste wartości na początek.
źródło
DDoo nnoott rreeppeeaatt yyoouurrsseellff!!
(podwójne spacje)? Widzę dwa.
s.Change first '.' to '0'
. Zmieniłem wyjaśnienie, aby pokazać (ponownie), że pierwsza.
zmieniona jest na zero.Galaretka , 66 bajtów (niekonkurencyjna)
Wypróbuj online!
Faktoid
Program nadal działa, jeśli usuniesz co drugi znak.
Wypróbuj online!
Jak to działa
zwraca tablicę ciągów. Dosłowność zaczyna się na a
“
, kończy na a”
, a łańcuchy są wewnętrznie ograniczone przez“
. Wynik toArgument dowiązania i wartość zwracana są ustawiane na tę tablicę ciągów, a następnie wykonywana jest pozostała część kodu źródłowego.
źródło
Gammaplex , 66 bajtów
Gammaplex to język 2D, który wykorzystuje pozycję pierwszej nowej linii jako długość linii i ignoruje wszystkie inne nowe linie.
źródło
MSM ,
270160 bajtówMój pierwszy program MSM!
Wyprowadzanie ciągu znaków w MSM odbywa się poprzez wypychanie poszczególnych znaków na stos i łączenie ich w pojedynczy ciąg znaków
.
, npLiczba
.
jest o jeden mniejsza niż liczba znaków. DlaDo not repeat yourself!
potrzebujemy 22.
s. Na szczęście jest to liczba parzysta, więc mamy 11 podwójnychUmieszczenie przed nim liter wymaga większego wysiłku. Wzór
robi lewę dla każdej postaci
c
. Ocenia w następujący sposóbPotrzebujemy 23 takich wzorów, zaczynających się
!!'',,
i kończącychDD'',,
na 22 komendach łączenia.
.źródło
Befunge 98, 70 66 bajtów
Wypróbuj online!
Po mojej niepoprawnej odpowiedzi, oto lepsza, która faktycznie pasuje do wyzwania!
(Podziękowania dla Martina Endera za sugestię użycia
��
znaku 0x17 zamiast88ff++
)Wyjaśnienie:
źródło
8f+
: tio.run/nexus/…DC ,
348346342306290278 bajtówPlik
dnr6.short.dc
(bez końcowego znaku nowej linii):Biegać:
źródło
BotEngine , 6x49 = 294
źródło
Backhand , 54 bajty
Wypróbuj online!
Ponieważ wskaźnik Backhand już porusza się w trzech komórkach tyknięcia, wszystko, co musimy zrobić, to zmniejszyć go do 2 za pomocą
v
źródło
siatkowy, niekonkurencyjny, 62 bajty
Wypróbuj online!
Objaśnienie w częściach:
U
ustawia kierunek wskaźnika na(2, 0)
, tj. przesuwanie2
jednostek xi jednostek0
y, więc przeskakuje co drugą postać, zaczynając od następnejU
pomijanej. Następnie każda inna postać jest rejestrowana i jest to równoważne z:który jest prostym programem wyjściowym.
Inny
To konkuruje o nagrodę JavaScript WallyWest:
Mogę udowodnić, że chociaż liczby mogą być konstruowane zgodnie z tym ograniczeniem, ciągi nie mogą. Ponieważ nie można użyć literałów, ponieważ umieszczenie dowolnego znaku budującego literały utworzy pusty ciąg:
Wtedy można użyć tylko niektórych operatorów; jedynymi używanymi operatorami „sparowanymi” są:
I żaden z nich nie może rzucać liczb / innych na ciągi. Dlatego nie można wyprowadzać żadnych ciągów.
źródło
Alice , 74 bajty
Wypróbuj online!
Wyjaśnienie
Pierwszy haczyk polega na tym, że musimy być w stanie wprowadzić ciąg, więc chcemy pominąć tylko pierwszy
"
. Robimy to, przeskakując na pierwszą,"
ponieważ wtedy IP poruszy jedną komórkę przed ponownym spojrzeniem na bieżącą komórkę, tak że druga"
wejdzie w tryb ciągów. Ale aby móc tam wskoczyć, potrzebujemy10, 0
na szczycie stosu, w tej kolejności (drugi, górny). Odbywa się to za pomocąaa00tt,,
:Ta funkcja rotacji wyskakuje z argumentem. Jeśli argument ten jest negatywny, przesuwa wartość na szczycie stosu o tyle pozycji. Jeśli argument jest pozytywny, szuka elementu, który umieszcza wiele poniżej szczytu i wyciąga go na górę. Zauważ, że w przypadku
Rotate(10)
nie ma wystarczającej liczby elementów na stosie, ale na dole jest ukryta nieskończona liczba zer, dlatego zero kończy się na górze.Teraz możemy
J
przejść do pierwszego"
za pomocą tych dwóch argumentów. Drugi"
wchodzi w tryb strunowy i rejestruje to wszystkoDDoo nnoott...
. Po trafieniu/
adres IP zostaje przekierowany na południowy wschód i wchodzimy w tryb porządkowy. Na razie adres IP odbija się w górę iw dół przez trzy linie (z których dwie są puste), więc najpierw rejestruje trzy kolejne spacje w liniach drugiej i trzeciej, a następnie opuszczamy tryb łańcuchowy, gdy uderza"
. Ponieważ obecnie jesteśmy w trybie porządkowym, wszystkie zarejestrowane znaki są wypychane jako jeden ciąg znaków na stos (mimo że większość z nich nagrywaliśmy w trybie kardynalnym), więc kończymy na tym ciągu (zwróć uwagę na spacje końcowe) :Teraz IP utrzymuje podskakują w górę iw dół, co oznacza, że wykonuje jedno polecenie każdej innej pary, czyli
Y
at
. Wtedy IP uderzy w koniec siatki w drugiej linii i zacznie się odbijać do tyłu przez siatkę. To także włącza w którym para znaków IP uderza pierwszą linię, więc kiedy wraca teraz wykonuje;
,o
i@
. Ignorując wszystkie spacje i niejawne przekierowania IP, wykonany kod działaYt;o@
w trybie porządkowym.Jest
Y
to polecenie „rozpakuj”, które dzieli ciąg znaków na znaki na przemiennych pozycjach. Ponieważ każdy znak jest powtarzany, to tak naprawdę daje nam tylko dwie kopie ciągu, dla którego idziemy, chociaż pierwsza kopia ma dwie końcowe spacje, a druga jedną spację końcową.t
dzieli to końcowe miejsce i;
odrzuca je. Na konieco
drukuje ciąg i@
kończy działanie programu.źródło
05AB1E ,
1005852 bajtów-6 bajtów dzięki Kevin Cruijssen
Wypróbuj online!
Zasady idempotencji.
źródło
á
nie wektoryzuje wewnętrznych ciągów, w przeciwnym razie można go użyć po))
… Usunięcie wszystkichá
i użycieεεáá}}
po))
pracach jako alternatywy, ale niestety nie oszczędza żadnych bajtów (ale może znajdziesz inspirację? ) .. I„„!!
zamiast……!!
pracy, ponieważ!
wbudowane pozostawia ciągi tak samo. Ach cóż, próbowałem. xD##θθáá
iz jakiegoś powodu nie zastanawiałem sięεε}}
... Próbowałem€€
, co nie do końca działa ... To jest teraz najkrótsza odpowiedź, dzięki!Stax , 70 bajtów
Uruchom i debuguj na staxlang.xyz!
Na szczęście Stax ma wbudowane
::
co n-ty. Wszystko, czego potrzebuję, to podwoić ciąg, pchnąć 2 i uruchomić::
. Łatwe, prawda?Źle.
Naciskanie tego sznurka jest trudne. Pierwszy znak cudzysłowu może być podwojony o
..""
, który jest literałem o długości 2,."
po którym następuje znaczący znak cudzysłowu. Problem polega na tym, że nie widzę sposobu na zakończenie łańcucha (co jest konieczne, w przeciwnym razie zostanie wydrukowana wersja podwójna) bez uruchamiania nowego.Koniec programu kończy literały łańcuchowe. Jeśli uda mi się umieścić tam podwojony literał, być może będzie fajne obejście. Jednak przeskok gdzieś od końca programu wymaga
G}
, więc przynajmniej patrzę na to:To nie robi ... nic.
G
nie rozpoczyna bloku, więc żaden nie przejdzie do drugiego}
. Znowu muszę ignorować jeden znak:..}}
. Wykonanie przeskakuje od pierwszegoG
do drugiego}
, kontynuuje do końca, przeskakuje z powrotem do drugiego,G
a stamtąd do drugiego}
, i kontynuuje jeszcze raz do końca, zanim zostanie wznowiony na początku[deduplicate]
sekcji z podwójnym łańcuchem na stosie.Deduplikacja jest prosta.
11hh
przesunęliśmy jedenaście razy i zmniejszamy ją o połowę, zaokrąglając dwa razy w dół i uzyskując dwa, a::
następnie zapewni nam potrzebną wydajność.O o. To nic nie drukuje. Są tutaj dwa problemy: po pierwsze,
..}
oznacza to, że łańcuch.}
będzie na szczycie stosu na końcu programu, a po drugie, zwykłe niejawne wyjście Stax jest teraz wyłączone!Najgorszym problemem jest wydajność. Gdy program Stax zakończy się płynnie bez drukowania, górna część stosu zostanie wydrukowana domyślnie. Ale nic nie wydrukowaliśmy ...? Ach, ale my mamy. Nieokreślone literały łańcuchowe są drukowane, a nie wypychane, a nawet te dwa puste łańcuchy (od niedopasowanego
"
na końcu), pomimo tego, że są puste, wystarczą do wyzwolenia tej kontroli. Wszelkie drukowanie musi być wykonane ręcznie.Musimy albo
pp
alboPP
, w tym przypadku, ignorując pierwsze przez..pp
to nie do przyjęcia, ponieważ będzie ona drukować ciąg.p
. Oznacza to, że potrzebujemy pożądanego wyjścia pojedynczo na stosie lub w dwóch pierwszych, wraz z pustym ciągiem. To ostatnie osiąga się przez naciśnięcie dwóch pustych łańcuchów (zz
) i obrócenie dwóch górnych elementów dwa razy (aa
) przed wydrukowaniem.Po wykonaniu tej czynności mamy stos o wysokości czterech sznurków. Piąta część
.}
jest następnie wypychana, zanim program zakończy się z wdziękiem; w tym momencie brak dorozumianych rezultatów staje się zarówno błogosławieństwem, jak i przekleństwem, ponieważ nic więcej nie będzie teraz drukowane!źródło