Biorąc pod uwagę tablicę dodatnich liczb całkowitych A
jako danych wejściowych, wygeneruj program, który po powtórzeniu k
razy wyświetli wartość k
th (1-index) tablicy.
Na przykład, jeśli tablica jest [1,11]
, wyjście powinno być programem, który wypisuje 1
, a po dwukrotnym powtórzeniu, wyjście 11
. Kod jak print(end="1");
w Pythonie 3 działa: print(end="1");
wypisuje 1 i print(end="1");print(end="1");
wypisuje 11
Wygrywa najmniejsza suma długości kodu do rozwiązania wszystkich przypadków testowych. Twój meta kod powinien rozwiązać 500 przypadków testowych w latach 60., a każdy kod rozwiązania powinien zwrócić za 10 sekund. Kod meta i kod rozwiązania nie muszą być w tym samym języku, ale wszystkie rozwiązania generowane przez Twój metaprogram powinny być w tym samym języku.
Dane z testu wstępnego i generator można zobaczyć tutaj . 7 dni później wykorzysta sumę czasu przesłania (np. 12:34 średnia 1234) jako losowe ziarno i wygeneruje kolejny przypadek testowy jako ostateczny przypadek testowy.
Końcowy materiał siewny to 7335 w GMT + 8, więc ostateczne dane testowe są tutaj
źródło
print(end="1");
powtórzone 2 razy toprint(end="1");print(end="1");
x
. Następniex
powinien podać pierwszy element listy,xx
powinien podać drugi element listy,xxx
powinien podać trzeci i tak dalej.Odpowiedzi:
Python 3 , generuje Stax
Korzysta z różnych strategii. Większość strategii ma zastosowanie tylko pod pewnymi warunkami, ale istnieje jedna strategia zastępcza, która jest zawsze użyteczna. Na koniec wybierany jest najmniejszy program kandydujący.
Wypróbuj online!
Aktualizacja: Walidacja Wykonanie każdej krotności każdego programu osobno będzie czasochłonne. Możliwe jest uruchomienie ich wszystkich jednocześnie. W tym celu należy użyć małego fragmentu kodu. Jest odpowiedzialny za kilka rzeczy.
Wykonaj niejawne dane wyjściowe, jeśli takie istnieją. Zwykle na końcu programu stax górna część stosu jest drukowana, jeśli nie było innych wyników. W przypadku uruchamiania wielu programów w tym samym pliku źródłowym należy to zrobić jawnie.
Wyczyść oba stosy.
Resetuj rejestry. W przypadku tych programów używany jest tylko rejestr x.
Tę płytkę należy zastosować po każdym indywidualnym programie do wykonania.
Na przykład dane wejściowe
[5,2,7,3]
tworzą program stax3527E|X@
. Wszystkie cztery krotności mogą być testowane jednocześnie.Wypróbuj online!
W ten sposób możliwe jest przetestowanie wszystkich krotności całego programu w tym samym przebiegu, zakładając, że nic się nie psuje. Byłby to prawdopodobnie największy program stax, jaki kiedykolwiek został wykonany, gdyby wykonano wszystkie 500.
źródło
Perl 5
-p
, generuje Perl 5-p
, obciążenie191713-1 dzięki @Dom Hastings
Wynik dla jednego wejścia będzie
length of the input + 13
. Można to oczywiście poprawić, generując programy samodekompresujące dla większych danych wejściowych, ale nie będę się tym przejmować.Podaj tablicę wejściową oddzieloną przecinkami w jednym wierszu na STDIN.
Wypróbuj online!
Uruchom dane wyjściowe skonkatowane
n
razy bez danych wejściowych (np. Przekierowanie z / dev / null)Przykładowy sposób uruchomienia go dla danych wejściowych,
2,6,4,7
a wynikowy program powtórzono 4 razy:Wypróbuj online!
Jeśli nie podoba ci się wynikowy program próbujący czytać ze STDIN, użyj tej wersji z narzutem 17:
Wypróbuj online!
Przykładowy sposób uruchomienia go dla danych wejściowych,
2,6,4,7
a wynikowy program powtórzono 4 razy:Wypróbuj online!
Ta wersja ulega awarii po wydrukowaniu wymaganego wyjścia
źródło
s/ /,/g;$_="die say+($_)[\$-++],"
?05AB1E , generuje 05AB1E
Wypróbuj online!
Wygenerowany program do wprowadzania
[5,17,7,13,2]
to"5 17 7 13 2"#.g<è
.Zestaw testowy dla [5,17,7,13,2]
Długość wygenerowanego programu wynosi
len(input) + 5
źródło
len(input)
nie jest to liczba całkowita, ale długość łańcucha zawierającego je wszystkie. Z początku źle zrozumiałem.APL (Dyalog Unicode)
Anonimowy przedrostek lambda. Zwraca treść programu.
Wypróbuj online!
Metody
To bada różne metody i zwraca pierwszą użyteczną, ostatecznie wracając do powszechnie stosowanej metody.
Pojedynczy element
Jeśli lista zawiera tylko jeden element, jest zwracana w niezmienionej postaci.
2, 22 itd.
Pojedynczą cyfrę można po prostu powtórzyć, aby wygenerować liczbę 11 razy większą,
Wszystkie takie same
Zwracamy tylko najbardziej prawą (
⊢
) liczbę.Liniowy
f (n) = k × n sekwencji wystarczy wstawić plus przed pierwszym terminem.
Czynnikowe, a następnie wszystkie 1
Gdy pierwsza liczba n =! Mi kolejne liczby to 1, to
!m
jest rozwiązanie, ponieważ!m
jest n im!m
wynosi 1, a!1
wynosi 1.b ab ab ab
Ponieważ wszystkie liczby dwucyfrowe są większe niż wszystkie liczby jednocyfrowe, rozwiązaniem jest maksimum, w którym przód pierwszej liczby jest przyklejony z tyłu drugiej liczby.
Trzywierszowy kod
Sprawdź, czy jakaś formuła tego typu
+a×b
jest poprawna.Powrót łańcucha
Długie sekwencje bez liczb poniżej 5 (ponieważ 4 to podział linii) mogą być kodowane jako znaki SBCS.
Zastąpienie ciągu zastępczego
Jeśli liczb jest poniżej 5, przeskakujemy o 9, aby ich uniknąć.
Fallback
Prosta konkatenacja ciągu znaków
"{⍺←⊃⋄1⌽⍺⊢⍵}"
i⍕
wejście stringified ( ). Np.[3,1,4]
Zwraca treść programu{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
.Część nawiasów klamrowych jest funkcją ambiwalentną, co oznacza, że może to być funkcja przedrostka lub funkcja przedrostka. W ten sposób jego najbardziej lewa instancja będzie działać w trybie przedrostka, a wszystkie pozostałe w trybie przedrostka. Różnica między trybami polega na tym, czy
⍺
oznaczenie lewego argumentu ma wartość. Jeśli nie, to zostanie mu przypisana funkcja⊃
(pierwsza).Wyjaśnienie metody rezerwowej
{
…}
Anonimowa lambda:⍺←⊃
Jeśli nie ma lewego argumentu (⍺
), przypisz funkcję⊃
(pierwszą) do⍺
⋄
następnie:W tym momencie poniższy kod oznacza dwie różne rzeczy w zależności od tego, czy
⍺
jest to lista numerów (połączenie infix), czy funkcja „pierwsza” (połączenie prefiksu).Jeśli
⍺
jest to lista liczb:⍺⊢⍵
odrzuć lewy argument na rzecz prawego argumentu1⌽
obróć o jeden krok w lewoJeśli
⍺
jest funkcja „pierwsza”:⊢⍵
podać właściwy argument⍺
wybierz pierwszy element tego1⌽
obróć go o jeden krok (no-op na skalar)Przykład uruchomienia metody rezerwowej
Wykonując
3 1 4
kod,{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
przypisuje funkcję „first” do,⍺
a tym samym zwraca pierwszy element;3
.Wykonanie
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
pozwala lambda najbardziej wysuniętej na prawo „uchwycić”3 1 4
lewy argument jako lewy argument, więc⍺
ma wartość, która jest odrzucana, na rzecz3 1 4
której jest następnie obracana o jeden krok w lewo i daje1 4 3
wynik. Jest to następnie wykorzystywane jako jedyny argument dla lewej skrajnej lambdy, gdzie⍺
staje się „pierwszą” funkcją, powodując, że wynik jest pierwszym elementem;1
.Wykonywanie
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
pozwala lewemu lambda „uchwycić” środek3 1 4
jako lewy argument, który jest następnie odrzucany na korzyść prawego argumentu3 1 4
, którym jest obrócenie o jeden krok w lewo1 4 3
. Jest to następnie wykorzystywane jako prawy argument środkowej lambdy wraz z lewym skrajnym3 1 4
jako lewy argument. Lewy argument jest odrzucany dla prawej, która obraca się o jeden krok w lewo daje4 3 1
. To staje się wówczas jedynym argumentem lambda położonej najbardziej na lewo, a więc⍺
staje się „pierwszą funkcją”, zwracającą pierwszy element;4
.Punktacja
Kiedy przyjdzie czas na testowanie przy użyciu rzeczywistych danych, użyj tej wiązki testowej (połączonej z danymi z testu wstępnego). Przypadki testowe trafiają do pola Input, a Output będzie całkowitą liczbą bajtów wszystkich 500 programów razem. (Zgłasza również błąd, ale tylko dlatego, że później próbuje ocenić dane wejściowe w obecnej postaci).
źródło
Węgiel drzewny
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Podaj ciąg literału
⎚§⪪
.Rzuć tablicę wejściową na ciąg, połącz ze spacjami i wydrukuj.
Podaj ciąg literału
¦ Lυ⊞υω
.Dane wyjściowe na przykład
5,17,7,13,2
to⎚§⪪5 17 7 13 2¦ Lυ⊞υω
. Wypróbuj online! Wyjaśnienie:Wyczyść płótno, aby widoczny był tylko ostatni wynik.
Weź długość wstępnie zdefiniowanej listy
u
. Użyj tego, aby zindeksować listę liczb całkowitych, które zostały podzielone na spacje i wygenerować wybrany element.Wciśnij zmienną fikcyjną do wstępnie zdefiniowanej listy
u
, aby następna kopia wygenerowała następny element listy.Całkowita długość wyjściowa = (długość wszystkich liczb całkowitych na wszystkich listach) + (liczba liczb całkowitych na wszystkich listach) + (liczba list * 9) znaków (SBCS).
źródło
Haskell , generuje Haskell
Wypróbuj online! Dla pierwszej skrzynki testowej
[5,2,7,3,2,3,15,10,7,2,14,11,16,16,3,3,4,3,8,4]
tworzy następujący program:Spróbuj raz , podwójnie i potrójnie . Wykorzystuje to to samo podejście, co moja odpowiedź Haskella: podwoiłem źródło, podwoiłeś wynik .
Długość każdego generowanego programu jest długością listy danych wejściowych w postaci ciągu plus 25, zatem wynik dla obecnie dostępnych przypadków testowych wynosi
12266 + 500 * 25 = 24766
. To pokazuje, że stosunek kodu do danych jest w zasadzie równy i wątpię, czy można napisać wystarczająco mały kod dekompresyjny, który obniży wynik. Może to być możliwe, jeśli listy będą znacznie większe.źródło
Python 2 , generuje Python 2
Wypróbuj online!
Dla danych wejściowych
wygenerowany program to
który ma 98 bajtów.
Zaadaptowano z tego rozwiązania w „Podwajam źródło, podwajasz moc wyjściową!”.
Cholera, pojawiły się dwie krótsze odpowiedzi, zanim skończyłem pisać tę odpowiedź.
źródło
k
czasieprint
nasys.stdout.write
usunięcie końcowego „czegoś”.Java 8, generuje Python 2
Wypróbuj online.
Tj.
[3,4,5,6,7]
Generuje ten program w języku Python 2:Spróbuj raz online ; Wypróbuj online dwa razy ; Wypróbuj online trzy razy .
Wygenerowany program Python jest oparty na odpowiedzi @ Mr.Xcodera po raz trzeci wyzwanie rzucenia uroku .
Wyjaśnienie:
Kod Java 8:
Kod Python 2:
źródło
Bash, wyświetla programy w Perlu 5
Program Bash można wywołać jak
script.sh 1,2,3
.Program Perla powinien być wywoływany z
-E
flagą.Wygenerowany
perl
kod dla danych wejściowych4,7,8
to:Dość brutalna siła. Usuwa element tablicy (
perl
nie obchodzi go, że tablica na początku nie istnieje), ustawia go, jeśli nie jest jeszcze ustawiony. Następnie echo pierwszego elementu tablicy na końcu. (END
Blok jest uruchamiany jako ostatni).exec 'true'
Rezygnuje z programu, tak, że dalszeEND
bloki nie są wykonywane.Przykład:
źródło
Python 2, generuje C ++
Nie pobije to żadnych rekordów, interesowało mnie głównie to, czy uda mi się wymyślić, jak to zrobić :) Użyj faktu, że zmienne globalne są uruchamiane przed głównym, a więc można zwiększyć zmienną globalną, a następnie użyć #ifdef, aby upewnić się, że main jest zdefiniowany tylko raz.
źródło
Runiczne Zaklęcia , generują Runiczne
Wypróbuj online!
Pobiera dane wejściowe jako rozdzieloną spacjami listę wartości.
Dane wyjściowe wykonane raz Dane
wyjściowe dwa razy Dane
wyjściowe cztery razy
Wykorzystuje polecenie ciągłego numerycznego trybu odczytu,
´
które zostało popełnione 12 stycznia i znalazłem to pytanie 14 stycznia . To polecenie pozwala na zakodowanie dowolnych wartości długości, ponieważ bez tej funkcji byłoby to bardzo trudne (np.1392
Należałoby je przedstawić jako1X3+X9+X2+
wymagające co najmniej dodatkowej pętli); dokładnie problem, który chciałem rozwiązać, gdy tworzyłem´
polecenie.W oryginalnym kodzie
|
w struny"{Zs$;|1|l;|y"
i"UwR'10<|I+}"
są zastąpione\n
(co siedzieć w sieci i nie zmieniać go, jak to normalnie) zw
obrządku poleceń:74akw
,94/Rakw
,c4akw
, i85akw
. Oryginalne postacie mogą być dosłownie wszystkim.|
został wybrany jako symboliczny symbol zastępczy, który wizualnie reprezentuje to, czego chciałem. Zapisano kilka bajtów (w przypadku odznaczenia) bez konieczności refleksyjnego dodawania punktu wejścia, ponieważwR'10<
zapisujeR
w miejscu, w którym już istnieje (pozycja0,1
), a następnie wypełnia swój stos śmieciami, zanim zabraknie many, po zapętleniu sekwencjaU"'i34
.Wynikowy kod wyjściowy działa przy użyciu
w
polecenia rite, aby zmienić pierwszy znak w drugim wierszu naR
przekierowanie ight (więc tylko jeden adres IP wykonuje instrukcję print), przy sprytnym użyciu długości stosu wynikającej z wyższych i wyższych programów w celu ustalenia, który indeks czytać. Każde inne IP zmienia tę samą lokalizację na tę samą instrukcję i kończy się. Wszystko inne pozostaje niewykorzystane.Obraz jest nieaktualny, ale wystarcza do wyjaśnienia przepływu.
Każde wykonanie
1Iy
zachowuje zdolność IP do obsługi coraz większego stosu (spowodowanego przezl
polecenie), którego rozmiar pozwala programowi określić liczbę kopii podstawowego kodu źródłowego. Ostateczny1
służy do zwiększenia poprzedniegol
liczby do wymaganej liczby podczas obracania stosu (utworzonego następnie) w celu uzyskania prawidłowej wartości.Z
Komenda neguje tę wartość tak, że podczas obrotu stosu w prawidłowym kierunku.Oryginalna tablica wejściowa jest następnie kodowana przy użyciu trybu ciągłego odczytu, wypełnionego cyfrą 0, aby uniknąć stopniowego modyfikowania tej samej wartości, aby odczytać oryginalne dane wejściowe. Spacja NOP jest wymagana, aby wyjść z trybu ciągłego odczytu i pozwolić kolejnym 0 ponownie zalać stos.
Wynik powinien wynosić w przybliżeniu
3+v.toString().length
, dla każdego wpisu tablicyv
,+23
dla każdej tablicy. W przybliżeniu(2.55*total length of input)
lub33837
dla próbki wejściowej, jeśli zrobiłem wszystko dobrze.Drobne zmiany zostały wprowadzone do mojego oczekiwanego programu końcowego z powodu efektów ubocznych wprowadzonych w tej samej wersji dotyczącej
s
polecenia, ale zaowocowało to lepszym wynikiem w tym samym czasie.źródło