Zinterpretuj powtórzenie!

11

To wyzwanie jest pierwszym z serii dwóch wyzwań dotyczących powtórzeń. Druga będzie wkrótce dostępna.

W języku o nazwie Repetition (coś, co właśnie wymyśliłem), składa się z nieskończonego ciągu 12345678901234567890..., z 1234567890powtarzaniem na zawsze.

Dostępna jest następująca składnia liczb wyjściowych:

  • +-*/: Wstawia operator do ciągu powtarzających się cyfr.
    • Przykłady:
      • +-> 1+2= 3( +Wstawia +między 1i 2)
      • +*-> 1+2*3= 1+6= 7(Taki sam jak powyżej, z tym wyjątkiem, że obecnie używa się dwóch operatorów)
      • /-> 1/2= 0(Powtórzenie używa podziału na liczby całkowite)
      • //-> 1/2/3= 0/3= 0(Powtórzenie używa „lewego skojarzenia” z wieloma odejmowaniami i podziałami)
    • Każdy operator jest wstawiany w taki sposób, aby po jego lewej stronie znajdowała się jedna cyfra, chyba że są cyfry c(patrz poniżej).
  • c: Łączy się z następną cyfrą w ciągu.
    • Przykłady:
      • c+-> 12+3= 15( c„kontynuuje” 1i łączy go z następną cyfrą, 2tworząc 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Wsporniki do przetwarzania liczb.
    • Przykłady:
      • (c+)*-> (12+3)*4= 15*4= 60(Powtórzenie używa kolejności operacji)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Pomiń liczbę (usuwa liczbę z nieskończonego ciągu).
    • s+-> 2+3= 5( spomija 1)
    • csc-> 124(pierwszy cconcats 1i 2, że spomija 3i końcowe cconcats 12do 4)
    • +s+-> 7(Pierwszy +dodaje 1i 2zrobić 3, sprzeskakuje 3, a ostateczna +dodaje 3się 4zrobić 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

W powyższych przykładach użyto tylko skończonej liczby cyfr w nieskończonym ciągu. Liczba użytych cyfr jest równa number of operators, concats and skips + 1.

Twoim zadaniem jest, jeśli otrzymasz ciąg kodu powtórzenia, wypisz wynik.

Przykładami danych wejściowych i wyjściowych są:

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

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!

Okular:

  • Masz gwarancję, że wynik nigdy nie przekroczy poziomu 2^31-1.
  • Masz również gwarancję, że dane wejściowe będą składały się wyłącznie z symboli +-*/cs().
  • Wyjdzie pusty program 1.
clismique
źródło
Co z ~sami? Nie zostawiaj nas wisi.
Robert Fraser
@RobertFraser Ups, to był błąd - c było pierwotnie ~, ale wygląda na to, że nie naprawiłem tego całkowicie.
clismique
1
@TonHospel Ooh, masz dobry punkt. Symbol „s” zasadniczo usuwa liczbę, z którą jest powiązany, z nieskończonego łańcucha, więc jest to tak w obu scenariuszach.
clismique
2
Twoja specyfikacja mówi jednak, że s+jest to 2+3pierwszy przykład. I wciąż smnie wkurza. Zastanawiam się, jak się +s()+rozwija. Jeśli tak jest, 1+(2)+4to (pojawia się wcześniej, 2ale sto pojawia się nawet zanim (pozornie wciąż przeskakuje 3, nie 2. Jeśli jednak wynik jest taki, 1+(3)+4to efekt szależy od tego, co nastąpi po nim (porównaj to z +s+)
Ton Hospel
1
scjest 23i s+jest 1+3? Czy spomija 1teraz czy 2? Wszystkie przykłady używają pierwszej operacji na operandach 1i 2... tak scpowinno być 13.
Tytus

Odpowiedzi:

4

JavaScript (ES6), 110 bajtów

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

Bardzo prosty, ale podział na liczby całkowite dodaje 25 bajtów. Z jakiegoś powodu wyrażenie regularne w JS nie może pasować zarówno do początku łańcucha, jak i do pierwszego znaku, więc dodaje także kilka bajtów.

Jak to działa

  1. Dodaj spację do wejścia.
  2. Dodaj następną cyfrę do każdego znaku (oprócz )), który nie jest bezpośrednio przed znakiem (.
  3. Usuń każdą ccyfrę + sna początku ( 1s2-> 2) i każdą s+ cyfrę ( 3s4-> 3).
  4. Zamień każdą operację podziału na podział wewnętrzny ( 1/2-> (1/2|0)).
  5. Oceń i wróć.
ETHprodukcje
źródło
OK ... twój program ma błąd ... ss+wraca 6, kiedy ma zamiar powrócić 7(dwa spomijają 1i 2, więc +dodaje 3i 4).
clismique
@ Qwerp-Derp Dzięki, naprawiono.
ETHproductions
Coś takiego /^|,|$/gbędzie pasowało tylko raz na początku, ponieważ oba dopasowania będą miały ten sam indeks. $nie ma tego samego problemu, ponieważ dopasowanie ma wyższy indeks niż jakiekolwiek inne możliwe dopasowanie.
Neil
0

Partia, 332 bajty

@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%

Zachowanie ssprawia, że ​​jest to bardzo niewygodne. (Może cspowinien oceniać do 13i -sdo -2?) Zmienne:

  • s ciąg wejściowy (jawnie wygaszony, ponieważ set / p nie zmienia zmiennej, jeśli niczego nie wprowadzisz)
  • ewyrażenie częściowe w normalnej arytmetyki liczb całkowitych (do której możemy przekazać set/ajako formę eval)
  • d następna cyfra z nieskończonego ciągu cyfr
  • rprawa strona najnowszego operatora. Nie możemy połączyć tego natychmiast, ponieważ (musi być na pierwszym miejscu, ale musimy go przechowywać, aby snie zwiększał. Na szczęście ostatecznie sprawia, że ​​obsługa jest )nieco łatwiejsza.
  • c obecny charakter.
Neil
źródło