Wenn Sie ein Array mit positiven Ganzzahlen A
als Eingabe angeben, generieren Sie ein Programm, das bei mehrmaliger Wiederholung k
den k
th-Wert (1-Index) des Arrays ausgibt .
Wenn das Array beispielsweise ist [1,11]
, sollte die Ausgabe ein Programm sein, das ausgibt 1
und bei zweimaliger Wiederholung ausgegeben wird 11
. Code wie print(end="1");
in Python 3 funktioniert: print(end="1");
druckt 1 und print(end="1");print(end="1");
druckt 11
Die kleinste Summe von Codelängen zur Lösung aller Testfälle gewinnt. Ihr Metacode sollte 500 Testfälle in 60s lösen, und jeder Ihrer Lösungscodes sollte in 10s zurückkehren. Metacode und Lösungscode müssen nicht in derselben Sprache sein, aber alle Lösungen, die Ihr Metaprogramm generiert, sollten in derselben Sprache sein.
Pretest Daten und Generator zu sehen sind hier . 7 Tage später wird die Summe der Einreichungszeit (z. B. 12:34 Mittelwert 1234) als zufälliger Startwert verwendet und ein weiterer Testfall als endgültiger Testfall generiert.
Der endgültige Startwert ist 7335 in GMT + 8, daher sind die endgültigen Testdaten hier
quelle
print(end="1");
2 mal wiederholt istprint(end="1");print(end="1");
x
. Dannx
sollte das erste Element der Liste geben,xx
sollte das zweite Element der Liste geben,xxx
sollte das dritte geben und so weiter.Antworten:
Python 3 generiert Stax
Dies verwendet eine Vielzahl von Strategien. Die meisten Strategien gelten nur unter bestimmten Bedingungen, es gibt jedoch eine Fallback-Strategie, die immer verwendet werden kann. Am Ende wird das kleinste Kandidatenprogramm ausgewählt.
Probieren Sie es online aus!
Update: Validierung Es ist zeitaufwändig, jede Vielzahl von Programmen separat auszuführen. Es ist möglich, sie alle gleichzeitig auszuführen. Dazu muss ein kleiner Code verwendet werden. Es ist für ein paar Dinge verantwortlich.
Führen Sie gegebenenfalls eine implizite Ausgabe durch. Normalerweise wird am Ende eines Stax-Programms die Oberseite des Stapels gedruckt, wenn keine andere Ausgabe erfolgt ist. Wenn Sie mehrere Programme in derselben Quelldatei ausführen, muss dies explizit erfolgen.
Löschen Sie beide Stapel.
Register zurücksetzen. Für diese Programme wird nur das x-Register verwendet.
Diese Kesselplatte sollte nach jedem einzelnen auszuführenden Programm angewendet werden.
Beispielsweise
[5,2,7,3]
erzeugt die Eingabe das Stax-Programm3527E|X@
. Alle vier Multiplizitäten können gleichzeitig getestet werden.Probieren Sie es online aus!
Auf diese Weise ist es möglich, alle Multiplizitäten des gesamten Programms im selben Lauf zu testen, sofern nichts kaputt geht. Es wäre wahrscheinlich das größte Stax-Programm, das jemals ausgeführt wurde, wenn alle 500 erledigt wären.
quelle
Perl 5
-p
erzeugt Perl 5-p
, Overhead191713-1 danke an @Dom Hastings
Die Punktzahl für eine Eingabe ist
length of the input + 13
. Kann natürlich verbessert werden, indem selbstdekomprimierende Programme für größere Eingänge generiert werden, aber ich werde mich nicht darum kümmern.Geben Sie das Eingabearray in STDIN in einer Zeile durch Kommas getrennt an.
Probieren Sie es online aus!
Führen Sie die verketteten Ausgabezeiten
n
ohne Eingabe aus (z. B. Umleitung von / dev / null).Beispiel für die Ausführung zur Eingabe
2,6,4,7
und das daraus resultierende viermal wiederholte Programm:Probieren Sie es online aus!
Wenn Ihnen das resultierende Programm, das versucht, aus STDIN zu lesen, nicht gefällt, verwenden Sie diese Version mit Overhead 17:
Probieren Sie es online aus!
Beispiel für die Ausführung zur Eingabe
2,6,4,7
und das daraus resultierende viermal wiederholte Programm:Probieren Sie es online aus!
Diese Version stürzt nach dem Drucken der erforderlichen Ausgabe ab
quelle
s/ /,/g;$_="die say+($_)[\$-++],"
?05AB1E , generiert 05AB1E
Probieren Sie es online aus!
Das generierte Programm für die Eingabe
[5,17,7,13,2]
ist"5 17 7 13 2"#.g<è
.Testsuite für [5,17,7,13,2]
Die Länge des generierten Programms beträgt
len(input) + 5
quelle
len(input)
ist nicht die Anzahl der ganzen Zahlen, sondern die Länge der Zeichenfolge, die sie alle enthält. Ich habe es zuerst falsch verstanden.APL (Dyalog Unicode)
Anonymes Präfix Lambda. Gibt einen Programmkörper zurück.
Probieren Sie es online aus!
Methoden
Dies untersucht verschiedene Methoden und gibt die erste verwendbare zurück, wobei schließlich auf eine universell anwendbare Methode zurückgegriffen wird.
Einzelelement
Wenn die Liste nur ein Element enthält, wird sie unverändert zurückgegeben.
2, 22 usw.
Eine einzelne Ziffer kann einfach wiederholt werden, um die 11-mal größere Zahl zu generieren.
Alles das selbe
Wir geben nur die
⊢
Nummer ganz rechts ( ) zurück.Linear
f (n) = k × n Sequenzen fügen einfach ein Plus vor dem ersten Term ein.
Faktoriell gefolgt von allen Einsen
Wenn die erste Zahl n =! M und die nachfolgenden Zahlen 1 sind,
!m
ist dies eine Lösung, da!m
n undm!m
1 ist und!1
1 ist.b ab ab ab
Da alle zweistelligen Zahlen größer sind als alle einstelligen Zahlen, ist ein laufendes Maximum, bei dem die Vorderseite der ersten Zahl auf die Rückseite der zweiten Zahl geklebt wird, eine Lösung.
Der dreizeilige Code
Überprüfen Sie, ob eine Formel des Typs
+a×b
gültig ist.String-Fallback
Lange Sequenzen ohne Zahlen unter 5 (da 4 ein Zeilenumbruch ist) können als Zeichen des SBCS codiert werden.
Fallback für versetzte Zeichenfolgen
Wenn es Zahlen unter 5 gibt, verschieben wir uns um 9, um diese zu vermeiden.
Zurückfallen
Einfache Verkettung der Zeichenfolge
"{⍺←⊃⋄1⌽⍺⊢⍵}"
und der⍕
Eingabe stringified ( ). ZB[3,1,4]
gibt den Programmkörper zurück{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
.Der Teil in geschweiften Klammern ist eine ambivalente Funktion, dh er kann entweder eine Präfixfunktion oder eine Infixfunktion sein. Daher wird die Instanz ganz links im Präfixmodus und alle anderen im Infixmodus ausgeführt. Der Unterschied zwischen den Modi besteht darin, ob
⍺
das linke Argument einen Wert hat. Ist dies nicht der Fall, wird ihm die Funktion⊃
(zuerst) zugewiesen .Erläuterung der Fallback-Methode
{
…}
Anonymes Lambda:⍺←⊃
Wenn kein linkes Argument (⍺
) vorhanden ist, weisen Sie die Funktion⊃
(zuerst) zu⍺
⋄
dann:An dieser Stelle bedeutet der folgende Code zwei verschiedene Dinge, je nachdem, ob
⍺
es sich um eine Liste von Nummern (Infix-Aufruf) oder um die Funktion "first" (Präfix-Aufruf) handelt.Wenn
⍺
ist eine Liste von Zahlen:⍺⊢⍵
Verwerfen Sie das linke Argument zugunsten des rechten Arguments1⌽
Drehe diesen einen Schritt nach linksWenn
⍺
ist die Funktion "zuerst":⊢⍵
das richtige Argument liefern⍺
Wählen Sie das erste Element davon1⌽
drehe es einen Schritt (ein No-Op auf einem Skalar)Beispiellauf der Fallback-Methode
Durch Ausführen
3 1 4
des Codes wird{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
die "erste" Funktion zugewiesen⍺
und somit das erste Element zurückgegeben.3
.Durch Ausführen kann
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
das Lambda ganz rechts die Linke3 1 4
als linkes Argument "erfassen" ,⍺
hat also einen Wert, der verworfen3 1 4
wird, der dann einen Schritt nach links gedreht wird und1 4 3
als Ergebnis ergibt . Dies wird dann als einziges Argument für das Lambda ganz links verwendet, wo es⍺
zur "ersten" Funktion wird, wodurch das Ergebnis das erste Element ist.1
.Durch Ausführen
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
"erfasst" das Lambda ganz rechts die Mitte3 1 4
als linkes Argument, das dann zugunsten des rechten Arguments verworfen wird3 1 4
, das bei Drehung um einen Schritt nach links ist1 4 3
. Dies wird dann als rechtes Argument des mittleren Lambda zusammen mit dem3 1 4
Argument ganz links als linkes verwendet. Das linke Argument wird für das rechte verworfen, das einen Schritt nach links gedreht ergibt4 3 1
. Dies wird dann das einzige Argument des Lambdas ganz links, wird also⍺
zur "ersten Funktion" und gibt das erste Element zurück;4
.Wertung
Wenn es Zeit wird, anhand der tatsächlichen Daten zu testen, verwenden Sie dieses Testkabel (verknüpft mit Vortestdaten). Die Testfälle werden in das Eingabefeld eingegeben, und die Ausgabe ist die Gesamtbytezahl aller 500 Programme zusammen. (Es wird auch ein Fehler ausgegeben, aber das liegt nur daran, dass anschließend versucht wird, die Eingabe unverändert zu bewerten.)
quelle
Holzkohle
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:
Geben Sie die Literalzeichenfolge aus
⎚§⪪
.Wandeln Sie das Eingabearray in eine Zeichenfolge um, verbinden Sie es mit Leerzeichen und drucken Sie.
Geben Sie die Literalzeichenfolge aus
¦ Lυ⊞υω
.Ausgabe von zum Beispiel
5,17,7,13,2
ist⎚§⪪5 17 7 13 2¦ Lυ⊞υω
. Probieren Sie es online aus! Erläuterung:Löschen Sie die Leinwand, sodass nur die letzte Ausgabe sichtbar ist.
Nehmen Sie die Länge der vordefinierten Liste
u
. Verwenden Sie diese Option, um in die Liste der Ganzzahlen zu indizieren, die auf Leerzeichen aufgeteilt wurden, und um das ausgewählte Element auszugeben.Schieben Sie eine Dummy-Variable in die vordefinierte Liste
u
, damit die nächste Kopie das nächste Element der Liste ausgibt.Gesamtausgabelänge = (Länge aller Ganzzahlen in allen Listen) + (Anzahl der Ganzzahlen in allen Listen) + (Anzahl der Listen * 9) Zeichen (SBCS).
quelle
Haskell , erzeugt Haskell
Probieren Sie es online aus! Für den ersten Testfall
[5,2,7,3,2,3,15,10,7,2,14,11,16,16,3,3,4,3,8,4]
wird das folgende Programm erstellt:Versuchen Sie es einmal , verdoppelt und verdreifacht . Dies verwendet den gleichen Ansatz wie meine Haskell-Antwort: Ich verdopple die Quelle, Sie verdoppeln die Ausgabe .
Die Länge jedes generierten Programms entspricht der Länge der Eingabeliste als Zeichenfolge plus 25, daher beträgt die Punktzahl für die derzeit verfügbaren Testfälle
12266 + 500 * 25 = 24766
. Dies zeigt, dass das Verhältnis von Code zu Daten im Grunde genommen gleich ist, und ich bezweifle, dass es möglich ist, einen ausreichend kleinen Dekomprimierungscode zu schreiben, der die Punktzahl verringert. Es könnte möglich sein, wenn die Listen viel größer sind.quelle
Python 2 generiert Python 2
Probieren Sie es online aus!
Für die Eingabe
Das generierte Programm ist
Das sind 98 Bytes.
Angepasst an diese Lösung in "Ich verdopple die Quelle, du verdoppelst die Ausgabe!".
Verdammt, zwei kürzere Antworten tauchten auf, bevor ich mit dem Schreiben dieser Antwort fertig war.
quelle
k
Zeiten ausgibtprint
,sys.stdout.write
um das nachfolgende "Etwas" zu entfernen.Java 8 generiert Python 2
Probieren Sie es online aus.
Dh
[3,4,5,6,7]
generiert dieses Python 2-Programm:Probieren Sie es einmal online aus . Probieren Sie es zweimal online aus . Probieren Sie es dreimal online aus .
Das generierte Python-Programm basiert auf der Antwort von @ Mr.Xcoder zum dritten Mal auf die Charm- Herausforderung .
Erläuterung:
Java 8-Code:
Python 2-Code:
quelle
Bash, gibt Programme in Perl 5 aus
Bash-Programm kann wie aufgerufen werden
script.sh 1,2,3
.Perl-Programm sollte mit dem
-E
Flag aufgerufen werden .Der generierte
perl
Code für eine Eingabe von4,7,8
lautet:Ziemlich rohe Gewalt. Entfernt ein Element des Arrays (
perl
es ist egal, dass das Array zuerst nicht vorhanden ist) und legt es fest, wenn es nicht bereits festgelegt ist. Am Ende wird dann das erste Element des Arrays wiedergegeben. (DerEND
Block wird zuletzt ausgeführt). Dasexec 'true'
beendet das Programm, so dass die weiterenEND
Bausteine nicht ausgeführt werden.Beispiel:
quelle
Python 2, generiert C ++
Dies wird keine Rekorde übertreffen, ich war hauptsächlich daran interessiert zu überlegen, ob ich herausfinden könnte, wie es geht :) Verwenden Sie die Tatsache, dass globale Variablen vor main ausgeführt werden und so eine globale Variable inkrementieren können, und verwenden Sie dann a #ifdef, um sicherzustellen, dass main nur einmal definiert ist.
quelle
Runenverzauberungen , erzeugt Runenverzauberungen
Probieren Sie es online aus!
Nimmt die Eingabe als durch Leerzeichen getrennte Liste von Werten auf.
Ausgabe einmal ausgeführt
Ausgabe zweimal ausgeführt
Ausgabe viermal ausgeführt
Verwendet den kontinuierlichen numerischen Lesemodus-Befehl,
´
der am 12. Januar festgeschrieben wurde, und ich habe diese Frage am 14. Januar gefunden. Mit diesem Befehl können beliebige Längenwerte codiert werden, da dies ohne diese Funktion sehr schwierig1392
wäre (z. B. müsste dargestellt werden als1X3+X9+X2+
, was mindestens eine zusätzliche Schleife erforderlich macht). genau das Problem, das ich lösen wollte, als ich den´
Befehl erstellte.Im ursprünglichen Code, der
|
in den Saiten"{Zs$;|1|l;|y"
und"UwR'10<|I+}"
wird ersetzt durch\n
(die im Netz sitzen und es nicht ändern, wie sie normalerweise) mitw
rite Befehlen:74akw
,94/Rakw
,c4akw
, und85akw
. Die ursprünglichen Zeichen können buchstäblich alles sein.|
wurde als symbolischer Platzhalter ausgewählt, der visuell darstellte, was ich wollte. Mehrere Bytes werden gespeichert (falls nicht bewertet), indem kein reflektierender Einstiegspunkt hinzugefügt werden muss, dawR'10<
einR
an eine Stelle geschrieben wird, an der bereits einer vorhanden ist (Position0,1
), und dann nach einer Schleife den Stapel mit Junk gefüllt wird, bevor das Mana ausgeht SequenzU"'i34
.Der resultierende Ausgabecode verwendet den
w
Befehl rite, um das erste Zeichen in der zweiten Zeile in eineR
Nachtumleitung zu ändern (sodass nur eine IP eine Druckanweisung ausführt), wobei die Stapellänge, die sich aus immer größeren Programmen ergibt, geschickt verwendet wird, um den Index zu bestimmen lesen. Jede andere IP ändert denselben Speicherort in denselben Befehl und wird beendet. Alles andere bleibt ungenutzt.Das Bild ist veraltet, aber für die Erklärung des Flusses ausreichend.
Bei jeder Ausführung von
1Iy
bleibt die Fähigkeit der IP erhalten, einen immer größeren Stapel (verursacht durch denl
Befehl) zu verarbeiten, dessen Größe es dem Programm ermöglicht, zu bestimmen, wie viele Kopien des Basisquellcodes vorhanden sind. Das Finale1
wird verwendet, um die vorherigel
auf die erforderliche Zahl zu erhöhen, wenn der Stapel (der als nächstes erstellt wird) gedreht wird, um zum richtigen Wert zu gelangen. DerZ
Befehl negiert diesen Wert, sodass sich der Stapel in die richtige Richtung dreht.Das ursprüngliche Eingabearray wird dann im kontinuierlichen Lesemodus codiert und mit einer 0 versehen, um zu vermeiden, dass derselbe Wert schrittweise geändert wird, um die ursprünglichen Eingaben zu lesen. Der Leerzeichen-NOP ist erforderlich, um den kontinuierlichen Lesemodus zu verlassen und der nachfolgenden 0 zu ermöglichen, den Stapel erneut zu füllen.
Score sollte ungefähr gleich
3+v.toString().length
für jeden Array - Eintragv
,+23
für jedes Array. Ungefähr(2.55*total length of input)
oder33837
für die Beispieleingabe, wenn ich die Dinge richtig gemacht habe.In meinem erwarteten endgültigen Programm wurden geringfügige Änderungen aufgrund von Nebenwirkungen vorgenommen, die im selben Build in Bezug auf den
s
Befehl eingeführt wurden. Dies führte jedoch gleichzeitig zu einer besseren Punktzahl.quelle