В языках стиля Лисп список обычно определяется так:
(list 1 2 3)
Для целей этой задачи все списки будут содержать только положительные целые числа или другие списки. Мы также пропустим list
ключевое слово в начале, поэтому список теперь будет выглядеть так:
(1 2 3)
Мы можем получить первый элемент списка, используя car
. Например:
(car (1 2 3))
==> 1
И мы можем получить исходный список с первым элементом, удаленным с помощью cdr
:
(cdr (1 2 3))
==> (2 3)
Важно: cdr
всегда будет возвращать список, даже если этот список будет иметь один элемент:
(cdr (1 2))
==> (2)
(car (cdr (1 2)))
==> 2
Списки также могут быть внутри других списков:
(cdr (1 2 3 (4 5 6)))
==> (2 3 (4 5 6))
Напишите программу, которая возвращает код, который использует car
и cdr
возвращает определенное целое число в списке. В коде, который возвращает ваша программа, вы можете предполагать, что список хранится в нем l
, целевое целое число находится l
где-то, и что все целые числа уникальны.
Примеры:
Входные данные: (6 1 3) 3
Выход: (car (cdr (cdr l)))
Входные данные: (4 5 (1 2 (7) 9 (10 8 14))) 8
Выход: (car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))
Входные данные: (1 12 1992) 1
Выход: (car l)
источник
(1 2 3) 16
, мы вернемся()
?(1 2 3) 16
никогда не будет отображаться.Ответы:
CJam, 59
Попробуйте онлайн
Объяснение:
источник
Common Lisp, 99
Следующее 99-байтовое решение является CL-версией хорошего ответа схемы .
Изначально я пытался использовать
position
иposition-if
, но он оказался не таким компактным, как хотелось бы (209 байт):расширенный
пример
Список цитируется, но если вы действительно хотите, я могу использовать макрос. Возвращаемое значение [1] :
Для тестов я использовал лямбда-форму, где
l
была переменная:Вызов этого с первоначальным списком возвращает 14.
[1]
(caddar (cddddr (caddr l)))
тоже было бы неплохоисточник
Сетчатка ,
170142125115114878483757370696867 байтДа,
менее 50% изболее чем 100 байтов от моей первой попытки. :)Чтобы запустить код из одного файла, используйте
-s
флаг.Я все еще не уверен, что это оптимально ... У меня не будет много времени в течение следующих нескольких дней, я добавлю объяснение в конце концов.
источник
Pyth, 62 байта
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
Первый бит
JvXz"() ,][")
заменяет символы"() "
на символы"[],"
входной строки, которая заканчивается представлением списка в стиле Python. Я оцениваю это и сохраняю вJ
.Затем я уменьшаю строку
G = "l"
сu...\l
. Я...
неоднократно применяю внутреннюю функцию доG
тех пор, пока значениеG
больше не изменится, а затем печатаюG
.Внутренняя функция делает следующее: Если число
J
уже равно номеру ввода, то не изменятьG
(?qJQG
). В противном случае я сведу списокJ[:1]
и проверим, есть ли введенный номер в этом списке, и сохраню его в переменнойK
(K}Quu+GHNY<J1)
). Обратите внимание, что у Pyth нет оператора flatten, так что это занимает довольно много байтов. ЕслиK
это правда, то я обновляю J с помощьюJ[0]
, в противном случае сJ[1:]
(=J?KhJtJ
). А потом я заменяюG
с"(cdr G)"
и заменить , если верно ( ).d
a
K
++XWK"(cdr "\d\aG\)
источник
Схема (R5RS), 102 байта
источник
PHP - 177 байт
Я добавил несколько строк для удобства чтения:
Вот негольфированная версия:
источник
Haskell,
190188 байтl "(4 5 (1 2 (7) 9 (10 8 14)))" 8
оценивает
"(car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))"
источник
(
иc
в функциюc
в строку:c(h:s)="(c"++h:...
h
Чаром!Common Lisp,
168155 байтНекоторая глупая вещь рекурсии, это, вероятно, может быть сжато немного больше:
Довольно напечатано:
источник