Phần dưới cùng của Đồng hồ cát


14

Thử thách:

Đầu vào: Ba số nguyên: chiều dài cạnh dưới; lượng hạt cát khởi đầu; mục lục

Đầu ra: Xuất trạng thái của phần đáy của đồng hồ cát theo chỉ số đã cho, dựa trên chiều dài cạnh đáy đã cho và lượng hạt cát.

Quy tắc thử thách:

  • Chúng tôi mô phỏng các hạt cát với các chữ số 1-9
  • Chúng tôi đặt số lượng hạt cát còn lại hiện tại ở trên cùng ở giữa, theo sau là một ký tự bạn chọn (không bao gồm chữ số, khoảng trắng và dòng mới; tức là -) trên dòng bên dưới nó
  • Khi đồng hồ cát đang được lấp đầy, chúng tôi sẽ lấp đầy nó trên mỗi hàng, mỗi lần một chữ số
  • Khi cát có thể đi sang trái hoặc phải, chúng ta LUÔN đi bên phải (áp dụng tương tự cho việc cân bằng lượng hạt cát còn lại trên kính giờ)
  • Khi chúng tôi đạt đến 9, nó đã lấp đầy và chúng tôi không thể nhét thêm cát vào vị trí cụ thể đó trong đồng hồ cát
  • Lượng hạt cát còn lại cũng luôn được căn phải
  • Khi nửa dưới của đồng hồ cát được lấp đầy hoàn toàn, hoặc lượng hạt cát còn lại đạt 0, chúng ta không thể tiến xa hơn và đây sẽ là đầu ra cho tất cả các chỉ số ngoài điểm này
  • Cả hai chỉ số 0 hoặc 1 chỉ mục đều được cho phép và vui lòng chỉ định những gì bạn đã sử dụng trong câu trả lời của mình.
  • Trailing và hàng đầu không gian và một dòng duy nhất hoặc hàng đầu mới là tùy chọn
  • Bạn được phép sử dụng bất kỳ ký tự nào khác thay vì số 0 để lấp đầy khoảng trống của phần dưới cùng của đồng hồ cát (không bao gồm chữ số, dòng mới hoặc ký tự bạn đã sử dụng làm cổ), nếu bạn chọn hiển thị chúng.
  • Độ dài cạnh dưới sẽ luôn là số lẻ
  • Chiều dài cạnh dưới sẽ là >= 3; và số lượng hạt cát>= 0
  • Nếu bạn muốn, bạn cũng được phép in tất cả các trạng thái lên đến và bao gồm chỉ mục đã cho
  • Bạn có thể giả sử chỉ số (chỉ số 0) sẽ không bao giờ lớn hơn tổng số hạt cát (vì vậy khi có 100 hạt cát, chỉ số 100 là chỉ số đầu vào hợp lệ tối đa).
  • Chỉ số đầu tiên (0 cho 0 chỉ mục; 1 cho 1 chỉ mục) sẽ tạo ra một đồng hồ cát trống với lượng hạt cát phía trên nó.

Ví dụ: Hình ảnh (hoặc ascii-art) nói hơn một ngàn từ, vì vậy đây là một ví dụ:

Chiều dài cạnh dưới cùng của đầu vào: 5
Lượng hạt cát đầu 100
vào : Thay vì chỉ số hiện tại, tôi hiển thị tất cả các bước ở đây:

Đầu ra cho tất cả các chỉ số có thể có chiều dài cạnh đáy 5và lượng hạt cát 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

Ví dụ:

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

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

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

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,10000sao 20+9+9+9+9+9+9+9+9+9 = 101?
Neil

@Neil Tôi sẽ thay đổi quy tắc một chút để chỉ mục không bao giờ có thể vượt quá tổng tiền. Có lẽ tốt hơn để hiểu.
Kevin Cruijssen


đầu vào đầu tiên luôn luôn là một số lẻ?
Brian H.

@BrianH. " Độ dài cạnh dưới sẽ luôn là số lẻ " Tôi nhận ra mình có quá nhiều quy tắc trong thử thách này, vì vậy tôi có thể hiểu bạn đã đọc qua nó. :)
Kevin Cruijssen

Câu trả lời:


3

05AB1E , 68 63 59 57 56 byte

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

Hãy thử trực tuyến!

Giải trình

IÅÉÅ9
Chúng tôi khởi tạo ngăn xếp với một danh sách danh sách 9.
Mỗi danh sách đại diện cho một hàng nên độ dài của mỗi danh sách là số lẻ và độ dài của danh sách cuối cùng bằng với đầu vào đầu tiên.
Một đầu vào 5 sẽ dẫn đến[[9], [9, 9, 9], [9, 9, 9, 9, 9]]

[DOO²Q#ćD_Piˆëć<¸«¸ì]
Sau đó, chúng tôi lặp lại các danh sách các phần tử giảm dần trong một danh sách cho đến khi danh sách chỉ bao gồm các số 0, sau đó chuyển sang phần tiếp theo. Chúng tôi dừng lại khi tổng số bằng với đầu vào thứ hai.

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

Bây giờ chúng ta cần hủy hủy danh sách cuối cùng mô phỏng loại bỏ các phần tử từ các mặt xen kẽ thay vì từ trái sang phải như chúng ta đã làm.

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

Bây giờ chúng tôi định dạng đầu ra chính xác

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

Có thật không? Nó có phức tạp không?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Bạn rất sẵn lòng vượt qua tôi :) Một số điều về phương pháp này trở nên hơi lộn xộn do những điều kỳ quặc về ngôn ngữ mà tôi chưa tìm thấy cách nào tốt hơn. Có lẽ có một cách tốt hơn hoàn toàn? Có lẽ một cái gì đó toán học hơn?
Emigna

Tôi đã suy nghĩ về việc sử dụng số nhị phân bằng cách nào đó ... không nghĩ ra nó hoàn toàn, không có thời gian rảnh rỗi.
Bạch tuộc ma thuật Urn

Đã được một lúc kể từ khi tôi cố gắng vượt qua một trong những giải pháp của bạn hơn 20 byte. Bit xấu hổ khi thừa nhận nó, nhưng khi tôi thấy câu trả lời của bạn, tôi thường không lãng phí thời gian để cố gắng tìm kiếm sự cải thiện nữa; bởi vì thông thường tôi không thể tìm thấy bất kỳ hah!
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Quá tệ. Bạn thường quản lý để đưa ra các giải pháp thay thế thú vị (và / hoặc cải tiến) cho các giải pháp của tôi. Các chương trình lớn trong ngôn ngữ golf chắc chắn là khó khăn hơn để dành thời gian để làm việc chắc chắn.
Emigna

5

Sạch sẽ , 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))])

Hãy thử trực tuyến!


1
@KevinCruijssen Đã sửa.
Οurous

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

Hãy thử trực tuyến!


1

Than , 68 63 62 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 5 byte bằng cách loại bỏ kiểm tra phạm vi chỉ mục bây giờ không cần thiết. Giải trình:

NθNηNζ

Nhập chiều dài vào q, số lượng hạt cát vào hvà chỉ số vào z.

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

Lặp lại các (q+1)/2hàng (từ dưới lên trên), sau đó 9 hạt trong mỗi ô trong hàng, sau đó lặp qua các chữ số trong hàng.

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

Nhảy đến chữ số.

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

Nếu có thể, hãy phân phối một hạt cát cho chữ số này, làm giảm lượng cát và chỉ số còn lại. Nếu chúng ta đã vượt qua chỉ số, điều này vẫn chuyển đổi không gian thành số không, lấp đầy đồng hồ cát. Chữ số được in lên trên vì điều này có nghĩa là con trỏ sẽ ở trên cổ sau chữ số cuối cùng.

↑-

In cổ.

M⊘⊖LIη←Iη

Trung tâm và in số lượng cát còn lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.