Bagian bawah Hourglass


14

Tantangan:

Input: Tiga bilangan bulat: panjang tepi bawah; jumlah awal butiran pasir; indeks

Keluaran: Keluarkan keadaan bagian bawah jam pasir pada indeks yang diberikan, berdasarkan panjang tepi bawah yang diberikan dan jumlah butiran pasir.

Aturan tantangan:

  • Kami mensimulasikan butiran pasir dengan angka 1-9
  • Kami menempatkan jumlah butiran pasir yang tersisa saat ini di bagian atas di tengah, diikuti oleh satu karakter pilihan Anda sendiri (tidak termasuk digit, spasi putih dan garis baru; yaitu -) pada baris di bawahnya
  • Saat jam pasir diisi, kami mengisinya per baris, satu digit setiap kali
  • Ketika pasir bisa ke kiri atau ke kanan, kita SELALU ke kanan (hal yang sama berlaku untuk menyeimbangkan jumlah sisa butiran pasir di atas jam kaca)
  • Ketika kita sudah mencapai angka 9, itu sudah terisi, dan kita tidak bisa lagi memuat pasir di tempat khusus itu di jam pasir
  • Jumlah butiran pasir yang tersisa juga selalu selaras dengan benar
  • Setelah bagian bawah jam pasir benar-benar terisi penuh, atau jumlah butiran pasir yang tersisa mencapai 0, kita tidak bisa melangkah lebih jauh, dan ini akan menjadi output untuk semua indeks di luar titik ini
  • 0-diindeks atau 1-diindeks diizinkan, dan harap tentukan apa yang Anda gunakan dalam jawaban Anda.
  • Trailing dan leading space dan satu trailing atau leading-line baru adalah opsional
  • Anda diperbolehkan menggunakan karakter lain alih-alih nol untuk mengisi ruang kosong di bagian bawah jam pasir (tidak termasuk digit, baris baru, atau karakter yang Anda gunakan sebagai leher), jika Anda memilih untuk menampilkannya.
  • Panjang tepi bawah selalu aneh
  • Panjang tepi bawah adalah >= 3; dan jumlah butiran pasir>= 0
  • Jika mau, Anda juga diizinkan mencetak semua negara hingga dan termasuk indeks yang diberikan
  • Anda dapat mengasumsikan indeks (0-diindeks) tidak akan pernah lebih besar dari jumlah total butir pasir (jadi ketika ada 100 butir pasir, indeks 100 adalah input indeks maksimum yang valid).
  • Indeks pertama (0 untuk 0-diindeks; 1 untuk 1-diindeks) akan menghasilkan jam pasir kosong dengan jumlah butiran pasir di atasnya.

Contoh: Gambar (atau ascii-art) mengatakan lebih dari seribu kata, jadi inilah contohnya:

Input panjang sisi bawah: 5
Jumlah input butiran pasir: 100
Alih-alih indeks saat ini, saya tampilkan semua langkah di sini:

Output untuk semua indeks yang mungkin dengan panjang tepi bawah 5dan jumlah butiran pasir 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

Jadi sebagai contoh:

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

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

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

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
Untuk 5,100,10000apa 20+9+9+9+9+9+9+9+9+9 = 101?
Neil

@Neil Saya akan sedikit mengubah aturan sehingga indeks tidak pernah bisa melampaui jumlah total. Mungkin lebih baik untuk mengerti.
Kevin Cruijssen


Apakah input pertama selalu berupa angka ganjil?
Brian H.

@BrianH. " Panjang ujung-bawah akan selalu aneh " Aku sadar aku punya terlalu banyak aturan dalam tantangan ini, jadi aku bisa mengerti kau sudah membacanya. :)
Kevin Cruijssen

Jawaban:


3

05AB1E , 68 63 59 57 56 byte

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

Cobalah online!

Penjelasan

IÅÉÅ9
Kami menginisialisasi tumpukan dengan daftar daftar 9-an.
Setiap daftar mewakili baris sehingga panjang setiap daftar ganjil dan panjang daftar terakhir sama dengan input pertama.
Masukan 5 akan menghasilkan[[9], [9, 9, 9], [9, 9, 9, 9, 9]]

[DOO²Q#ćD_Piˆëć<¸«¸ì]
Kami kemudian beralih ke daftar ini elemen decrementing dalam daftar sampai daftar hanya terdiri dari nol, kemudian pindah ke yang berikutnya. Kami berhenti ketika jumlah total sama dengan input kedua.

[     #              ]   # 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

Sekarang kita perlu membatalkan daftar akhir yang mensimulasikan penghapusan elemen dari sisi yang bergantian alih-alih dari kiri ke kanan seperti yang telah kita lakukan.

ć                   # 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

Sekarang kita memformat output dengan benar

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

Betulkah? Apakah ini rumit?
Guci Gurita Sihir

@ MagicOctopusUrn: Anda dipersilakan untuk mengalahkan saya :) Beberapa hal tentang metode ini menjadi sedikit berantakan karena kebiasaan bahasa yang saya belum menemukan cara yang lebih baik. Mungkin ada cara yang lebih baik sama sekali? Mungkin sesuatu yang lebih matematis?
Emigna

Saya berpikir tentang menggunakan angka biner entah bagaimana ... tidak memikirkannya sepenuhnya, tidak punya waktu luang.
Guci Gurita Ajaib

Sudah beberapa saat sejak saya mencoba mengalahkan salah satu solusi Anda yang lebih dari 20 byte. Agak malu mengakuinya, tetapi ketika saya melihat jawaban Anda, saya biasanya tidak membuang waktu untuk mencari perbaikan lagi; karena biasanya saya tidak dapat menemukan hah!
Guci Gurita Ajaib

@MagicOctopusUrn: Sayang sekali. Anda biasanya berhasil menemukan alternatif yang menarik (dan / atau perbaikan) untuk solusi saya. Program besar dalam bahasa golf tentu lebih sulit untuk meluangkan waktu untuk mengerjakannya.
Emigna

5

Bersih , 305 289 byte

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))])

Cobalah online!


1
@KevinCruijssen Diperbaiki.
Surous

1

Perl 5 , 301 byte

($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''}

Cobalah online!


1

Arang , 68 63 62 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 5 byte dengan menghapus pemeriksaan rentang indeks yang sekarang tidak perlu. Penjelasan:

NθNηNζ

Masukkan panjang q, jumlah butiran pasir ke hdan indeks ke z.

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

Loop di atas (q+1)/2baris (dari bawah ke atas), lalu 9 butir di setiap sel di baris, lalu loop di atas digit di baris.

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

Lompat ke digit.

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

Jika memungkinkan, bagikan sebutir pasir ke angka ini, kurangi jumlah pasir dan indeks kiri. Jika kami telah melewati indeks, ini masih mengkonversi spasi menjadi nol, mengisi jam pasir. Digit dicetak ke atas karena ini berarti kursor akan berada di leher setelah digit terakhir.

↑-

Cetak lehernya.

M⊘⊖LIη←Iη

Tengahkan dan cetak jumlah pasir yang tersisa.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.