Интерпретировать повторение!

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(Первые cconcats 1и 2, в sскачет 3, а окончательный cconcats 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.
clismique
источник
Как насчет ~с? Не оставляй нас в покое.
Роберт Фрейзер
@RobertFraser К сожалению, это была ошибка - изначально она была ~, но, похоже, я не полностью это исправил.
clismique
1
@TonHospel Ох, у тебя есть хорошая мысль. Символ "s" по существу удаляет число, с которым он связан, из бесконечной строки, так что это да для обоих сценариев.
clismique
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. Оцените и верните.
ETHproductions
источник
ОК ... в вашей программе есть ошибка ... ss+возвращается 6, когда она должна вернуться 7(два sпропускаются, 1а 2значит +добавляет 3и 4).
clismique
@ 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 текущий персонаж
Нил
источник