Dans les langages de style Lisp, une liste est généralement définie comme ceci:
(list 1 2 3)
Aux fins de ce défi, toutes les listes ne contiendront que des entiers positifs ou d'autres listes. Nous laisserons également de côté le list
mot - clé au début, donc la liste ressemblera maintenant à ceci:
(1 2 3)
Nous pouvons obtenir le premier élément d'une liste en utilisant car
. Par exemple:
(car (1 2 3))
==> 1
Et nous pouvons obtenir la liste d'origine avec le premier élément supprimé avec cdr
:
(cdr (1 2 3))
==> (2 3)
Important: cdr
retournera toujours une liste, même si cette liste aurait un seul élément:
(cdr (1 2))
==> (2)
(car (cdr (1 2)))
==> 2
Les listes peuvent également figurer dans d'autres listes:
(cdr (1 2 3 (4 5 6)))
==> (2 3 (4 5 6))
Écrivez un programme qui renvoie du code qui utilise car
et cdr
pour renvoyer un certain entier dans une liste. Dans le code renvoyé par votre programme, vous pouvez supposer que la liste est stockée dans l
, l'entier cible est l
quelque part et que tous les entiers sont uniques.
Exemples:
Contribution: (6 1 3) 3
Production: (car (cdr (cdr l)))
Contribution: (4 5 (1 2 (7) 9 (10 8 14))) 8
Production: (car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))
Contribution: (1 12 1992) 1
Production: (car l)
la source
(1 2 3) 16
est-il, reviendrons-nous()
?(1 2 3) 16
ci n'apparaîtra jamais.Réponses:
CJam, 59
Essayez-le en ligne
Explication:
la source
Lisp commun, 99
La solution suivante de 99 octets est une version CL de la belle réponse Scheme .
À l'origine, j'ai essayé d'utiliser
position
etposition-if
, mais il s'est avéré que ce n'était pas aussi compact que j'aurais aimé (209 octets):Étendu
Exemple
La liste est citée, mais si vous voulez vraiment, je peux utiliser une macro. La valeur renvoyée est [1] :
Pour les tests, j'avais l'habitude de générer un formulaire lambda où se
l
trouvait une variable:L'appel avec la liste d'origine renvoie 14.
[1]
(caddar (cddddr (caddr l)))
serait bien aussila source
Retina ,
170142125115114878483757370696867 octetsOui,
moins de 50% deplus de 100 octets sur ma première tentative. :)Pour exécuter le code à partir d'un seul fichier, utilisez l'
-s
indicateur.Je ne suis toujours pas convaincu que ce soit optimal ... Je n'aurai pas beaucoup de temps dans les prochains jours, j'ajouterai éventuellement une explication.
la source
Pyth, 62 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
Le premier bit
JvXz"() ,][")
remplace les caractères"() "
par les caractères"[],"
de la chaîne d'entrée, qui se termine par une représentation d'une liste de style Python. Je l'évalue et je la stockeJ
.Ensuite, je réduis la chaîne
G = "l"
avecu...\l
. J'applique la fonction interne à...
plusieurs reprisesG
jusqu'à ce que la valeur deG
ne change plus, puis j'imprimeG
.La fonction interne fait ce qui suit: Si
J
est déjà égal au numéro d'entrée, alors ne modifiez pasG
(?qJQG
). Sinon, je vais aplatir la listeJ[:1]
et vérifier si le numéro d'entrée est dans cette liste et l'enregistrer dans la variableK
(K}Quu+GHNY<J1)
). Notez que Pyth n'a pas d'opérateur d'aplatissement, donc cela prend pas mal d'octets. SiK
c'est vrai, je mets à jour J avecJ[0]
, sinon avecJ[1:]
(=J?KhJtJ
). Et puis je remplaceG
par"(cdr G)"
et remplace led
thea
, ifK
est vrai (++XWK"(cdr "\d\aG\)
).la source
Schéma (R5RS), 102 octets
la source
PHP - 177 octets
J'ai ajouté quelques nouvelles lignes pour la lisibilité:
Voici la version non golfée:
la source
Haskell,
190188 octetsl "(4 5 (1 2 (7) 9 (10 8 14)))" 8
évalue à
"(car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))"
la source
(
etc
en fonctionc
en une chaîne:c(h:s)="(c"++h:...
h
être un Char!Lisp commun,
168155octetsQuelque chose de récursif stupide, il pourrait probablement être un peu plus condensé:
Assez imprimé:
la source