En los idiomas de estilo Lisp, una lista generalmente se define así:
(list 1 2 3)
Para los propósitos de este desafío, todas las listas solo contendrán enteros positivos u otras listas. También dejaremos de lado la list
palabra clave al principio, por lo que la lista ahora se verá así:
(1 2 3)
Podemos obtener el primer elemento de una lista usando car
. Por ejemplo:
(car (1 2 3))
==> 1
Y podemos obtener la lista original con el primer elemento eliminado con cdr
:
(cdr (1 2 3))
==> (2 3)
Importante: cdr
siempre devolverá una lista, incluso si esa lista tuviera un solo elemento:
(cdr (1 2))
==> (2)
(car (cdr (1 2)))
==> 2
Las listas también pueden estar dentro de otras listas:
(cdr (1 2 3 (4 5 6)))
==> (2 3 (4 5 6))
Escriba un programa que devuelva el código que usa car
y cdr
para devolver cierto número entero en una lista. En el código que devuelve su programa, puede suponer que la lista está almacenada l
, el entero objetivo está enl
algún lugar y que todos los enteros son únicos.
Ejemplos:
Entrada: (6 1 3) 3
Salida: (car (cdr (cdr l)))
Entrada: (4 5 (1 2 (7) 9 (10 8 14))) 8
Salida: (car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))
Entrada: (1 12 1992) 1
Salida: (car l)
fuente
(1 2 3) 16
si regresamos()
?(1 2 3) 16
lo que nunca se mostrará un caso como .Respuestas:
CJam, 59
Pruébalo en línea
Explicación:
fuente
Lisp común, 99
La siguiente solución de 99 bytes es una versión CL de la buena respuesta de Scheme .
Originalmente intenté usar
position
yposition-if
, pero resultó no ser tan compacto como me hubiera gustado (209 bytes):Expandido
Ejemplo
La lista está citada, pero si realmente quieres, puedo usar una macro. El valor devuelto es [1] :
Para las pruebas, solía generar una forma lambda donde
l
era una variable:Llamar a esto con la lista original devuelve 14.
[1] también
(caddar (cddddr (caddr l)))
sería buenofuente
Retina ,
170142125115114878483757370696867 bytesSí,
menos del 50% demás de 100 bytes de mi primer intento. :)Para ejecutar el código desde un solo archivo, use el
-s
bandera.Todavía no estoy convencido de que esto sea óptimo ... No tendré mucho tiempo en los próximos días, eventualmente agregaré una explicación.
fuente
Pyth, 62 bytes
Pruébelo en línea: demostración o pruebas
Explicación:
El primer bit
JvXz"() ,][")
reemplaza los caracteres"() "
con los caracteres"[],"
en la cadena de entrada, que termina en una representación de una lista de estilo Python. Lo evalúo y lo guardo enJ
.Luego reduzco la cadena
G = "l"
conu...\l
. Aplico la función interna...
varias vecesG
hasta que el valor deG
ya no cambia y luego imprimoG
.La función interna hace lo siguiente: Si
J
ya es igual al número de entrada, no modifiqueG
(?qJQG
). De lo contrario, aplanaré la listaJ[:1]
y comprobaré si el número de entrada está en esa lista y guardaré esto en la variableK
(K}Quu+GHNY<J1)
). Tenga en cuenta que Pyth no tiene un operador de aplanamiento, por lo que esto requiere bastantes bytes. SiK
es verdadero, entonces actualizo J conJ[0]
, de lo contrario conJ[1:]
(=J?KhJtJ
). Y luego reemplazoG
con"(cdr G)"
y reemplazod
ela
, siK
es verdadero (++XWK"(cdr "\d\aG\)
).fuente
Esquema (R5RS), 102 bytes
fuente
PHP - 177 bytes
He agregado algunas líneas nuevas para facilitar la lectura:
Aquí está la versión sin golf:
fuente
Haskell,
190188 bytesl "(4 5 (1 2 (7) 9 (10 8 14)))" 8
evalúa a
"(car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))"
fuente
(
yc
en funciónc
en una cadena:c(h:s)="(c"++h:...
h
ser un Char!Lisp común,
168bytesAlgo estúpido de recursión, probablemente podría condensarse un poco más:
Bastante impreso:
fuente