睡莲跳


24

在此挑战中,您需要模拟一只青蛙在睡莲上来回跳跃。池塘是无限大的,有成排的无限数量的睡莲,青蛙可以随意跳越多的睡莲。

这只青蛙喜欢来回 跳跃:向前跳跃后他总是向后跳,反之亦然。

您会收到一个代表他跳跃的整数列表。您需要输出他的跳跃结果。

例如,假设您通过了[2,3,6,8,2]

我们的青蛙从向前跳两个睡莲开始:

_2

然后3个睡莲垫退回:

3__2

然后向前放6个睡莲:

3__2__6

8回:

8_3__2__6

然后最后,向前放2个睡莲(注意2个如何覆盖3个):

8_2__2__6

更明确地说:您的输入是一个数字数组S,需要S[K]在position处输出S[K] - S[K-1] + S[K-2] - S[K-3]...

  • 如果要在某个位置打印多个数字,请仅打印索引最高的数字。
  • 你要使用_某一特定位置是空的
  • 如果一个数字有多个数字,则不会占用多个位置。(换句话说,一个位置可以包含多个字符)
  • 您可以假定列表是非空的,并且所有整数都大于0。

测试用例:

5                   ____5
2,2                 2_2
4,3,2,1             3124
5,3,2,1             _3125
2,3,6,8,2           8_2__2__6
10,3,12,4,1,12,16   ___12__3__10____41__1216
100,4,7,2,2         _______________________________________________________________________________________________4___1002_2

这是一个,因此请使用尽可能少的字符回答!


13
我想知道谁看过《数字发烧友》吗?
Okx

3
因此,那时每个Numberphile视频都会面临挑战……
Fatalize


5
@Fatalize我认为没有错。
orlp

1
相关 ;-)
Arnauld

Answers:


9

MATL35 34字节

感谢@Emigna节省了1个字节!

32Oittn:oEq*Yst1hX<-Q(Vh' 0'95ZtXz

在线尝试!验证所有测试用例

怎么运行的

寻找您的代码,而不是您的解释!

下面以输入[2,3,6,8,2]为例。要在实际代码中查看中间结果,您可能需要插入%(注释符号)以在此时停止程序并查看堆栈内容。例如,显示了after语句后的堆栈Ys(累积和)。

32       % Push 32 (ASCII for space)
O        % Push 0
i        % Input array
         % STACK: 32, 0, [2,3,6,8,2]
t        % Duplicate
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2]
tn:      % Push [1 2 ... n] where n is length of input array
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,2,3,4,5]
o        % Modulo 2
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,0,1,0,1]
Eq       % Multiply by 2, subtract 1
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,-1,1,-1,1]
*        % Multiply elementwise
         % STACK: 32, 0, [2,3,6,8,2], [2,-3,6,-8,2]
Ys       % Cumulative sum
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1]
         % The top-most array is the positions where the entries of the second-top
         % array will be written. But postions cannot be less than 1; if that's
         % the case we need to correct so that the minimum is 1. If this happens,
         % it means that the frog has gone further left than where he started
t        % Duplicate
1hX<     % Append 1 and compute minimum. So if the original minimum is less than 1
         % this gives that minimum, and if it is more than 1 it gives 1
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1], -3
-        % Subtract
         % STACK: 32, 0, [2,3,6,8,2], [5 2 8 0 2]
Q        % Add 1
         % STACK: 32, 0, [2,3,6,8,2], [6 3 9 1 3]
(        % Assign values (top array) to specified positions (second-top) into array
         % which contains a single 0 (third-top). Newer values overwrite earlier
         % values at the same position
         % STACK: 32, [8 0 2 0 0 2 0 0 6]
V        % Convert to string. This produces spaces between the numbers
         % STACK: 32, '8 0 2 0 0 2 0 0 6'
h        % Concatenate with initial 32 (space). This converts to char
         % STACK: ' 8 0 2 0 0 2 0 0 6'
         % Thanks to this initial space, all zeros that need to be replaced by '_'
         % are preceded by spaces. (In this example that initial space would not
         % be needed, but in other cases it will.) Other zeros, which are part of
         % a number like '10', must not be replaced
' 0'     % Push this string: source for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 '
95       % Push 95 (ASCII for '_'): target for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 ', 95
Zt       % String replacement
         % STACK: ' 8_2__2__6'
Xz       % Remove spaces. Implicit display
         % STACK: '8_2__2__6'

我认为您可以通过替换'0'而不是来节省两个字节' 0 ',因为Xz
B. Mehta

1
@ B.Mehta谢谢。我最初是这样做的,但是不幸的是它不起作用,因为后来'0'in也'10'被替换了。这就是为什么我添加初始32
路易斯Mendo

嗯,当然是我的错
B. Mehta

@ B.Mehta不,根据我的解释根本不清楚。稍后我会澄清
Luis Mendo

1
mod 2数组的解释相​​反。而且,效果会不' 0'一样吗?
Emigna '17

4

PHP,100个 101 99 104字节

for($p=-1;$d=$argv[++$k];+$i<$p?:$i=$p,$x>$p?:$x=$p)$r[$p+=$k&1?$d:-$d]=$d;for(;$i<=$x;)echo$r[$i++]?:_;

从命令行参数获取输入;与运行-nr

分解

for($p=-1;          // init position
    $d=$argv[++$k]; // loop $d through command line arguments
    +$i<$p?:$i=$p,          // 3. $i=minimum index
    $x>$p?:$x=$p            // 4. $x=maximum index
)
    $r[
        $p+=$k&1?$d:-$d     // 1. jump: up for odd indexes, down else
    ]=$d;                   // 2. set result at that position to $d
for(;$i<=$x;)           // loop $i to $x inclusive
    echo$r[$i++]?:_;        // print result at that index, underscore if empty

这如何处理示例输入2,3,6,8,2,其中8跳转“向后”跳过睡莲的“开始”?
AdmBorkBork '17

@AdmBorkBork PHP支持负数组索引。
泰特斯

啊,不知道。谢谢!
AdmBorkBork '17

4

的JavaScript(ES6),99个 107字节

编辑:因为OP阐明了唯一的限制应该是可用内存,所以已对其进行更新以精确分配所需的空间,而不是依赖于硬编码的最大范围。

f=(a,x='',p=M=0)=>a.map(n=>x[(p-=(i=-i)*n)<m?m=p:p>M?M=p:p]=n,i=m=1)&&x?x.join``:f(a,Array(M-m).fill`_`,-m)

怎么运行的

此函数分两步工作:

  • 在第一遍:

    • “青蛙指针” p被初始化为0
    • x变量设置为空字符串,因此所有修改它的尝试都将被忽略。
    • 我们计算mM分别是达到的最小值和最大值p
    • 在此阶段结束时:我们对进行递归调用f()
  • 在第二遍:

    • p初始化为-m
    • x设置为size数组M-m,填充_字符。
    • 我们将数字插入的正确位置x
    • 在此阶段结束时:我们返回的合并版本x,这是最终结果。

测试用例


对于青蛙跳到索引-998以下或高于1002的情况,此操作将失败。示例:[1100]导致在位置处1002而不是位置处打印数字1100
nderscore

1
@nderscore这个问题是固定的,但要花费8个字节。
Arnauld

太棒了!也不错的方法:)
nderscore '17

4

R100 97 96字节

function(x){p=cumsum(x*c(1,-1))[seq(x^0)]
p=p+max(1-p,0)
v=rep('_',max(p));v[p]=x
cat(v,sep='')}

在线尝试!

第1行找到要跳转的所有位置。首先,所有跳入x都乘以1或-1,然后使用累积求和将其转换为最终位置。c(-1,1)如有必要,向量将被回收,但是,当x长度为1时,将x被回收。因此,仅考虑seq(x^0)(等于seq_along(x))和。(当的长度x不是2的倍数但不影响结果时,将生成警告)

第2行增加了跳跃位置,因此所有位置都至少为1。

第3和4行创建输出并进行打印。

朱塞佩的 -1个字节


整洁的把戏seq(x^0)
朱塞佩

-p+1可以1-p少一个字节。
朱塞佩

@Giuseppe啊,当然,谢谢!
罗伯特·哈肯

3

Javascript(ES6),109个字节

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value.split(/,/)))>
<datalist id=l><option value=5><option value="4,3,2,1"><option value="5,3,2,1"><option value="2,3,6,8,2"><option value="10,3,12,4,1,12,16"><option value="100,4,7,2,2"></datalist>

评论:

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
                /* initialize output array [] and index j at -1: */  o=[],j=-1
     x.map((y,i)=> /* iterate over all items in input x (y=item, i=index) */  )
                      (j-=i%2?y:-y) /* update j +/-y based on if index i is odd */
                                   <0? /* if resulting j index is less than zero */
                                      o.unshift(...Array(-j)) /* prepend -j extra slots to the output array */
                                                             &0 /* and give result 0 */
                                                               :j /* else give result j */
                    j= /* assign result to j */
                  o[ /* assign y to output array at index j */   ]=y
   /* short-circuit && then spread output array to fill any missing entries */ &&[...o]
                                                      /* fill falsey slots with '_' */ .map(y=>y||'_')
                                                                         /* join with empty spaces */ .join``

3

Perl 6的68 67个字节

{(my @a)[[[\+] |(1,-1)xx*Z*$_].&{$_ X-min 1,|$_}]=$_;[~] @a X//"_"}

在线尝试!

怎么运行的

首先,它确定累积跳转位置:

[[\+] |(1,-1)xx*Z*$_]
                  $_  # Input array.          e.g.  2, 3, 6, 8, 2
      |(1,-1)xx*      # Infinite sequence:          1,-1, 1,-1, 1...
                Z*    # Zip-multiplied.       e.g.  2,-3, 6,-8, 2
 [\+]                 # Cumulative addition.  e.g.  2,-1, 5,-3,-1

然后通过从所有数字中减去最小数字(但最多为1),将它们变成基于0的数组索引:

.&{$_ X-min 1,|$_}    #                       e.g.  5, 2, 8, 0, 2

然后,它使用分配给这些索引的输入数字创建一个数组:

(my @a)[   ]=$_;      #                       e.g.  8, Nil, 2, Nil, Nil, 2 Nil, Nil, 6

最后,它将数组连接到字符串,并用下划线代替未定义的元素:

[~] @a X//"_"         #                       e.g.  8_2__2__6

3

果冻 28  24 字节

-2(并进一步允许另一个-2),这要归功于FrownyFrog(快速使用前缀应用程序的[post-challenge]功能Ƥ

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷

在线尝试!完整程序,如需使用相同功能的测试套件,请单击此处

怎么样?

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷ - Main link: list a       e.g. [ 5, 3, 2, 1]
 Ƥ                       - prefix application of:
Ṛ                        -  reverse                e.g. [[5],[3,5],[2,3,5],[1,2,3,5]]
   -                     - literal minus one
  ḅ                      - from base (vectorises)  e.g. [ 5, 2, 4, 3]=
    µ                    - start a new monadic chain - call that list c
                         - [code to shift so minimum is 1 or current minimum]
     C                   - complement (vectorises) e.g. [-4,-1,-3,-2]
      Ṁ                  - maximum                 e.g.     -1
       »0                - maximum of that & zero  e.g.      0
         +               - add to c (vectorises)   e.g. [ 5, 2, 4, 3]
          µ              - start a new monadic chain - call that list d
           Ṭ€            - untruth €ach            e.g. [[0,0,0,0,1],[0,1],[0,0,0,1],[0,0,1]]
               ³         - the program input (a)
             ×"          - zip with multiplication e.g. [[0,0,0,0,5],[0,3],[0,0,0,2],[0,0,1]]
                Ṛ        - reverse                      [[0,0,1],[0,0,0,2],[0,3],[0,0,0,0,5]]
                 o/      - reduce with or          e.g. [0,3,1,2,5]
                    ”_   - '_'
                   o     - or (replace 0 with '_') e.g. ['_',3,1,2,5]
                      ;⁷ - concatenate a newline   e.g. ['_',3,1,2,5, '\n']
                         - implicit print

笔记:

换行符的最终串联;⁷是针对_在输出中没有出现的情况,在这种情况下,隐式打印将显示列表的表示形式,例如[3, 1, 2, 4],而不是示例_3125。对于没有换行符人能够取代;⁷;““追加人物列表的列表,[[''],['']](不接近,因为它是一个程序的最后一个字符需要)。

Untruth函数Ṭ 1在输入的索引处给出一个带有s 的列表,对于单个自然数nn-1 0 s,然后1允许将输入数字乘以与左边的正确距离。当执行用或进行的归约时,要求反转进行较晚的青蛙访问覆盖,而不是较早的覆盖o/


1,-ṁ×µ+\UƤ_@/€
FrownyFrog

Ƥ在撰写本文时并不是一个功能,但是可以。更好是UƤḅ€-(因为从基数-1的转换就像乘以...,1,-1,1,-1,1,-1,1然后求和)。
乔纳森·艾伦,

...甚至UƤḅ-自从向量化以来:)(我也进行了简单的反向操作,因为我们不需要颠倒的复杂性,U
Jonathan Allan

1

APL(Dyalog Unicode)45 30字节SBCS

{∊⍕¨⍵@i⍴∘'_'⌈/1+i←(⊢-1⌊⌊/)-\⍵}

在线尝试!

-\⍵扫描具有交替的参数-+

(⊢ - 1 ⌊ ⌊/)从()中减去1或最小值(⌊/),以较小者为准(

i← 分配给 i

⌈/ 1+ 增加并取最大值

⍴∘'_' 产生那么多下划线

⍵@i将参数()中的数字放在位置i

∊⍕¨ 格式化并展平


0

红宝石,85字节

->a{i=1;j=c=0;a.map{|x|[c-=x*i=-i,x]}.to_h.sort.map{|x,y|[?_*[x+~j,0*j=x].max,y]}*''}

在线尝试!

记录每次跳转后的位置,将结果数组转换为哈希值以删除重复项(在每个重复的位置保留最后一个值),然后将值粘贴在所需的下划线上。


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.