Строка рулетка


15

Мотивация : иногда вам нужно знать, где вы находитесь в строке. Вы хотите иметь возможность просматривать любую часть строки и точно знать, где вы находитесь, насколько это возможно.

Задача : написать программу для вывода строки рулетки заданной длины. Рулетка строка сам описывает ее длины так далеки , как часто , насколько это возможно по его собственной длине.

правила :

  1. Ваша программа должна принимать один положительный целочисленный параметр для общей длины строки рулетки
  2. Для каждой непрерывной цепочки цифр в выходных данных эти цифры должны точно указывать длину выходных данных - включительно !
    1. Длина измеряется от начала строки до конца каждого числа
  3. В строку должно быть включено как можно большее число чисел
  4. Избегайте двусмысленности. Разделители / разделители могут использоваться, чтобы избежать наложения чисел, т.е.12 говорит двенадцать, а не один, два.
  5. Строка всегда должна точно указывать общую длину в конце, без конечных разделителей.
  6. Возможно, вам понадобится несколько разделителей, чтобы сохранить точность длины, например, вот пример строки с рулеткой длиной 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(все имеют как можно больше чисел длины и заканчиваются общей длиной строки)

Таким образом, каждая цифра в строке не смежна с другой цифрой, строка состоит полностью из тире -, и вам нужно иметь столько меток длины, сколько вы можете в строке?
Rɪᴋᴇʀ

Можем ли мы использовать индексирование на основе 0?
Rɪᴋᴇʀ

@EasterlyIrk Правило 3 - в строке должно быть как можно больше чисел.
Пост Рок Гарф Хантер


@EasterlyIrk Вы не можете иметь все тире, так как это не соответствует мотивации и нарушает правила 3 ​​и 5. Нет индексации. Просто длины. Так что нет, рулетка длиной один, не может быть 0.
Том Винер

Ответы:


12

Python, 50 48 47 46 байт

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

объяснение

Довольно простое рекурсивное лямбда-решение

Наши базовые случаи равны 1 и 0, которые покрываются "1"*xиначе, мы получаем строку -xс `-x`и добавляем результат вызова функции на len(`-x`)less.


1
Можете ли вы сохранить байты путем строкового преобразования -x?
Мартин Эндер

@MartinEnder Хорошо, я получил его на работу. Спасибо за чаевые! Я чувствую себя глупо, что не заметил этого раньше.
Пост Рок Гарф Хантер

5

Mathematica, 67 57 байт

Спасибо Мартину Эндеру за удаление 10 байт!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

Безымянная функция, принимающая неотрицательный целочисленный аргумент и возвращающая строку. Довольно очевидный рекурсивный алгоритм: убедитесь, что строка заканчивается вводимым числом, которому предшествует a "-", и затем снова вызовите функцию, используя #0.

Но при реализации этого алгоритма можно получить удовольствие от игры в гольф. ""["1"][[#]]обозначает #аргумент th выражения ""["1"]: 0 ""-й аргумент является заголовком "1", а 1-й аргумент является видимым , что обеспечивает базовые случаи рекурсии. Если #превышает 1, то ""["1"][[#]]выдает сообщение об ошибке и остается как неоцененная функция. Но тогда /._@__:>есть правило, которое принимает любую неоцененную функцию и преобразует ее в следующее выражение, которое является рекурсивным вызовом исходной функции.

Исходное представление:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&сохраняет один байт, избегая Ifи кучу байтов, избегая IntegerStringи "-"<>.
Мартин Эндер

1
о боже, _@__это злая магия
Грег Мартин

3

JavaScript (ES6), 49 байт

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
Я думаю, что вам нужно определитьf
Том Винер

@ TomViner Я всегда так делаю. (По крайней мере, у меня был правильный счетчик байтов.)
Нил


1

Perl 6 , 43 байта

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

Объяснение:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

Так, например, для ввода 10 он генерирует последовательность (-10, -7, -5, -3, -1), и из этой строки -1-3-5-7-10, и из этой конечной строки 1-3-5-7-10.

Попробуйте онлайн .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.