Interpréter la répétition!

11

Ce défi est le premier d'une série de deux défis sur la répétition. Le second sera bientôt disponible.

Dans une langue appelée la répétition (quelque chose que je viens d'inventer), il y a une chaîne infinie de 12345678901234567890..., avec 1234567890répétition pour toujours.

La syntaxe suivante est disponible pour les numéros de sortie:

  • +-*/: Cela insère l'opérateur dans la chaîne de chiffres répétitifs.
    • Exemples:
      • +-> 1+2= 3(L' +insère un +entre 1et 2)
      • +*-> 1+2*3= 1+6= 7(Identique à ci-dessus, sauf que deux opérateurs sont utilisés maintenant)
      • /-> 1/2= 0(la répétition utilise une division entière)
      • //-> 1/2/3= 0/3= 0(la répétition utilise "l'association gauche" avec plusieurs soustractions et divisions)
    • Chaque opérateur est inséré de sorte qu'il ait un chiffre à sa gauche, sauf s'il y en a c(voir ci-dessous).
  • c: Concatène avec le chiffre suivant de la chaîne.
    • Exemples:
      • c+-> 12+3= 15(Le c"continue" le 1et le concatène avec le chiffre suivant,, 2pour former 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Supports pour le traitement des nombres.
    • Exemples:
      • (c+)*-> (12+3)*4= 15*4= 60(la répétition utilise l'ordre des opérations)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Ignorer un nombre (supprime le nombre de la chaîne infinie).
    • s+-> 2+3= 5( ssaute 1)
    • csc-> 124(le premier cconcats 1et 2, les ssauts 3et les derniers cconcats 12à 4)
    • +s+-> 7(La première +ajoute 1et 2à faire 3, sskips 3, et la finale +ajoute 3à 4faire 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

Dans les exemples ci-dessus, seule une quantité finie de chiffres dans la chaîne infinie est utilisée. Le nombre de chiffres utilisé est équivalent à number of operators, concats and skips + 1.

Votre tâche consiste, lorsque vous recevez une chaîne de code de répétition, à sortir le résultat.

Voici des exemples d'entrée et de sortie:

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

C'est le golf de code, donc le code le plus court en octets gagne!

Spécifications:

  • Vous avez la garantie que le résultat n'ira jamais au-dessus 2^31-1.
  • Vous avez également la garantie que l'entrée ne comprendra que les symboles +-*/cs().
  • Un programme vide sortira 1.
clismique
la source
Et les ~s? Ne nous laisse pas pendre.
Robert Fraser
@RobertFraser Whoops, c'était une erreur - c était à l'origine ~, mais il semble que je n'ai pas corrigé cela complètement.
clismique
1
@TonHospel Ooh, vous avez un bon point là-bas. Le symbole "s" supprime essentiellement le nombre auquel il est associé de la chaîne infinie, c'est donc un oui pour les deux scénarios.
clismique
2
Votre spécification indique cependant que s+c'est 2+3son premier exemple. Et scontinue de m'écouter. Je me demande comment se +s()+développe. S'il est 1+(2)+4alors (vient avant 2mais squi vient même avant les (skips apparemment encore 3, non 2. Si toutefois le résultat est 1+(3)+4alors l'effet d'un sdépend de ce qui vient après (comparez-le avec +s+)
Ton Hospel
1
scest 23et s+est 1+3? Ne ssautez le 1maintenant ou 2? Tous les exemples utilisent la première opération sur les opérandes 1et 2... il scdevrait en être ainsi 13.
Titus

Réponses:

4

JavaScript (ES6), 110 octets

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

La division très simple, mais entière ajoute 25 octets. Pour une raison quelconque, une expression régulière dans JS ne peut pas correspondre à la fois au début d'une chaîne et au premier caractère, ce qui ajoute également quelques octets.

Comment ça fonctionne

  1. Ajoutez un espace à l'entrée.
  2. Ajoutez le chiffre suivant à chaque caractère (sauf )) qui n'est pas immédiatement avant a (.
  3. Retirez chacun c, un chiffre + sau début ( 1s2-> 2), et chacun s+ un chiffre ( 3s4-> 3).
  4. Transformez chaque opération de division en division interne ( 1/2-> (1/2|0)).
  5. Évaluez et revenez.
ETHproductions
la source
OK ... votre programme a un bug ... ss+retourne 6, quand il est censé revenir 7(Les deux ssautent 1et 2, donc les +ajouts 3et 4).
clismique
@ Merci Qwerp-Derp, corrigé.
ETHproductions
Quelque chose comme /^|,|$/gne correspondra qu'une seule fois au début car les deux correspondances auront le même index. $n'a pas le même problème car la correspondance a un index supérieur à toute autre correspondance possible.
Neil
0

Lot, 332 octets

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

Le comportement de srend cela très gênant. (Peut-être csdevrait - on évaluer vers 13et -svers -2?) Variables:

  • s chaîne d'entrée (explicitement effacée car set / p ne change pas la variable si vous n'entrez rien)
  • eexpression partielle en arithmétique entière normale (à laquelle nous pouvons passer set/asous forme de eval)
  • d chiffre suivant de la chaîne infinie de chiffres
  • rcôté droit du dernier opérateur. Nous ne pouvons pas concaténer cela immédiatement parce que cela (doit venir en premier, mais nous devons le stocker pour sne pas l'incrémenter. Heureusement, cela finit par rendre la manipulation de )légèrement plus facile.
  • c caractère actuel.
Neil
la source