Эта задача состоит в том, чтобы просто вернуть список списков целых чисел, аналогично функции диапазона Python, за исключением того, что каждое последующее число должно быть так глубоко в списках.
Правила :
- Создать программу или неанонимную функцию
- Должен вернуть или распечатать результат
- Результат должен быть возвращен в виде списка (списков) или массива (массивов)
- Если параметр равен нулю, вернуть пустой список
- Это должно быть в состоянии обработать целочисленный параметр 0 <= n <70.
- (рекурсивные решения взрываются довольно быстро)
- Функция должна вызываться только с одним параметром.
- Другое поведение не определено.
- Это код гольф, поэтому выигрывает самый короткий код.
Пример вызова:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Тестовые случаи:
0 => []
1 => [0]
2 => [0, [1]]
6 => [0, [1, [2, [3, [4, [5]]]]]]
26 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25]]]]]]]]]]]]]]]]]]]]]]]]]]
69 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25, [26, [27, [28, [29, [30, [31, [32, [33, [34, [35, [36, [37, [38, [39, [40, [41, [42, [43, [44, [45, [46, [47, [48, [49, [50, [51, [52, [53, [54, [55, [56, [57, [58, [59, [60, [61, [62, [63, [64, [65, [66, [67, [68]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
РЕДАКТИРОВАТЬ: ответ Исаака является самым коротким до сих пор. Я обновлю принятый ответ, если кто-нибудь найдет более короткий ответ на языке, существовавшем на момент подачи заявки. Спасибо за игру!
code-golf
array-manipulation
mbomb007
источник
источник
import math
например, в Python, я не думаю, что он может происходить внутри функции.Ответы:
Pyth, 13 байт
Попробуй это здесь.
источник
APL (
1318)Предполагая
⎕IO=0
:Объяснение:
×⍵:
если⍵
положительно,,∘⊂∘,
: присоединить левый операнд к вложению правого операнда (то естьx ,∘⊂∘, y = [x, [y]]
)/
: уменьшить⍳⍵
: числа0..⍵-1
⊃
: раскрыть результат⋄
: иначе⍬
: вернуть пустой список/
сбой⍬
и⍳0
дает пустой список.)Приложение:
Эта функция возвращает вложенный массив. Тем не менее, это немного трудно сказать по выводу APL по умолчанию. Он разделяет элементы массива по пробелам, поэтому вы можете сказать, что вложенность только по двойным пробелам. Вот функция, которая будет принимать вложенный массив и возвращать строку, форматируя вложенный массив в стиле Python (т.е.
[a,[b,[c,...]]]
).источник
f←
в начало вашей программы, если вы не измените ее, чтобы принять пользовательский ввод.Haskell, 67 байт
В Haskell все элементы списка должны быть одного типа, поэтому я не могу смешивать целые числа со списком целых чисел, и мне нужно определить пользовательский тип списка
L
. Вспомогательная функция#
рекурсивно создает необходимый список. Основная функцияp
проверяет пустой список и вызывает в#
противном случае.Поскольку новые типы данных не могут быть напечатаны по умолчанию (правила позволяют просто вернуть список), я добавлю еще немного кода для демонстрации:
В настоящее время:
источник
Python, 48 байт
Использование умножения списка для обработки особого случая.
источник
*(i<n-1)
может быть сделано как[:n+~i]
, так как это одноэлементный список.Математика, 33
источник
CJam, 16 байтов
Это полная программа. Он принимает ввод через STDIN и печатает окончательный массив в STDOUT.
Как и с другой записью CJam,
0
input будет печататься,""
поскольку это представление пустого массива в CJam.Как это работает :
Попробуйте это онлайн здесь
источник
JavaScript (ES6) 40
Рекурсивное решение, довольно надежное, без ударов. Сбой обновления около 6500 с «слишком большой рекурсией»
Итеративное решение (45) Нет ограничений, кроме использования памяти
Попробуйте F (1000): консоль FireBug не покажет вам более 190 вложенных массивов, но они есть
источник
Java,
88107105104102 байтаДовольно долго по сравнению с другими, хотя с Java вы не сможете добиться большего успеха. Проверка, чтобы определить, продолжать ли рекурсию, - это все, что нужно.
источник
import java.util.*;
для этого , чтобы быть самостоятельной , содержащая (полностью или квалификациюjava.util.List
иjava.util.Stack
, но это гораздо больше). +19, чтобы сделать его 107, все еще на 7 лучше, чем ответ Java, над которым я работал: Do!=n
может бытьo<n
, и вы можете поменять троицу наo<n?o++:""
.final
наint n
может быть удален.Python 2, 56 байт
Я подозреваю, что это может быть в гольфе больше.
тесты:
источник
CJam, 17 байт
Я знаю, что Оптимизатор нашел 16, но вот лучшее, что я могу сделать:
Это блок, наиболее близкий к функции в CJam, которая берет целое число в стеке и оставляет желаемый вложенный массив.
Используйте эту программу для проверки , которая помещает входные данные в стек, затем вызывает функцию и проверяет стек. Обратите внимание, что для
0
, вывод стека будет содержать""
- это собственное представление CJam пустого массива.источник
Руби 46
Проверьте это онлайн: http://ideone.com/uYRVTa
источник
C # - 100
Простая рекурсия. Проверьте нулевой особый случай и отметьте одну переменную, а другую -
C ++ 87
(Visual C ++ 2012)
Это замечательно, я имею в виду византийский, но это та же основная идея, что и C # один.
Это реализация массива в стиле C, поэтому он не дает вам массив, он дает указатель на int, в котором я хранил как int, так и другие указатели. Так:
[0,*] *->[1,#] #-> [2,&] &-> etc
где символы представляют собой псевдокод значения int для указателя, а -> - это место, куда он указывает в памяти.Какую превосходную простую в использовании реализацию зубчатых массивов в стиле c я разработал (кашель), но я утверждаю, что это достаточно правдоподобно, чтобы соответствовать правилам вопроса.
Здесь довольно много злоупотреблений троичными операторами, а также довольно много злоупотреблений неявным приведением от int к bool.
Пример: если мы позволим
int *bar = (int*)A(3);
, мы можем увидеть:Что является указателем разговора для [0, [1, [2]]].
В порядке прекрасно. На самом деле это не должно быть ужасно. Вот некоторый тестовый код для запуска этого кода C ++:
}
источник
C++
.Array g(params object[]a)=>a;Array f(int y,int x=0)=>y<1?g():y<2?g(x):g(x,f(y-1,x+1));
Pyth, 15 байт
Что действительно говорит в Python:
источник
qJ_1
так же, как!Q
. И наJtQ
самом деле тратит 1 байт.?Y!Qu[HG)_UtQ[tQ
[tQ
на]tQ
, что эквивалентно, вы поменяете местами порядок операций?
, чтобы вы могли заменить!Q
наQ
. В результате?u[HG)_UtQ]tQQY
- сохраняется еще 1 байт.Haskell ,
65 59 4541 байтЭти вложенные списки имеют ту же структуру данных, что и корневые
Tree
s, за исключением того, что они также могут быть пустыми. Следовательно, мы можем использовать их список - также называемый a,Forest
чтобы представлять их.Попробуйте онлайн!
объяснение
Прежде всего нам нужно реализовать
Tree
тип данных:Оттуда это просто рекурсия, использующая два параметра
m
(считая) иn
отслеживая, когда завершить:Альтернатива, 61 байт
Попробуйте онлайн!
объяснение
Функция
unfoldForest
принимает список начальных значений и функциюx -> (y,[x])
. Для каждого начального значенияx
оно разворачивает дерево, используя функцию, создавая кортеж,(y,xs)
гдеy
он становится корнем иxs
используется для повторения процедуры:источник
Perl - 44
Добавлю объяснения по запросу. Вы можете попробовать это здесь .
источник
nil
или что-то подобное? Я спрашиваю, потому что на странице вы ссылаетесь на самый внутренний массив выглядит как(3,)
undef
является эквивалентомnil
илиnull
в Perl, и нет дополнительного элемента. Perl выравнивает массивы, так что это создает вложенные ссылки на массивы.JavaScript, 93 байта
Это не идеально, но я мог бы попробовать. Я попробую сыграть в эту игру позже, хотя пока я не вижу очевидного пути.
источник
Python, 75 байт
Это просто для галочки. Это программа, которую я написал при создании / разработке этого задания.
источник
Python, 44
Рекурсивно создает дерево. В
[:n]
конце приведен специальный случай,n==0
в котором указан пустой список.источник
and
иor
может иметь пробелы рядом с целыми числами, ноelse
не могу.else
начинается сe
, и такие вещи, как1e6
действительные числовые литералы.else
, например,x = 1 if y==2else 5
работы.Джо , 8 байт
Примечание: это неконкурентный ответ. Первая версия Джо была выпущена после этого вопроса.
Что же мы имеем здесь?
F:
определяет функцию F, которая является цепочкой/+,
,M]
иR
. Когда вы звонитеFn
, сначалаRn
оценивается, возвращая диапазон от 0 до n, исключая.M]
оборачивает каждый элемент в список. Затем список применяется к/+,
.x +, y
возвращаетсяx + [y]
./
это правильная складка. Таким образом,/+,a b c d...
возвращается[a, [b, [c, [d...]]]
.Пример вызова (код имеет отступ 3, вывод 0):
источник
Ruby - рекурсивная версия - 52
Нерекурсивная версия:
666257Пример вывода (одинаково для обеих версий)
Нерекурсивная версия может обрабатывать произвольно большой ввод.
Обе версии также изящно принимают отрицательные числа
источник
stack level too deep (SystemStackError)
)PHP 5.4 (67 байт):
Знаю, знаю.
Это далеко не самый короткий ответ.
Но это работает!
Вот:
Вы можете проверить это прямо здесь: https://ideone.com/42L35E (игнорируйте ошибку)
Javascript (57 байт):
Это тот же самый точный код за исключением того, что Javascript требователен к возврату, и я сократил имена переменных:
Видеть? Тот же код!
ES6 (49 байт):
В основном тот же самый точный код, но сокращенный для ES6:
источник
f=lambda
...But it's pretty standard codegolf for functions that they have to be callable by name (aka, more than once and without typing the entire function again.)
-> никогда не слышал об этом, и я использую этот сайт в течение почти года. Кроме того, это неверный аргумент, так как вы можете назначать функции переменной.Javascript (114 байт):
Все остальные делали рекурсивные действия, поэтому я хотел попробовать итеративное решение. У меня слишком много особых случаев.
Я держу основной список, а затем зацикливаю и добавляю новые списки с новыми номерами.
источник
Common Lisp (95 байт):
источник
JavaScript,
3537 байтРекурсивное решение
Попробуйте онлайн!
источник
05AB1E , 11 байт
Попробуйте онлайн или проверьте все контрольные примеры .
11-байтовая альтернатива:
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
05AB1E не имеет циклов, которые идут вниз, поэтому для цикла в диапазоне
(input, 0]
я должен либо:ݨR
создайте диапазон[0, input]
, удалите последний элемент, поверните вспять), а затем зациклите его (vy
);[0, input)
Вместо этого используйте цикл в диапазоне (F
) и возьмите абсолютную разницу между индексом цикла и значением input-1 (NI<α
).источник