Інтерпретувати повторення!


11

Цей виклик є першим у серії із двох викликів про повторення. Незабаром буде другий.

У мові під назвою Повторення (те, що я щойно склав) складається нескінченна струна 12345678901234567890...з 1234567890повторенням назавжди.

Для виведення чисел доступний наступний синтаксис:

  • +-*/: Це вставляє оператора в рядок повторюваних цифр.
    • Приклади:
      • +-> 1+2= 3( +Вставляє +між 1і 2)
      • +*-> 1+2*3= 1+6= 7(Те саме, що вище, за винятком того, що зараз використовуються два оператори)
      • /-> 1/2= 0(Для повторення використовується ціле ділення)
      • //-> 1/2/3= 0/3= 0(Для повторення використовується "ліва асоціація" з декількома відніманнями та діленнями)
    • Кожен оператор вставляється таким чином, щоб він мав одну цифру ліворуч, якщо їх немає c(див. Нижче).
  • c: З'єднується з наступною цифрою у рядку.
    • Приклади:
      • c+-> 12+3= 15( c"Продовжує" 1і з'єднує його з наступною цифрою ,, 2щоб утворити 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Дужки для обробки чисел.
    • Приклади:
      • (c+)*-> (12+3)*4= 15*4= 60(Повторення використовує порядок операцій)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Пропустити число (видаляє число з нескінченного рядка).
    • s+-> 2+3= 5( sпропускає 1)
    • csc-> 124(Перші cконмати 1та 2, sпропуски 3та заключні cконмати 12до 4)
    • +s+-> 7(Перший +додає 1і 2зробити 3, sскаче 3, а остаточний +додає 3до 4робити 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

У наведених вище прикладах використовується лише обмежена кількість цифр у нескінченному рядку. Кількість використаних цифр еквівалентна number of operators, concats and skips + 1.

Ваше завдання полягає в тому, що вам надається рядок коду повторення, виведіть результат.

Прикладами введення та виведення є:

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

Це код гольфу, тому найкоротший код у байтах виграє!

Технічні характеристики:

  • Вам гарантовано, що результат ніколи не буде вище 2^31-1.
  • Ви також гарантуєте, що вхід буде складатися лише з символів +-*/cs().
  • Порожня програма виведе 1.

Що з ~s? Не залишайте нас повішеними.
Роберт Фрейзер

@RobertFraser Уопс, це була помилка - c спочатку ~, але, схоже, я це не виправив повністю.
клісмік

1
@TonHospel О-о, у вас є хороший момент. Символ "s" по суті видаляє число, з яким воно пов'язане, з нескінченного рядка, так що це так для обох сценаріїв.
клісмік

2
Ваша специфікація , однак каже , що s+це в 2+3якості першого прикладу. І все ще sмене клопоче. Цікаво, як +s()+розширюється. Якщо це 1+(2)+4тоді (приходить раніше, 2але те, sщо приходить навіть до того, як, (здавалося б, все ще пропускає 3, ні 2. Якщо результат є, 1+(3)+4то ефект sзалежить від того, що буде після нього (порівняйте +s+)
Тон Євангелія

1
scє 23і s+є 1+3? Є чи sпропустити в 1даний час або 2? Усі приклади використовують першу операцію на операндах 1і 2... так scмає бути 13.
Тит

Відповіді:


4

JavaScript (ES6), 110 байт

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

Дуже просте, але ціле ділення додає 25 байт. Чомусь регулярний вираз в JS не може відповідати як початку рядка, так і першому символу, так що додається також кілька байтів.

Як це працює

  1. Додайте пробіл до вводу.
  2. Додайте наступну цифру до кожного символу (за винятком )), який не знаходиться безпосередньо перед a (.
  3. Видаліть кожну c, цифру + sна початку ( 1s2-> 2), а кожну s+ цифру ( 3s4-> 3).
  4. Перетворіть кожну операцію поділу на int-поділ ( 1/2-> (1/2|0)).
  5. Оцініть і поверніть.

Гаразд ... у вашій програмі є помилка ... ss+повертається 6, коли вона має на меті повернутися 7( sпропуск двох, 1і 2так, +додавання 3та 4).
клісмік

@ Qwerp-Derp Спасибі, виправлено.
ETHproductions

Щось подібне /^|,|$/gбуде відповідати лише один раз на початку, тому що обидва матчі мали б однаковий показник. $не має тієї ж проблеми, тому що у відповідності більше показник, ніж у будь-якого іншого можливого.
Ніл

0

Пакетна, 332 байти

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

Поведінка sробить це дуже незручно. (Можливо, csслід оцінювати до 13і -sдо -2?) Змінні:

  • s рядок введення (явно проміщено, тому що set / p не змінює змінну, якщо ви нічого не вводите)
  • eчасткове вираження в нормальній цілій арифметиці (яку ми можемо передати set/aяк форму eval)
  • d наступна цифра з нескінченного рядка цифр
  • rправа рука останнього оператора. Ми не можемо це відразу приєднати, тому що (потрібно прийти першим, але нам потрібно зберігати його, щоб sне збільшувати його. На щастя, це в кінцевому підсумку робить обробку )трохи легшою.
  • c поточний персонаж.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.