ส่วนล่างของนาฬิกาทราย


14

ท้าทาย:

อินพุต:สามจำนวนเต็ม: ความยาวขอบด้านล่าง; ปริมาณเริ่มต้นของเม็ดทราย ดัชนี

เอาท์พุท:เอาท์พุทสถานะของส่วนด้านล่างของนาฬิกาทรายที่ดัชนีที่กำหนดขึ้นอยู่กับความยาวขอบด้านล่างที่กำหนดและปริมาณของเม็ดทราย

กฏท้าทาย:

  • เราจำลองเม็ดทรายที่มีตัวเลข 1-9
  • เราใส่จำนวนเม็ดทรายที่เหลืออยู่ในปัจจุบันที่ด้านบนตรงกลางตามด้วยอักขระเดี่ยวที่คุณเลือก (ยกเว้นตัวเลข, ช่องว่างและบรรทัดใหม่; เช่น-) บนบรรทัดด้านล่าง
  • เมื่อนาฬิกาทรายถูกเติมเต็มเราจะเติมมันต่อแถวหนึ่งหลักในแต่ละครั้ง
  • เมื่อทรายสามารถไปทางซ้ายหรือทางขวาเราจะไปทางขวาเสมอ (เช่นเดียวกับการปรับสมดุลของเม็ดทรายที่เหลืออยู่เหนือแก้วชั่วโมง)
  • เมื่อเราไปถึง 9 มันเต็มแล้วและเราไม่สามารถใส่ทรายอีกต่อไปในสถานที่เฉพาะในนาฬิกาทราย
  • จำนวนเม็ดทรายที่เหลือจะถูกจัดเรียงอย่างถูกต้องเสมอ
  • เมื่อด้านล่างของนาฬิกาทรายลดลงครึ่งหนึ่งหรือเม็ดทรายเหลือถึง 0 เราจะไปต่อไม่ได้อีกและนี่จะเป็นผลลัพธ์สำหรับดัชนีทั้งหมดที่อยู่นอกเหนือจุดนี้
  • อนุญาตทั้งดัชนี 0 หรือดัชนี 1 ดัชนีและโปรดระบุสิ่งที่คุณใช้ในคำตอบของคุณ
  • ช่องว่างต่อท้ายและนำหน้าและต่อท้ายเดียวหรือนำขึ้นบรรทัดใหม่เป็นทางเลือก
  • คุณได้รับอนุญาตให้ใช้อักขระอื่นแทนศูนย์เพื่อเติมเต็มช่องว่างของส่วนล่างของนาฬิกาทราย (ไม่รวมตัวเลขบรรทัดใหม่หรืออักขระที่คุณใช้เป็นคอ) หากคุณเลือกที่จะแสดง
  • ความยาวขอบด้านล่างจะเป็นเลขคี่เสมอ
  • ความยาวขอบด้านล่างจะเป็น>= 3; และปริมาณของเม็ดทราย>= 0
  • หากคุณต้องการให้คุณพิมพ์สถานะทั้งหมดและรวมถึงดัชนีที่กำหนดด้วย
  • คุณสามารถสันนิษฐานได้ว่าดัชนี (0 ดัชนี) จะไม่ใหญ่กว่าจำนวนเม็ดทรายทั้งหมด (ดังนั้นเมื่อมีทราย 100 เม็ดดัชนี 100 คือดัชนีป้อนเข้าที่ถูกต้องสูงสุด)
  • ดัชนีแรก (0 สำหรับ 0-indexed; 1 สำหรับ 1-indexed) จะส่งออกนาฬิกาทรายที่ว่างเปล่าที่มีปริมาณเม็ดทรายอยู่ด้านบน

ตัวอย่าง:รูปภาพ (หรือ ascii-art) พูดได้มากกว่าหนึ่งพันคำดังนั้นนี่คือตัวอย่าง:

ป้อนความยาวขอบด้านล่าง: 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

@Neil ฉันจะเปลี่ยนกฎเล็กน้อยเพื่อให้ดัชนีไม่สามารถไปไกลกว่าผลรวมทั้งหมดได้ น่าจะดีกว่าที่จะเข้าใจ
Kevin Cruijssen


การป้อนข้อมูลแรกคือจำนวนคี่เสมอหรือไม่
Brian H.

@BrianH " ความยาวขอบด้านล่างนั้นจะแปลกเสมอ " ฉันรู้ว่าฉันมีกฎมากเกินไปในความท้าทายนี้ดังนั้นฉันจึงเข้าใจได้ว่าคุณอ่านมันมาแล้ว :)
Kevin Cruijssen

คำตอบ:


3

05AB1E , 68 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ˆëć<¸«¸ì]
จากนั้นเราจะวนซ้ำรายการองค์ประกอบที่ลดลงเหล่านี้ในรายการจนกว่ารายการจะประกอบด้วยศูนย์เป็นศูนย์จากนั้นเลื่อนไปยังองค์ประกอบถัดไป เราหยุดเมื่อผลรวมทั้งหมดเท่ากับอินพุตที่สอง

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

จริงๆ? มันซับซ้อนไหม?
Magic Octopus Urn

@ MagicOctopusUrn: คุณยินดีอย่างยิ่งที่จะชนะฉัน :) บางสิ่งเกี่ยวกับวิธีนี้กลายเป็นความยุ่งเหยิงเล็กน้อยเนื่องจากภาษาที่ฉันไม่ได้พบวิธีที่ดีกว่า อาจจะมีวิธีที่ดีกว่าโดยสิ้นเชิง? อาจมีบางอย่างทางคณิตศาสตร์มากกว่า
Emigna

ฉันกำลังคิดเกี่ยวกับการใช้เลขฐานสองอย่างใด ... ไม่ได้คิดอย่างเต็มที่ไม่มีเวลาว่าง
Magic Octopus Urn

ไม่นานมานี้ตั้งแต่ฉันพยายามเอาชนะหนึ่งในโซลูชันของคุณที่มีมากกว่า 20 ไบต์ บิตละอายใจที่จะยอมรับมัน แต่เมื่อฉันเห็นคำตอบของคุณฉันมักจะไม่เสียเวลาพยายามหาการปรับปรุงอีกต่อไป; เพราะโดยปกติฉันไม่สามารถหาฮ่า ๆ ๆ !
Magic Octopus Urn

@MagicOctopusUrn: แย่จัง คุณมักจะจัดการกับทางเลือกที่น่าสนใจ (และ / หรือการปรับปรุง) เพื่อแก้ปัญหาของฉัน โปรแกรมภาษากอล์ฟขนาดใหญ่นั้นยากต่อการใช้เวลาในการทำงานอย่างแน่นอน
Emigna


1

Perl 5 , 301 bytes

($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จำนวนเม็ดทรายลงไปและดัชนีลงไปhz

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

วนรอบ(q+1)/2แถว (จากล่างขึ้นบน) จากนั้น 9 เม็ดในแต่ละเซลล์ในแถวจากนั้นวนซ้ำตัวเลขในแถว

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

ข้ามไปที่หลัก

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

ถ้าเป็นไปได้ให้กระจายเม็ดทรายไปที่ตัวเลขนี้เพื่อลดปริมาณของทรายและดัชนีที่เหลือ หากเราผ่านดัชนีสิ่งนี้จะยังคงแปลงช่องว่างเป็นศูนย์เติมนาฬิกาทราย ตัวเลขจะถูกพิมพ์ขึ้นไปเพราะนี่หมายความว่าเคอร์เซอร์จะอยู่ที่คอหลังจากตัวเลขสุดท้าย

↑-

พิมพ์คอ

M⊘⊖LIη←Iη

จัดกึ่งกลางและพิมพ์ปริมาณทรายที่เหลืออยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.