Стрічка вимірювання рядка


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 - якомога більше цифр повинно бути вміщено в рядок.
Опублікувати Rock Garf Hunter


@EasterlyIrk у вас не можуть бути всі тире, оскільки це не відповідає мотивації та порушує правила 3 ​​і 5. Індексації немає. Просто довжини. Так що ні, стрічковий рядок довжиною один, не може бути 0.
Том Вінер

Відповіді:


12

Пітон, 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`)менше.


1
Чи можете ви зберегти байти шляхом строфікації -x?
Мартін Ендер

@MartinEnder Добре, що я працював. Дякую за пораду! Я відчуваю себе німим німим, коли не помічав цього раніше.
Пост Рок-Гарф Мисливець

5

Математика, 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
omg, _@__це зла магія
Грег Мартін

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.