リリーパッドジャンプ


24

この課題では、ユリのパッドで前後にジャンプするカエルをシミュレートする必要があります。池は無限に大きく、無数のスイレンの列があり、カエルは好きなだけスイレンを飛び越えることができます。

このカエルは前後にジャンプするのが好きです: 前方にジャンプした後、彼は常に後方にジャンプしますにます。

彼のジャンプを表す整数のリストが渡されます。彼のジャンプの結果を出力する必要があります。

たとえば、あなたが合格したと言う [2,3,6,8,2]

私たちのカエルは、2つのスイレンを前方にジャンプすることから始まります。

_2

次に、3つのリリーパッドが戻ります。

3__2

次に、前方に6個のユリパッド:

3__2__6

8戻る:

8_3__2__6

最後に、2個のリリーパッドを前方に配置します(2が3を上書きする方法に注意してください)。

8_2__2__6

より明確にするために:入力は数値の配列でありSS[K]その位置で出力する必要があります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
誰がNumberphileを見たのだろうか?
Okx

3
だから... ...そして、すべてのNumberphileビデオのために挑戦することがありますつもり
Fatalize


5
@Fatalize私はそれについて何も悪いことはないと思います。
orlp

1
また、関連 ;-)
アルノー

回答:


9

MATL35 34バイト

1バイトを節約してくれた@Emignaに感謝します!

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

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

説明ではなくコードをゴルフしましょう!

以下では、入力[2,3,6,8,2]を例として使用します。実際のコードで中間結果を表示するには、%(コメント記号)を挿入して、その時点でプログラムを停止し、スタックの内容を表示することができます。たとえば、これはステートメントの後のスタック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'

私はあなたが交換することにより、2つのバイトを救うことができると思う'0'の代わりに' 0 'するので、Xz後にスペースを削除
B. Mehtaの

1
@ B.Mehtaありがとう。そしてので、私が最初にそれをしたが、残念ながらそれは仕事をしない'0'では、'10'あまりにも置き換えられます。だから私32もイニシャルを追加します
ルイスメンドー

もちろんああ、私のミス
B. Mehtaの

@ B.Mehtaいいえ、私の説明からはまったくわかりませんでした。後で明確にします
ルイスメンドー

1
説明ではmod 2配列が逆になっています。また、' 0'同様に機能しませんか?
エミグナ

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,28ユリ、パッドの「始まり」を過ぎて「後方」をジャンプ?
AdmBorkBork

@AdmBorkBork PHPは、負の配列インデックスをサポートしています。
タイタス

ああ、それを知りませんでした。ありがとう!
AdmBorkBork

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)

使い方

この関数は2つのパスで機​​能します。

  • 最初のパス中:

    • 「カエルポインター」 pはに初期化され0ます。
    • x変数が空の文字列に設定されているので、それを修正するすべての試みは単に無視されていること。
    • 計算しmMそれぞれが到達した最小値と最大値ですpです。
    • このパスの最後に:を再帰的に呼び出しますf()
  • 2回目のパス中:

    • pに初期化され-mます。
    • xサイズのアレイに設定されているM-mが充填されました、_文字ます。
    • 正しい位置に番号を挿入します x
    • このパスの最後にx、最終結果であるの結合バージョンを返します。

テストケース


これは、カエルがインデックス-998未満または1002を超えてジャンプする場合に失敗します。例:[1100]数値がposition 1002ではなくposition に印刷され1100ます。
nderscore

1
@nderscoreこれは、8バイトのコストで固定されています。
アーナルド

驚くばかり!良い方法も:)
nderscore

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+11-p1バイト少なくすることができます。
ジュゼッペ

@ジュゼッペああ、間違いなく、ありがとう!
ロバートハッケン

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のおかげ(プレフィックスアプリケーションの[チャレンジ後]機能をすばやく使用Ƥ

ṚƤḅ-µ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。置き換えることができていない最後の改行の一つは;⁷;““文字のリストのリストを追加するために、[[''],['']](何も近い、それはプログラムの最後の文字だとして必要ありません)。

虚偽関数Ṭは、1入力のインデックスにs を含むリストを提供します。単一の自然数nn-1で、 0その後1に入力番号を乗算によって左から正しい距離に配置できるようにします。反転は、またはでの縮小が実行されるときに、以前のカエル訪問ではなく、後のカエル訪問の上書きを行うために必要です。o/


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

Ƥこれが書かれた時点では機能ではありませんでしたが、はい、機能します。ベターはUƤḅ€-(ベース-1からの変換は、乗算し...,1,-1,1,-1,1,-1,1てから加算するようなものだからです)。
ジョナサンアラン

...またはvectorises UƤḅ-から:)(逆さまの複雑さを必要としないため、単純な逆も行ったU
ジョナサンアラン

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]}*''}

オンラインでお試しください!

各ジャンプ後の位置を記録し、結果の配列をハッシュに変換して重複を削除し(重複する各位置の最後の値を保持)、必要な量の下線で値を接着します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.