In Sprachen im Lisp-Stil wird eine Liste normalerweise folgendermaßen definiert:
(list 1 2 3)
Für die Zwecke dieser Herausforderung enthalten alle Listen nur positive ganze Zahlen oder andere Listen. Wir lassen das list
Schlüsselwort auch am Anfang weg , daher sieht die Liste jetzt so aus:
(1 2 3)
Wir können das erste Element einer Liste erhalten, indem wir verwenden car
. Beispielsweise:
(car (1 2 3))
==> 1
Und wir können die ursprüngliche Liste mit dem ersten Element erhalten, das mit entfernt wird cdr
:
(cdr (1 2 3))
==> (2 3)
Wichtig: cdr
Gibt immer eine Liste zurück, auch wenn diese Liste ein einzelnes Element enthalten würde:
(cdr (1 2))
==> (2)
(car (cdr (1 2)))
==> 2
Listen können sich auch in anderen Listen befinden:
(cdr (1 2 3 (4 5 6)))
==> (2 3 (4 5 6))
Schreiben Sie ein Programm, das Code zurückgibt, der eine bestimmte Ganzzahl in einer Liste verwendet car
und zurückgibt cdr
. In dem Code, den Ihr Programm zurückgibt, können Sie davon ausgehen, dass die Liste gespeichert ist l
, dass sich die Ziel-Ganzzahl l
irgendwo befindet und dass alle Ganzzahlen eindeutig sind.
Beispiele:
Eingang: (6 1 3) 3
Ausgabe: (car (cdr (cdr l)))
Eingang: (4 5 (1 2 (7) 9 (10 8 14))) 8
Ausgabe: (car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))
Eingang: (1 12 1992) 1
Ausgabe: (car l)
quelle
(1 2 3) 16
, sollen wir zurückkehren()
?(1 2 3) 16
dieser niemals angezeigt wird.Antworten:
CJam, 59
Probieren Sie es online aus
Erläuterung:
quelle
Common Lisp, 99
Die folgende 99-Byte-Lösung ist eine CL-Version der Nizza- Schema-Antwort .
Ich habe ursprünglich versucht,
position
und zu verwendenposition-if
, aber es stellte sich heraus, dass es nicht so kompakt war, wie ich es gerne gehabt hätte (209 Bytes):Erweitert
Beispiel
Die Liste ist zitiert, aber wenn Sie wirklich wollen, kann ich ein Makro verwenden. Der zurückgegebene Wert ist [1] :
Für Tests habe ich eine Lambda-Form generiert, bei der
l
es sich um eine Variable handelte:Wenn Sie dies mit der ursprünglichen Liste aufrufen, wird 14 zurückgegeben.
[1]
(caddar (cddddr (caddr l)))
wäre auch nettquelle
Retina ,
170142125115114878483757370696867 BytesJa,
weniger als 50% vonmehr als 100 Bytes aus meinem ersten Versuch. :)Verwenden Sie das
-s
Flag, um den Code aus einer einzelnen Datei auszuführen .Ich bin immer noch nicht überzeugt, dass dies optimal ist ... Ich werde in den nächsten Tagen nicht viel Zeit haben, ich werde irgendwann eine Erklärung hinzufügen.
quelle
Pyth, 62 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
Das erste Bit
JvXz"() ,][")
ersetzt die Zeichen"() "
durch die Zeichen"[],"
in der Eingabezeichenfolge, was zur Darstellung einer Liste im Python-Stil führt. Ich bewerte es und speichere es inJ
.Dann reduziere ich den String
G = "l"
mitu...\l
. Ich wende die innere Funktion...
wiederholt anG
, bis sich der Wert vonG
nicht mehr ändert, und drucke dannG
.Die innere Funktion führt Folgendes aus: Wenn
J
bereits gleich der eingegebenen Nummer ist, ändern Sie nichtG
(?qJQG
). Ansonsten mache ich die Liste flachJ[:1]
und überprüfe, ob sich die eingegebene Nummer in dieser Liste befindet und speichere diese in der VariablenK
(K}Quu+GHNY<J1)
). Beachten Sie, dass Pyth keinen Flatten-Operator hat. Dies nimmt also einige Bytes in Anspruch. WennK
ja, dann aktualisiere ich J mitJ[0]
, ansonsten mitJ[1:]
(=J?KhJtJ
). Und dann ersetze ichG
mit"(cdr G)"
und ersetzed
dasa
, wennK
es wahr ist (++XWK"(cdr "\d\aG\)
).quelle
Schema (R5RS), 102 Bytes
quelle
PHP - 177 Bytes
Ich habe einige Zeilen hinzugefügt, um die Lesbarkeit zu verbessern:
Hier ist die ungolfed Version:
quelle
Haskell,
190188 Bytesl "(4 5 (1 2 (7) 9 (10 8 14)))" 8
bewertet zu
"(car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))"
quelle
(
undc
in Funktionc
in eine Zeichenfolge verwandeln :c(h:s)="(c"++h:...
h
wenn man ein Char wäre!Common Lisp,
168.155BytesIrgendeine blöde Rekursionssache, es könnte wahrscheinlich ein bisschen mehr komprimiert werden:
Schön gedruckt:
quelle