Wiederholung interpretieren!

11

Diese Herausforderung ist die erste in einer Serie mit zwei Herausforderungen zum Thema Wiederholung. Der zweite wird bald auf sein.

In einer Sprache namens Wiederholung (nur aus etwas I), besteht dort eine unendliche Reihe von 12345678901234567890..., mit 1234567890immer wiederholen.

Die folgende Syntax steht für die Ausgabe von Zahlen zur Verfügung:

  • +-*/: Dies fügt den Operator in die Zeichenfolge sich wiederholender Ziffern ein.
    • Beispiele:
      • +-> 1+2= 3(Das +fügt ein +zwischen 1und ein 2)
      • +*-> 1+2*3= 1+6= 7(Wie oben, außer dass jetzt zwei Operatoren verwendet werden)
      • /-> 1/2= 0(Wiederholung verwendet Ganzzahldivision)
      • //-> 1/2/3= 0/3= 0(Wiederholung verwendet "linke Assoziation" mit mehreren Subtraktionen und Divisionen)
    • Jeder Operator wird so eingefügt, dass er eine Ziffer links davon hat, es sei denn, es gibt eine c(siehe unten).
  • c: Verkettet mit der nächsten Ziffer in der Zeichenfolge.
    • Beispiele:
      • c+-> 12+3= 15(Das c"setzt" das fort 1und verkettet es mit der nächsten Ziffer, um 2sich zu bilden 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Klammern für die Verarbeitung von Nummern.
    • Beispiele:
      • (c+)*-> (12+3)*4= 15*4= 60(Wiederholung verwendet die Reihenfolge der Operationen)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Überspringe eine Zahl (entfernt die Zahl aus der unendlichen Zeichenfolge).
    • s+-> 2+3= 5( süberspringt 1)
    • csc-> 124(Die ersten cConcats 1und 2, die sSkips 3und die letzten cConcats 12zu 4)
    • +s+-> 7(Das erste +fügt hinzu 1und 2zu machen 3, süberspringt 3und das letzte +fügt hinzu, 3um 4zu machen 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

In den obigen Beispielen wird nur eine endliche Anzahl von Ziffern in der unendlichen Zeichenfolge verwendet. Die Anzahl der verwendeten Ziffern entspricht number of operators, concats and skips + 1.

Ihre Aufgabe ist es, das Ergebnis auszugeben, wenn Sie eine Zeichenfolge mit Wiederholungscode erhalten.

Beispiele für Eingabe und Ausgabe sind:

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

Dies ist Code Golf, also gewinnt der kürzeste Code in Bytes!

Technische Daten:

  • Sie werden garantiert, dass das Ergebnis niemals darüber hinausgeht 2^31-1.
  • Sie werden auch garantiert, dass die Eingabe nur aus den Symbolen besteht +-*/cs().
  • Ein leeres Programm wird ausgegeben 1.
Clismique
quelle
Was ist mit dem ~s? Lass uns nicht hängen.
Robert Fraser
@ RobertFraser Whoops, das war ein Fehler - c war ursprünglich ~, aber es scheint, dass ich das nicht vollständig behoben habe.
Clismique
1
@TonHospel Ooh, da hast du einen guten Punkt. Das "s" -Symbol entfernt im Wesentlichen die Nummer, mit der es verknüpft ist, aus der unendlichen Zeichenfolge, sodass es für beide Szenarien ein Ja ist.
Clismique
2
Ihre Spezifikation jedoch sagt s+ist 2+3als erstes Beispiel. Und snervt mich immer noch. Ich frage mich, wie sich +s()+ausdehnt. Wenn es 1+(2)+4dann (vorher kommt, 2aber das skommt noch bevor das (scheinbar noch überspringt 3, nicht 2. Wenn jedoch das Ergebnis ist, 1+(3)+4dann shängt die Wirkung von a davon ab, was danach kommt (vergleiche es mit +s+)
Ton Hospel
1
scist 23und s+ist 1+3? Hat süberspringen die 1jetzt oder 2? Alle Beispiele verwenden die erste Operation für Operanden 1und 2... scsollten es auch sein 13.
Titus

Antworten:

4

JavaScript (ES6), 110 Byte

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

Sehr einfache, aber ganzzahlige Division fügt 25 Bytes hinzu. Aus irgendeinem Grund kann ein regulärer Ausdruck in JS nicht sowohl mit dem Anfang einer Zeichenfolge als auch mit dem ersten Zeichen übereinstimmen, sodass auch einige Bytes hinzugefügt werden.

Wie es funktioniert

  1. Stellen Sie der Eingabe ein Leerzeichen voran.
  2. Fügen Sie die nächste Ziffer an jedes Zeichen an (außer )), das nicht unmittelbar vor a steht (.
  3. Entfernen Sie jeweils ceine Ziffer + sam Anfang ( 1s2-> 2) und jeweils s+ eine Ziffer ( 3s4-> 3).
  4. Verwandeln Sie jede Divisionsoperation in Int-Division ( 1/2-> (1/2|0)).
  5. Bewerten und zurückgeben.
ETH-Produktionen
quelle
OK ... Ihr Programm hat einen Fehler ... ss+kehrt zurück 6, wenn es zurückkehren soll 7(Die beiden süberspringen 1und 2, also das +Hinzufügen 3und 4).
Clismique
@ Qwerp-Derp Danke, behoben.
ETHproductions
So etwas /^|,|$/gstimmt zu Beginn nur einmal überein, da beide Übereinstimmungen den gleichen Index haben würden. $hat nicht das gleiche Problem, da die Übereinstimmung einen größeren Index hat als jede andere mögliche Übereinstimmung.
Neil
0

Stapel, 332 Bytes

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

Das Verhalten von smacht dies sehr umständlich. (Vielleicht cssollte zu 13und -szu bewerten -2?) Variablen:

  • s Eingabezeichenfolge (explizit ausgeblendet, da set / p die Variable nicht ändert, wenn Sie nichts eingeben)
  • eTeilausdruck in normaler ganzzahliger Arithmetik (die wir set/aals eine Form von übergeben können eval)
  • d nächste Ziffer aus der unendlichen Ziffernfolge
  • rrechte Seite des neuesten Bedieners. Wir können dies nicht sofort verketten, da (es zuerst kommen muss, aber wir müssen es speichern, damit ses nicht erhöht wird. Glücklicherweise )erleichtert dies die Handhabung etwas.
  • c aktueller Charakter.
Neil
quelle