解释重复!


11

这项挑战是有关重复的两个挑战系列中的第一个。第二个即将到来。

在一种叫做重复的语言(我刚刚写的东西)中,包含一个无限的字符串12345678901234567890...,带有1234567890永远重复。

以下语法可用于输出数字:

  • +-*/:这会将运算符插入重复数字的字符串中。
    • 例子:
      • +-> 1+2= 3(在和之间+插入一个)+12
      • +*-> 1+2*3= 1+6= 7(与上面相同,但现在使用两个运算符)
      • /-> 1/2= 0(重复使用整数除法)
      • //-> 1/2/3= 0/3= 0(重复使用带有多个减法和除法的“左关联”)
    • 插入每个运算符时,除非有,否则它的左边有一位数字c(请参阅下文)。
  • c:与字符串中的下一位数字连接。
    • 例子:
      • c+-> 12+3= 15c“继续” 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= 5s跳过1
    • csc- > 124(第一cconcats 12,所述s跳过3,和最终cconcats 124
    • +s+- > 7(第一+添加12制作3s跳过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最初是〜,但看来我还没有完全解决。
clismique

1
@TonHospel哦,您的意思很对。本质上,“ s”符号从无限字符串中完全删除了与之关联的数字,因此在两种情况下都是“是”。
clismique

2
但是,您的规范说的s+2+3第一个示例。而且仍然s不断烦扰我。我想知道如何+s()+扩展。如果是1+(2)+4那么(来之前2可是s说来之前也(貌似还跳过3,不会2。但是,如果结果是结果,1+(3)+4则a的效果s取决于其后的结果(与进行比较+s+
Ton Hospel

1
sc23s+1+3?会s跳过1现在还是现在2?所有的例子都使用在操作数上第一操作12...所以sc应该是13
泰特斯(Titus)2016年

Answers:


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. 将下一个数字附加到)不是紧接在之前的每个字符(除外)(
  3. 删除每个cs开头的数字+ (1s2-> 2)和每个s+的数字(3s4-> 3)。
  4. 将每个除法运算转换为int-division(1/2-> (1/2|0))。
  5. 评估并返回。

OK ......你的程序有一个bug ... ss+回报6,当它想回7(这两个s的跳跃12,因此+增加34)。
clismique 2016年

@ Qwerp-Derp谢谢,固定。
ETHproductions 2016年

像这样的东西/^|,|$/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 当前角色。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.