首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >桶式解释器

桶式解释器
EN

Code Golf用户
提问于 2019-08-10 11:20:31
回答 3查看 396关注 0票数 6

创建一个解释编程语言桶的程序。

水桶工作在两个桶:第一个可以容纳A,第二个可以容纳B单位的液体。你可以用这些桶做的事情是:

f:装满A桶

F:装满桶B

e:空桶A

E:空桶B

从A到B的液体单位,直到其中一个是空的,另一个是满的,以先发生者为准。

P:和命令p一样,但从B到A

输出桶A的值

O:输出桶B的值

这些示例假设A小于或等于元组(A,B)中的B,这是确定要解释语言的哪个变体的主要元组。A是桶的较小值或等价物,B是较大或相等值:根据你的需要替换。

您的程序应该要求三个输入:

  1. 元组中的元素A (A,B):
  2. (A,B)中的要素B:
  3. 要解释的程序。

元组(A,B)决定解释语言桶的哪个变体。

作为一般规则,确保前两个输入可以介于0到2,147,483,647之间。

除了fFeEpPoO之外,第三个输入中的任何字符都不需要处理。假设源中没有除这些字符之外的其他字符。

任何相当于将更多液体倒入桶中的命令都不需要处理。

假设程序永远不会尝试从空桶中倒出液体。

这是密码高尔夫,所以最短的解决方案获胜。

在我修改规范之前所做的任何程序都是非竞争性的.

EN

回答 3

Code Golf用户

回答已采纳

发布于 2019-08-11 04:04:58

斯塔克斯,50 字节数

代码语言:javascript
复制
╖z≈]Y`Zîú¬♣↑e█■X▲håR⌐├~@»3é±óè♂╓_§8F|╢╖r╥ë$%6Æ▲¡↓!

运行并调试它

打开,打开,它看起来像这样。你几乎可以看到某种结构,即使你不知道斯塔克斯。它循环遍历程序,并根据文字"fFeEpPo"中指令的索引分配到一个块。大写O给出了一个指数-1。

代码语言:javascript
复制
sYdZZF
  "fFeEpPo"I
  {xs}
  {dy}
  {Z}
  {d0}
  {+cyG}
  {+cxGs}
  {nP}
  {Q}
  8l@!
}tc~-,
票数 0
EN

Code Golf用户

发布于 2019-08-10 14:01:29

JavaScript (Node.js),129个字节

接受输入为([b, a])(code),其中code是一个字符串。返回输出值数组。

代码语言:javascript
复制
B=>c=>Buffer(c).map(h=j=>(i=j>>5&1,k=j&3)?k>2?o.push(b[i]):b[i]=~-k*B[i]:b[i]&&b[k=i^1]<B[k]&&h(j,b[i]--,b[k]++),b=[0,0],o=[])&&o

在网上试试!

评论

代码语言:javascript
复制
B => c =>                 // B = [b, a]; c = code string
  Buffer(c)               // turn c into a buffer
  .map(h = j =>           // for each ASCII code j:
    ( i = j >> 5 & 1,     //   i = 1 for lower case, 0 for upper case
      k = j & 3           //   k = 0 for 'p', 1 for 'e', 2 for 'f', 3 for 'o'
    ) ?                   //   if k is not 0:
      k > 2 ?             //     if k = 3:
        o.push(b[i])      //       push b[i] in o[]
      :                   //     else:
        b[i] = ~-k * B[i] //       set b[i] to B[i] if k = 2, or 0 if k = 1
    :                     //   else (k = 0):
      b[i] &&             //     if b[i] is not empty
      b[k = i ^ 1] < B[k] //     and the other bucket b[k] is not full:
      && h(               //       do recursive calls
        j,                //       to pour as much as possible,
        b[i]--,           //       decrementing b[i]
        b[k]++            //       and incrementing b[k] at each iteration
      ),                  //
    b = [0, 0],           //   start with b = [0, 0]
    o = []                //   and initialize o[] to an empty array
  ) && o                  // end of map(); return o[]
票数 0
EN

Code Golf用户

发布于 2019-08-10 19:13:08

木炭,66字节

代码语言:javascript
复制
NθNηF⁺eES≡ιf≔θζF≔ηεe≔⁰ζE≔⁰εpF∧ζ‹εη«≦⊖ζ≦⊕ε»PF∧η‹ζθ«≦⊖ε≦⊕ζ»o⟦Iζ⟧O⟦Iε

在网上试试!链接是详细的代码版本。实现问题中指定的桶的变体。对于原始版本,s可以更改为s,用于相同的字节计数:

代码语言:javascript
复制
NθNηF⁺eES≡ιf≔θζF≔ηεe≔⁰ζE≔⁰εpW∧ζ‹εη«≦⊖ζ≦⊕ε»PW∧η‹ζθ«≦⊖ε≦⊕ζ»o⟦Iζ⟧O⟦Iε

在网上试试!链接是详细的代码版本。解释:

代码语言:javascript
复制
NθNη

输入水桶的大小。

代码语言:javascript
复制
F⁺eES

循环执行这些命令,但是在前面加上eE,这样桶就处于已知的状态。

代码语言:javascript
复制
≡ι

切换当前命令。

代码语言:javascript
复制
f≔θζ

如果是f,那么填充第一个桶。

代码语言:javascript
复制
F≔ηε

如果是F,那么填充第二个桶。

代码语言:javascript
复制
e≔⁰ζ

如果e然后清空第一个桶。

代码语言:javascript
复制
E≔⁰ε

如果E然后清空第二个桶。

代码语言:javascript
复制
pW∧ζ‹εη«≦⊖ζ≦⊕ε»

如果p,然后将一个单元从第一个桶倒到第二个桶,直到第一个桶空了,或者第二个桶满了。(有趣的是,这似乎是用木炭表达这一概念的最佳方式。)

代码语言:javascript
复制
PW∧η‹ζθ«≦⊖ε≦⊕ζ»

如果P然后将一个单元从第二个桶倒到第一个桶,直到第二个桶空了,或者第一个桶满了。

代码语言:javascript
复制
o⟦Iζ⟧

如果o在自己的行上输出第一个桶。

代码语言:javascript
复制
O⟦Iε

如果O在自己的行上输出第二个桶。( 是隐式的,在输入中跳过未识别的字符也是如此。)

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/189661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档