バケットを埋める


14

あなたの仕事は、与えられた入力までの数でバケットを埋めることです。

ルール

番号は、左端の位置、次に右端、次に左端などを占有します。

オーバーフロー後、同様の方法でバケットの周りに数字が集まり始めます。それらは斜めに位置を占めます。

例では、予想される出力が何であるかを明確にする必要があります(いくつかの規則は例で言及されています)。

10以上の場合は、右端の数字を使用します

例:

The bucket: 
|      |  or |      | 
|      |     |      | 
|      |     |      |
|      |     |      |
|------|     |______|

input:1  (You can start from either 0 or 1)
output:
|      |  (There can be whitespace to the left even if there is no overflow
|      |  but the bucket must not be distorted.)
|      |
|1     |
|------|

input:6
output:
|      |
|      |
|      |
|135642|
|------|

input:8
output:
|      |
|      |
|7    8|
|135642|
|------|

input:23
output:
|913 20|
|357864|
|791208|
|135642|
|------|

input:27
output:
  |913420|
  |357864|
  |791208|
  |135642|
75|------|6

input:30
output:
  |913420|
  |357864|
  |791208|
 9|135642|0
75|------|68

input:40
output:
    |913420|
    |357864|
   5|791208|6
 939|135642|040
7175|------|6828

input:54   (Maximum input for start=1)
    3|913420|4
   13|357864|42
  915|791208|620
 7939|135642|0408
57175|------|68286

これはコードゴルフなので、最短のコードが優先されます。


「0または1から開始できます」とはどういう意味ですか?数字のシーケンス自体に0インデックスを付ける(つまり|024531|、)か、入力のみにすることができますか?n=6
アーナルド

@Arnauld、はい、シーケンスは0から始まる場合があります
Vedant Kandoi

これは、私がここで見たコードゴルフの優れたコーディングの課題の1つです。
マイケルKaras

回答:


9

JavaScript(Node.js) 145  143バイト

ハードコードされたパターン(詳細はこちらを参照してください)。

1インデックス付き。

n=>`    g|EGIJHF|h
   e]|?ACDB@|^f
  c[U|9;=><:|V\\d
 aYSO|357864|PTZb
_WQMK|------|LNRX\``.replace(/[3-h]/g,c=>(x=Buffer(c)[0])<n+51?x%10:' ')

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

@tshのおかげで2バイト節約


1
/[^\s|-]/->/[0-z]/
tsh

@tsh D'oh!私はこの単純化を完全に逃しました。ありがとうございました!
アーナルド

7

JavaScript(ES6)、 144 ... 139  137バイト

数学的アプローチ(より少ない数学についてはこちらを参照)。

0インデックス付き。

n=>(y=4,g=x=>~y?(X=x>8?17-x:x,k=X<y?g:X<5?24-(z=4+y-X)*~z+y*2:y*6+X*2-18,~X?X^5?k<0?'-':(k+=x>8)<n?k%10:' ':'|':`
`)+g(~X?-~x:!y--):'')()

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

どうやって?

y40バツ018

以下を定義します。

バツ={バツもし バツ817バツもし バツ>8

単位の数字だけでなく完全な値を書き込むと、次の表が得られます。

 x |  0  1  2  3  4  5  6  7  8 |  9 10 11 12 13 14 15 16 17 18
 X |  0  1  2  3  4  5  6  7  8 |  8  7  6  5  4  3  2  1  0 -1
---+----------------------------+-------------------------------
 4 | .. .. .. .. 52 || 18 20 22 | 23 21 19 || 53 .. .. .. .. \n
 3 | .. .. .. 50 42 || 12 14 16 | 17 15 13 || 43 51 .. .. .. \n
 2 | .. .. 48 40 34 || 6  8  10 | 11 9  7  || 35 41 49 .. .. \n
 1 | .. 46 38 32 28 || 0  2  4  | 5  3  1  || 29 33 39 47 .. \n
 0 | 44 36 30 26 24 || -- -- -- | -- -- -- || 25 27 31 37 45 \n

この表は、左側の値が偶数で、右側の値が奇数に相当することを除いて、基本的にy軸に対して対称です。

以下を定義します。

k={24+4+yバツ5+yバツ+2yもし バツ<56y+2バツ18もし バツ>5

k={kもし バツ8k+1もし バツ>8

そして、各セルに対して、次を追加します。

  • 場合は改行バツ=1
  • 場合はパイプバツ=5
  • 場合はハイフンk<0
  • バツ<yk>nn
  • kモッド10

コメント済み

n => (                                // main function taking n
  y = 4,                              // start with y = 4
  g = x =>                            // g = recursive function taking x
    ~y ?                              // if y is not equal to -1:
      ( X = x > 8 ? 17 - x : x,       //   compute X
        k = X < y ?                   //   if X is less than y:
          g                           //     set k to a non-numeric value
        :                             //   else:
          X < 5 ?                     //     if X is less than 5:
            24 - (z = 4 + y - X) * ~z //       apply the 'side numbers' formula
             + y * 2                  //
          :                           //     else:
            y * 6 + X * 2 - 18,       //       apply the 'middle numbers' formula
        ~X ?                          //   if X is not equal to -1:
          X ^ 5 ?                     //     if X is not equal to 5:
            k < 0 ?                   //       if k is less than 0:
              '-'                     //         append a hyphen
            :                         //       else:
              (k += x > 8) < n ?      //         update k to k'; if it's less than n:
                k % 10                //           append the unit digit of k'
              :                       //         else:
                ' '                   //           append a space
          :                           //     else (X = 5):
            '|'                       //       append a pipe
        :                             //   else (X = -1):
          `\n`                        //     append a linefeed
      )                               //
      + g(~X ? -~x : !y--)            //   update x and y, and do a recursive call
    :                                 // else (y = -1):
      ''                              //   stop recursion
)()                                   // initial call to g with x undefined


3

Java 10、168バイト

n->"    g|EGIJHF|h\n   e]|?ACDB@|^f\n  c[U|9;=><:|V\\d\n aYSO|357864|PTZb\n_WQMK|------|LNRX`".chars().forEach(c->System.out.print(c<46|c==124?(char)c:c<n+51?c%10:" "))

@ArnauldのJavaScript回答のポート(1インデックスも付けられ、-下部として出力)。この回答が気に入ったら、必ず彼も賛成してください!

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

説明:

n->                      // Method with integer parameter and no return-type
  "    g|EGIJHF|h\n   e]|?ACDB@|^f\n  c[U|9;=><:|V\\d\n aYSO|357864|PTZb\n_WQMK|------|LNRX`"
                         //  String containing the bucket and magic string
   .chars().forEach(c->  //  Loop over the characters (as integers)
     System.out.print(   //   Print:
       c<46|c==124?      //    If the character is "\n", " ", "-", or "|":
        (char)c          //     Output the character as is
       :c<n+51?          //    Else-if the character value is smaller than the input + 51:
        c%10             //     Output a digit: the character value modulo-9
       :                 //    Else:
        " "))            //     Output a space

1

6502マシンコード(C64)、130バイト

00 C0 20 9B B7 A9 C0 65 65 85 FB A2 00 BD 2B C0 F0 1A 10 12 C5 FB 90 04 A9 20
D0 0A 69 70 C9 3A 90 04 E9 0A B0 F8 20 D2 FF E8 D0 E1 60 20 20 20 20 F5 7D D3
D5 D7 D8 D6 D4 7D F6 0D 20 20 20 F3 EB 7D CD CF D1 D2 D0 CE 7D EC F4 0D 20 20
F1 E9 E3 7D C7 C9 CB CC CA C8 7D E4 EA F2 0D 20 EF E7 E1 DD 7D C1 C3 C5 C6 C4
C2 7D DE E2 E8 F0 0D ED E5 DF DB D9 7D 2D 2D 2D 2D 2D 2D 7D DA DC E0 E6 EE 00

これは、他のいくつかの回答の「事前にフォーマットされた」アプローチの修正バージョンを使用します。バケットの完全な文字列が含まれますが、数字はから始まる値に置き換えられます0xC1が、直接印刷用の文字は範囲0x01-にあり0x7fます。

C64文字セットにはパイプ(|)文字が含まれていないため、似たような外観のPETSCII文字に置き換えられ0x7dます。

オンラインデモ

使用法:SYS49152,[n](1インデックス、たとえばSYS49152,54完全な出力用)

コメント付きの分解

         00 C0       .WORD $C000        ; load address
.C:c000  20 9B B7    JSR $B79B          ; get unsigned byte from commandline
.C:c003  A9 C0       LDA #$C0           ; add #$C0 (+ carry = #$C1) ...
.C:c005  65 65       ADC $65            ; ... to parameter
.C:c007  85 FB       STA $FB            ; and store in $FB
.C:c009  A2 00       LDX #$00           ; loop index
.C:c00b   .loop:
.C:c00b  BD 2B C0    LDA .bucket,X      ; loop over encoded string
.C:c00e  F0 1A       BEQ .done          ; null-terminator -> done
.C:c010  10 12       BPL .out           ; positive (bit 7 clear) -> output
.C:c012  C5 FB       CMP $FB            ; compare with parameter+#$C1
.C:c014  90 04       BCC .digit         ; smaller -> convert to digit
.C:c016  A9 20       LDA #$20           ; otherwise load space character
.C:c018  D0 0A       BNE .out           ; and output
.C:c01a   .digit:
.C:c01a  69 70       ADC #$70           ; add offset to '0' (#$30)
.C:c01c   .check:
.C:c01c  C9 3A       CMP #$3A           ; greater than '9' (#$39) ?
.C:c01e  90 04       BCC .out           ; no -> to output
.C:c020  E9 0A       SBC #$0A           ; otherwise subtract 10 (#$a)
.C:c022  B0 F8       BCS .check         ; and check again
.C:c024   .out:
.C:c024  20 D2 FF    JSR $FFD2          ; output character
.C:c027  E8          INX                ; next index
.C:c028  D0 E1       BNE .loop          ; and repeat loop
.C:c02a   .done:
.C:c02a  60          RTS                ; exit ....
.C:c02b   .bucket:
.C:c02b  20 20 20    [...]              ; "encoded" string for bucket

0

木炭、64バイト

Nθ³↑⁵‖M←F²«‖J⁻³ι±¹F⊘⁺θ¬ι«↖I﹪⁺⊗κ⊕ιχM§”)⊟E≡≦⌈▷⊖ü∕”κ§”)⊟&hXτtD(λM”κ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

番号を入力してください。

³↑⁵‖M←

バケットの半分を描いてから、ミラーリングしてバケットを完成させます。

F²«

バケットの両側でループします。

‖J⁻³ι±¹

両方のループで一貫した方向に描画できるようにバケットを反映し、バケットのその側の最初の桁の位置にジャンプします。

F⊘⁺θ¬ι«

バケットのその側の桁数をループします。

↖I﹪⁺⊗κ⊕ιχ

次の桁を印刷し、カーソルを上下に移動します。

M§”)⊟E≡≦⌈▷⊖ü∕”κ§”)⊟&hXτtD(λM”κ

2つの圧縮された文字列003003003005203004000500(水平オフセット)と11011011011510200300040000(垂直オフセット)からオフセットを読み取ることにより、カーソル位置を調整します。これらのオフセットは、上記のカーソルの動きを考慮に入れているため、負である必要はありません。

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