砂時計の下部


14

チャレンジ:

入力: 3つの整数:下端の長さ。砂粒の開始量; インデックス

出力:指定された下端の長さと砂粒の量に基づいて、指定されたインデックスで砂時計の下部の状態を出力します。

チャレンジルール:

  • 1〜9の数字で砂の粒をシミュレートします
  • 私たちは、あなた自身の選択の1文字が続き、途中で上部の砂の粒の現在の残量を置く(数字、空白や改行を除く、すなわち-)その下の行に
  • 砂時計がいっぱいになると、行ごとに1桁ずつ埋めます
  • 砂が左または右に移動できる場合は、常に右に移動します(砂時計の上にある砂粒の残​​りの量のバランスをとる場合も同じです)
  • 9に達すると、砂が満たされ、砂時計の特定の場所にこれ以上砂を入れることができなくなります
  • 残った砂の粒の量も常に正しく揃えられています
  • 砂時計の下半分が完全に満たされるか、残った砂粒の量が0に達すると、これ以上進むことはできません。これは、このポイントを超えるすべてのインデックスの出力になります
  • 0インデックスまたは1インデックスの両方が許可されています。回答で使用したものを指定してください。
  • 末尾と先頭のスペース、および単一の末尾または先頭の改行はオプションです
  • あなたがそれらを表示することを選択した場合、砂時計の下の部分の空白を埋めるためにゼロの代わりに他の文字を使用することができます(数字、改行、または首として使用した文字を除く)。
  • 下端の長さは常に奇数になります
  • 下端の長さは>= 3;になります。砂粒の量>= 0
  • 必要に応じて、指定されたインデックスまでのすべての状態を印刷することもできます
  • (インデックスが0の)インデックスは、砂の粒の合計量より大きくなることはないと想定できます(したがって、砂の粒が100個ある場合、インデックス100は最大の有効なインデックス入力です)。
  • 最初のインデックス(インデックスが0の場合は0、インデックスが1の場合は1)は、砂粒の量が上にある空の砂時計を出力します。

例:写真(またはascii-art)は1000語以上の単語を言うので、以下に例を示します。

入力下端の長さ:5
砂粒の入力量:100
現在のインデックスの代わりに、ここにすべてのステップを表示します。

下端の長さ5と砂粒の量を含むすべての可能なインデックスの出力100

 100
  -
  0
 000
00000

  99
  -
  0
 000
00100

  98
  -
  0
 000
00110

  97
  -
  0
 000
01110

  96
  -
  0
 000
01111

  95
  -
  0
 000
11111

  94
  -
  0
 000
11211

  93
  -
  0
 000
11221

  92
  -
  0
 000
12221

  91
  -
  0
 000
12222

  90
  -
  0
 000
22222

  89
  -
  0
 000
22322

  88
  -
  0
 000
22332

  87
  -
  0
 000
23332

  86
  -
  0
 000
23333

  85
  -
  0
 000
33333

  84
  -
  0
 000
33433

  83
  -
  0
 000
33443

  82
  -
  0
 000
34443

  81
  -
  0
 000
34444

  80
  -
  0
 000
44444

  79
  -
  0
 000
44544

  78
  -
  0
 000
44554

  77
  -
  0
 000
45554

  76
  -
  0
 000
45555

  75
  -
  0
 000
55555

  74
  -
  0
 000
55655

  73
  -
  0
 000
55665

  72
  -
  0
 000
56665

  71
  -
  0
 000
56666

  70
  -
  0
 000
66666

  69
  -
  0
 000
66766

  68
  -
  0
 000
66776

  67
  -
  0
 000
67776

  66
  -
  0
 000
67777

  65
  -
  0
 000
77777

  64
  -
  0
 000
77877

  63
  -
  0
 000
77887

  62
  -
  0
 000
78887

  61
  -
  0
 000
78888

  60
  -
  0
 000
88888

  59
  -
  0
 000
88988

  58
  -
  0
 000
88998

  57
  -
  0
 000
89998

  56
  -
  0
 000
89999

  55
  -
  0
 000
99999

  54
  -
  0
 010
99999

  53
  -
  0
 011
99999

  52
  -
  0
 111
99999

  51
  -
  0
 121
99999

  50
  -
  0
 122
99999

  49
  0
 222
99999

  48
  -
  0
 232
99999

  47
  -
  0
 233
99999

  46
  -
  0
 333
99999

  45
  -
  0
 343
99999

  44
  -
  0
 344
99999

  43
  -
  0
 444
99999

  42
  -
  0
 454
99999

  41
  -
  0
 455
99999

  40
  -
  0
 555
99999

  39
  -
  0
 565
99999

  38
  -
  0
 566
99999

  37
  -
  0
 666
99999

  36
  -
  0
 676
99999

  35
  -
  0
 677
99999

  34
  -
  0
 777
99999

  33
  -
  0
 787
99999

  32
  -
  0
 788
99999

  31
  -
  0
 888
99999

  30
  -
  0
 898
99999

  29
  -
  0
 899
99999

  28
  -
  0
 999
99999

  27
  -
  1
 999
99999

  26
  -
  2
 999
99999

  25
  -
  3
 999
99999

  24
  -
  4
 999
99999

  23
  -
  5
 999
99999

  22
  -
  6
 999
99999

  21
  -
  7
 999
99999

  20
  -
  8
 999
99999

  19
  -
  9
 999
99999

例として:

inputs: 5,100,1
output:
  99
  -
  0
 000
00100

Same example with another valid output format:
  99
  ~
  . 
 ...
..1..

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿することを妨げないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

INPUTS: bottom-edge length, amount of grains of sand, index (0-indexed)

inputs: 5,100,1
output:
  99
  -
  0
 000
00100

inputs: 5,100,24
output:
  76
  -
  0
 000
45555

inputs: 5,100,100
output:
  19
  -
  9
 999
99999

inputs: 5,10,15
output:
  0
  -
  0
 000
22222

inputs: 3,30,20
output:
 10
 -
 0
677

inputs: 3,3,0
 3
 -
 0
000

inputs: 9,250,100
   150
    -
    0
   000
  00000
 2333332
999999999

inputs: 9,225,220
    5
    -
    4
   999
  99999
 9999999
999999999

inputs: 13,1234567890,250
  1234567640
      -
      0
     000
    00000
   0000000
  344444443
 99999999999
9999999999999

inputs: 25,25,25
             0
             -
             0
            000
           00000
          0000000
         000000000
        00000000000
       0000000000000
      000000000000000
     00000000000000000
    0000000000000000000
   000000000000000000000
  00000000000000000000000
 1111111111111111111111111

1
5,100,10000し、なぜ20+9+9+9+9+9+9+9+9+9 = 101
ニール

@Neilルールを少し変更して、インデックスが合計を超えないようにします。おそらく理解しやすいでしょう。
ケビンクルーイッセン


最初の入力は常に奇数ですか?
ブライアンH.

@BrianH。「下端の長さは常に奇妙です」このチャレンジではルールが少なすぎるので、あなたはそれを読んだことがあることを理解できます。:)
ケビンクルーイッセン

回答:


3

05AB1E68 63 59 57 56バイト

IÅÉÅ9[DOO²Q#ćD_Piˆëć<¸«¸ì]ćā<ΣÉ}2äćR¸ì˜è¸ì¯ìJDSOIα'-‚ì.C

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

説明

IÅÉÅ9
9のリストのリストでスタックを初期化します。
各リストは行を表すため、各リストの長さは奇数で、最後のリストの長さは最初の入力と等しくなります。5
入力すると、[[9], [9, 9, 9], [9, 9, 9, 9, 9]]

[DOO²Q#ćD_Piˆëć<¸«¸ì]
次に、リストがゼロのみで構成されるまでリスト内の要素をデクリメントしてこれらのリストを反復処理し、次のリストに進みます。合計が2番目の入力と等しくなると停止します。

[     #              ]   # loop until
 DOO                     # the sum of the list of lists
    ²Q                   # equals the second input
        ć                # extract the first list
         D_Pi            # if the product of the logical negation of all elements is true
             ˆ           # add the list to the global list
              ë          # else
               ć<        # extract the head and decrement it
                 ¸«      # append it to the list
                   ¸ì    # and prepend the list to the list of lists

次に、これまでのように左から右にではなく、交互の側面から要素を削除することをシミュレートする最終リストのソートを解除する必要があります。

ć                   # extract the row we need to sort
 ā<                 # push a list of indices of the elements [0 ... len(list)-1]
   ΣÉ}              # sort it by even-ness
      2äćR¸ì˜       # reverse the run of even numbers
                    # the resulting list will have 0 in the middle,
                      odd number increasing to the right and
                      even numbers increasing to the left
             è      # index into our final row with this
              ¸ì¯ì  # reattach all the rows to eachother

次に、出力を正しくフォーマットします

J              # join list of lists to list of strings
 DSOIα         # calculate the absolute difference of sum of our triangle and the 3rd input
      '-‚ì     # pair it with the string "-" and append to the list of rows
          .C   # join by newlines and center each row

本当に?これは複雑でしたか?
魔法のタコ

@MagicOctopusUrn:あなたは私をアウトゴルフすることをとても歓迎しています:)この方法についてのいくつかの事柄は、言語の癖のために少し面倒になりました。おそらくもっと良い方法がありますか?たぶんもっと数学的な何か?
エミグナ

どうにかして2進数を使用することを考えていました...十分に考えられず、余暇もありませんでした。
魔法のタコUr

20バイトを超えるソリューションの1つをアウトゴルフしようとしたのはしばらく前のことです。少し恥ずかしがりましたが、あなたの答えを見るとき、私は通常、もう改善を見つけようとして時間を無駄にしません。通常、私は何も見つけることができないからです!
魔法のタコ

@MagicOctopusUrn:残念です。あなたは通常、私のソリューションに対する興味深い代替案(および/または改善)を思いつくことができます。ゴルフ言語の大規模なプログラムは、確かに時間をかけて作業するのが難しいことは確かです。
エミグナ

5

クリーン305 289バイト

import StdEnv
@[h:t]|all((==)9)h|t>[]=[h: @t]=[h]
#s=length h/2
#m=hd(sort h)+1
=[updateAt(hd[e\\e<-flatten[[s+i,s-i]\\i<-[0..s]]|h!!e<m])m h:t]
$a b c=flatlines(map(cjustify(a+1))[fromString(fromInt(b-c)),['-']:reverse(map(map(toChar o(+)48))((iterate@[repeatn(a-r)0\\r<-[0,2..a]])!!c))])

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


1
@KevinCruijssen修正済み。
18年

1

Perl 5、301バイト

($x,$t,$u)=<>;$s=$x;$t-=$g=$t>$u?$u:$t;while($s>0){@{$a[++$i]}=((0)x$s,($")x($x-$s));$a[$i][$_%$s]++for 0..($f=$g<$s*9?$g:$s*9)-1;$g-=$f;$s-=2}say$"x(($x-length($g+=$t))/2+.5),$g,$/,$"x($x/2),'-';while(@b=@{pop@a}){for($i=1;$i<@b;$i+=2){print$b[-$i]}print$b[0];for($i=1;$i<@b;$i+=2){print$b[$i]}say''}

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


1

68 63 62バイト

NθNηNζF⊘⊕θF⁹F⁻θ⊗ι«J⊘⎇﹪λ²⊕λ±λ±ι≔¬¬ζλ↑I⁺λIKK≧⁻λη≧⁻λζ»↑-M⊘⊖LIη←Iη

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:不要になったインデックス範囲チェックを削除して、5バイトを保存しました。説明:

NθNηNζ

に長さを入力し、q砂の粒数をにh、インデックスをに入力しzます。

F⊘⊕θF⁹F⁻θ⊗ι«

(q+1)/2行をループし(下から上へ)、次に行の各セルで9つの粒子をループし、行の数字をループします。

J⊘⎇﹪λ²⊕λ±λ±ι

桁にジャンプします。

≔¬¬ζλ↑I⁺λIKK≧⁻λη≧⁻λζ»

可能であれば、砂の粒をこの数字に分配し、砂の量と残されたインデックスを減らします。インデックスを渡した場合、これはスペースをゼロに変換し、砂時計を埋めます。これは、カーソルが最後の数字の後の首にあることを意味するため、数字は上向きに印刷されます。

↑-

首を印刷します。

M⊘⊖LIη←Iη

残りの砂の量を中央に揃えて印刷します。

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