沙漏的底部


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我将稍微修改规则,以使索引永远不会超出总和。可能更好理解。
凯文·克鲁伊森


第一个输入是否总是一个奇数?
Brian H.18年

@BrianH。“ 底边的长度永远都是奇怪的 ”我意识到我在这项挑战中有太多规则,所以我可以理解你已经读懂了。:)
Kevin Cruijssen

Answers:


3

05AB1E68 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 '18

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η

居中并打印剩余的沙子量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.