Мотивация : иногда вам нужно знать, где вы находитесь в строке. Вы хотите иметь возможность просматривать любую часть строки и точно знать, где вы находитесь, насколько это возможно.
Задача : написать программу для вывода строки рулетки заданной длины. Рулетка строка сам описывает ее длины так далеки , как часто , насколько это возможно по его собственной длине.
правила :
- Ваша программа должна принимать один положительный целочисленный параметр для общей длины строки рулетки
- Для каждой непрерывной цепочки цифр в выходных данных эти цифры должны точно указывать длину выходных данных - включительно !
- Длина измеряется от начала строки до конца каждого числа
- В строку должно быть включено как можно большее число чисел
- Избегайте двусмысленности. Разделители / разделители могут использоваться, чтобы избежать наложения чисел, т.е.
12
говорит двенадцать, а не один, два. - Строка всегда должна точно указывать общую длину в конце, без конечных разделителей.
- Возможно, вам понадобится несколько разделителей, чтобы сохранить точность длины, например, вот пример строки с рулеткой длиной 4:
1--4
Непредставительные / исчерпывающие примеры:
- рулетка длиной 1:
1
- Строка рулетка длиной 2:
-2
- рулетка длиной 3:
1-3
- рулетка длиной 4
1--4
или-2-4
(обе длины отчета как можно чаще, т. е. дважды, и заканчиваются правильной общей длиной) - Строка рулетка длиной 10:
1-3-5-7-10
- строка рулетки длиной 11:
1-3-5-7--11
или1-3-5--8-11
или1-3--6-8-11
или1--4-6-8-11
или-2-4-6-8-11
(все имеют как можно больше чисел длины и заканчиваются общей длиной строки)
-
, и вам нужно иметь столько меток длины, сколько вы можете в строке?0
.Ответы:
Python,
50484746 байтобъяснение
Довольно простое рекурсивное лямбда-решение
Наши базовые случаи равны 1 и 0, которые покрываются
"1"*x
иначе, мы получаем строку-x
с`-x`
и добавляем результат вызова функции наlen(`-x`)
less.источник
-x
?Mathematica,
6757 байтСпасибо Мартину Эндеру за удаление 10 байт!
Безымянная функция, принимающая неотрицательный целочисленный аргумент и возвращающая строку. Довольно очевидный рекурсивный алгоритм: убедитесь, что строка заканчивается вводимым числом, которому предшествует a
"-"
, и затем снова вызовите функцию, используя#0
.Но при реализации этого алгоритма можно получить удовольствие от игры в гольф.
""["1"][[#]]
обозначает#
аргумент th выражения""["1"]
: 0""
-й аргумент является заголовком"1"
, а 1-й аргумент является видимым , что обеспечивает базовые случаи рекурсии. Если#
превышает 1, то""["1"][[#]]
выдает сообщение об ошибке и остается как неоцененная функция. Но тогда/._@__:>
есть правило, которое принимает любую неоцененную функцию и преобразует ее в следующее выражение, которое является рекурсивным вызовом исходной функции.Исходное представление:
источник
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&
сохраняет один байт, избегаяIf
и кучу байтов, избегаяIntegerString
и"-"<>
._@__
это злая магияJavaScript (ES6), 49 байт
источник
f
Pyth, 23 байта
Откровенно украл рекурсивное решение из ответа Волшебника Пшеницы . Кроме того, я считаю, что это не игра в гольф должным образом.
Попробуй это здесь!
источник
Perl 6 , 43 байта
Объяснение:
Так, например, для ввода 10 он генерирует последовательность
(-10, -7, -5, -3, -1)
, и из этой строки-1-3-5-7-10
, и из этой конечной строки1-3-5-7-10
.Попробуйте онлайн .
источник