... przynajmniej dla pewnej definicji „samodzielnej modyfikacji”.
Zadanie
W tym wyzwaniem, twoim zadaniem jest napisać trzy struny A
, B
i C
które spełniają następujące właściwości.
Ciąg
B
ma długość co najmniej 1.Dla każdego
n ≥ 0
ciąg jest prawidłowym programem (co oznacza pełną wersję programu lub definicji funkcji) w wybranym języku programowania. Powtórzenie oznacza Indeks górny, więc oznacza to, że ciągi , , , itd. Każdy program trwa jeden ciąg jako dane wejściowe i zwraca jeden ciąg jako wyjście.ABnC
AC
ABC
ABBC
ABBBC
Dla każdego
m, n ≥ 0
, jeśli program jest uruchamiany z wejściem , zwraca . W przypadku danych wejściowych nie w tym formularzu program może zrobić wszystko, w tym awarię.ABmC
ABnC
ABm*n+1C
Kilka przykładów w formacie program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Zasady i punktacja
Twój wynik to łączna długość A
iC
, im niższy wynik, tym lepiej. Zauważ, że chociaż B
nie jest liczony do wyniku, musi on zostać wygenerowany przez A
i C
jak w pierwszym przykładzie.
Standardowe luki są niedozwolone. Programy nie mają bezpośredniego lub pośredniego dostępu do własnego kodu źródłowego (z wyjątkiem sytuacji, gdy podano go jako dane wejściowe). Które są wymagane do identyfikacji ciągi A
, B
a C
w swojej odpowiedzi w jakiś sposób, i zachęcał, aby wyjaśnić swoje rozwiązanie.
źródło
Pyth, 10
Podzieliliśmy źródło na dwie linie. Pierwsza linia to A, druga linia to Bs. Ponieważ A znajduje się w pierwszej linii, pierwsza
w
po prostu drukuje A - łatwe, gotowe.W Pyth zera wiodące są oddzielnymi tokenami, więc tak
[00)
naprawdę jest[0, 0]
. Zauważ, że pierwsza linia kończy się nal[
, a druga linia składa się z0000...
. Tak więcl[
faktycznie liczy liczbę Bs w tym programie. Drugiw
odczytuje w drugim wierszu wejścia - jest to liczba Bs wejścia. Odtąd jest to proste pomnożenie, zwiększenie i wyprowadzenie tylu zer.źródło
Siatkówka ,
2519 bajtówPrzykładowy
ABC
kod:Kod ma dwa zastępcze kroki:
zmień dane wejściowe
AB^mC
naAB^(m*n)C
, zmieniając każdyB
naB^n
:]\]
dopasowuje każdyB
na wejściu i nic więcej dzięki ucieczce w liniach wzoru]]...]]
jestB^n
zmiana
B^(m*n)
doB^(m*n+1)
przezm`^]*$
biorąc linię tylko]
„s]$0]
dodanie do niego dodatkowej pary]]
w taki sposób, że ta linia nie pasuje do pierwszego wyrażenia regularnegoDodałem 3 bajty do wyniku dla
-s
flagi wieloliniowej, która jest potrzebna, aby cały kod Retina mógł znajdować się w jednym pliku.2 bajty zapisane dzięki @ MartinBüttner.
źródło
Python 3, 51 bajtów
Przykładowe użycie:
Oblicza się czynności
n*m+1
z(1+len("xxx")*(len(s)-51))
którym jestm
x
jest w ciągu (xxx
część jestB^m
). Pomnożenie łańcucha"x"
przez tę liczbę daje,B^(n*m+1)
a funkcja pobieraA
iC
wyprowadza dane wejściowe i łączy je wszystkie, aby uzyskaćAB^(n*m+1)C
.To samo podejście w J:
J, 35 bajtów
źródło
CJam, 22
Przykładowy przebieg:
co przekłada się na
z wejściem jako
co daje następujące dane wyjściowe:
Jak to działa :
Przyjrzyjmy się, jakie programy
AC
iABC
jak wyglądają:Zauważamy, że
C
=B_~
Przyjrzyjmy się, co
B
robi:Teraz zobaczmy, co
AC
zrobi bieganie bez żadnych danych wejściowych:Wow, wyjście jest
ABC
.Zasadniczo liczymy, ile jest
B
w kodzie. Następnie ile jest na wejściu (używając długości). Pomnóż je, zwiększ dwukrotnie (ponieważC
ma równieżB
) i dołącz,_~
aby uzyskaćC
Wypróbuj online tutaj
źródło
Haskell , 50 bajtów
f
jest funkcją przyjmującą i zwracającą aString
.Ciąg B jest tylko pojedynczą spacją, podczas gdy C zaczyna się od jednej.
Wypróbuj online!
_:b=" "
przypisuje wszystkie ale pierwszy z pomieszczeń, w ciągu do dosłownyb
, co czyni, że równa programu m kopii B.s
jest łańcuchem wejściowym.a:c<-words s
dzieli go na słowa rozdzielone spacjami, tak żea
staje się A ic
staje się listą słów zawierających C. Kopie B są ignorowane, ponieważwords
ściskają wiele spacji (których unika reszta programu).drop 50s
jest łańcuchem o długości równej liczbie n kopii B na wejściu.drop 50s>>b
konkatenuje tyle kopiib
, dając mn odstępy.unwords$a:(drop 50s>>b):c
łączy wszystkie łańcuchy z powrotem ze spacjami. Ponieważ(drop 50s>>b)
na liście znajduje się dodatkowe „słowo” , istnieje również dodatkowe miejsce łączenia, automatycznie dodając +1 do mnożenia.źródło
Matlab, 85
Po raz pierwszy wykonałem tak abstrakcyjne wyzwanie, więc dla mnie było to raczej wyzwanie kodowania niż wyzwanie golfa!
Trzy ciągi znaków bez cudzysłowu:
Jak to działa: Podzielę argument wejściowy na białe znaki, więc
n
można je ustalić na podstawie liczby części łańcucha. B działa jak rodzaj licznika do zdobyciam
. Aby zrekonstruować odpowiedź, używam A i C z podziału, powtarzam B m * n + 1 razy i wstawiam spacje, używając ich wartości ASCII, aby żadne niepożądane podziały nie występowały w C.EDYCJA: ups, przypadkowo policzył A + B
źródło
C (gcc) , 81 bajtów
Wymóg identyfikacji ciągów wydaje się być sprzeczny z naszym dozwolonym arbitralnym zachowaniem w przypadku nielegalnych danych wejściowych, chyba że mamy dość luźne standardy dotyczące tego, co oznacza identyfikacja. Oczywiście przyjęłam interpretację, która zrzuca najwięcej bajtów.
Wypróbuj online!
źródło
TI-Basic (seria 83), 65 bajtów
Segment A (33 bajty):
Segment B:
Segment C (32 bajty):
Jestem naprawdę podekscytowany znalezieniem tego quino-wyzwania! Większość quines nie działa w TI-Basic bez choćby odrobiny oszukiwania, ponieważ nie ma sposobu na ucieczkę od
"
symbolu. (W obu znaczeniach słowa „ucieczka”.) Ale tutaj otrzymujemy ciąg wejściowy za pomocąInput
polecenia i wpisanie"
tam jest całkowicie w porządku.Wciąż jest tu trochę głupoty TI-Basic: pusty łańcuch jest nieprawidłowy, więc naiwne rozwiązanie wstawiania łańcucha
"XXX...XX"
w pętli nie zadziała, gdy n = 0. Zamiast tego ręcznie obliczamy wartość mn + 1 i wstawiamy ciąg"X"
wiele razy.Stałe magiczne
27
i28
w programie są nieco off z liczbą bajtów 33 i 32, ponieważStr1
,sub(
ilength(
są tokeny dwóch bajtów, że tylko 1 przyczyniają się do długości łańcucha.Jeśli użyjemy nowego wiersza zamiast
:
, wygląda na to, że można zaoszczędzić kilka bajtów, pomijając końcowe cudzysłowy, ale tak naprawdę to nie działa. Przede wszystkim potrzebujesz edytora szesnastkowego, aby dodać znak nowej linii do łańcucha: nie możesz go po prostu wpisać, ponieważ jeśli naciśniesz ENTER podczasInput
polecenia, przesyła on dane wejściowe. Kiedy wypróbowałem podejście do edytora szesnastkowego, otrzymałem dziwny błąd przepełnienia bufora, który zmodyfikował zawartość mojego programu, więc nie próbuj tego w domu z drogim kalkulatorem.źródło
Java 11,
13565 + 26 = 91 bajtówZA
b
do
Wypróbuj online tutaj (TIO nie ma jeszcze Java 11, więc zamiast tego opiera się na metodzie pomocnika
String::repeat()
).Nie golfowany:
źródło