Нижня частина пісочного годинника


14

Виклик:

Вхід: Три цілі числа: довжина від нижнього краю; початкова кількість зерен піску; покажчик

Вихід: Вивести стан нижньої частини пісочного годинника за заданим показником, виходячи із заданої довжини нижнього краю та кількості піску.

Правила виклику:

  • Ми моделюємо зерна піску цифрами 1-9
  • Ми розміщуємо залишилася кількість піщинок піску вгорі посередині, слідуючи окремим символом за власним вибором (виключаючи цифри, пробіли та нові рядки; тобто -) на рядок під ним
  • Коли пісочний годинник заповнюється, ми заповнюємо його по ряду, по одній цифрі за раз
  • Коли пісок може йти ліворуч або праворуч, ми ВЖЕ завжди йдемо праворуч (те саме стосується врівноваження залишкової кількості зерен піску над годинним склом)
  • Коли ми досягли 9, вона заповнена, і ми не можемо помістити більше піску в цьому конкретному місці в пісочному годиннику
  • Кількість зерен піску, що залишилися, також завжди правильно вирівнюється
  • Після того, як нижня половина пісочного годинника буде повністю заповнена або кількість піску, що залишилася, досягне 0, ми не можемо йти далі, і це буде результатом для всіх показників за цією точкою
  • Як 0, так і 1-індексований дозволено, і вкажіть, що ви використовували у своїй відповіді.
  • Проміжні та ведучі пробіли та окремий кінцевий або провідний новий рядок необов’язкові
  • Ви можете використовувати будь-який інший символ замість нуля для заповнення порожніх пробілів нижньої частини пісочного годинника (за винятком цифр, нових рядків або символу, який ви використовували як шию), якщо ви вирішите їх відобразити.
  • Довжина нижнього краю завжди буде непарною
  • Довжина нижнього краю буде >= 3; і кількість зерен піску>= 0
  • Якщо ви хочете, вам також дозволяється друкувати всі стани до та включаючи даний індекс
  • Ви можете припустити, що (0-індексований) індекс ніколи не буде більшим, ніж загальна кількість піщинок (тому, коли є 100 зерен піску, індекс 100 є максимально допустимим показником).
  • Перший показник (0 для 0-індексований; 1 для 1-індексованого) виведе порожній пісочний годинник із кількістю зерен піску над ним.

Приклад: картини (або 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 Я трохи зміню правила, щоб індекс ніколи не перевищував загальну суму. Напевно, краще зрозуміти.
Кевін Кройсейсен


це перший вхід завжди непарне число?
Брайан Х.

@BrianH. " Довжина від нижнього краю завжди буде непарною " Я розумію, що у мене є занадто багато правил у цьому виклику, тому я можу зрозуміти, що ви прочитали його. :)
Кевін Круїссен

Відповіді:


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

Дійсно? Це було складно?
Чарівний восьминога Урна

@MagicOctopusUrn: Вам дуже подобається перевершити мене :) Деякі речі щодо цього методу стали трохи безладним через мовні вигадки, що я не знайшов кращого шляху. Може, взагалі є кращий спосіб? Може, щось більш математичне?
Емінья

Я думав про те, щоб якось використати двійкові числа… не продумав це повністю, не мав вільної години.
Чарівний восьминіг Урна

Минуло деякий час, коли я намагався перевершити одне з ваших рішень, що перевищує 20 байт. Трохи соромно це визнати, але коли я бачу ваші відповіді, зазвичай більше не витрачаю час на пошук поліпшень; бо зазвичай я не в змозі знайти жодного га!
Чарівний восьминога Урна

@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.
Οurous

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η

Відцентруйте та роздрукуйте кількість піску, що залишилася.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.