Нижняя часть песочных часов


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. « Длина нижнего края всегда будет странной ». Я понимаю, что у меня слишком много правил в этом испытании, поэтому я могу понять, что вы прочитали его. :)
Кевин 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

В самом деле? Это было сложно?
Волшебная Урна Осьминога

@MagicOctopusUrn: Вы можете переиграть меня :) Некоторые вещи в этом методе стали немного беспорядочными из-за языковых излишеств, которые я не нашел лучшего способа обойти. Может быть, есть лучший способ вообще? Может быть, что-то более математическое?
Emigna

Я как-то думал об использовании двоичных чисел ... не думал об этом полностью, у меня не было свободного времени.
Волшебная Урна Осьминога

Прошло некоторое время с тех пор, как я попытался превзойти одно из ваших решений, которое занимает более 20 байтов. Немного стыдно это признавать, но когда я вижу ваши ответы, я обычно больше не трачу время, пытаясь найти улучшения; потому что обычно я не могу найти ничего, ха!
Волшебная Урна Осьминога

@MagicOctopusUrn: Очень плохо. Обычно вам удается предлагать интересные альтернативы (и / или улучшения) моим решениям. Большие программы на языках игры в гольф, безусловно, сложнее потратить время на то, чтобы над ними работать.
Emigna

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.