모래 시계의 바닥 부분


14

도전:

입력 : 3 개의 정수 : 하단 가장자리 길이; 모래 알갱이의 시작 량; 인덱스

출력 : 주어진 하단 가장자리 길이와 모래 알갱이의 양을 기준으로 주어진 인덱스에서 모래 시계의 하단 부분 상태를 출력합니다.

도전 규칙 :

  • 우리는 숫자 1-9로 모래 알갱이를 시뮬레이션합니다
  • 우리는 (즉, 숫자, 공백과 새로운 라인을 제외한 자신의 선택의 하나의 문자에 의해 다음, 중간에 상단에 모래 입자의 현재 남아있는 양을 넣어 -그 아래 라인을)
  • 모래 시계가 채워질 때 행당 한 번에 한 자리 씩 채 웁니다
  • 모래가 왼쪽이나 오른쪽으로 갈 수 있으면 항상 오른쪽으로갑니다 (모래 유리 위에 남아있는 모래 알갱이의 균형을 잡는 경우에도 마찬가지입니다)
  • 우리가 9에 도달하면 그것은 채워지고 모래 시계의 특정 위치에 더 이상 모래를 넣을 수 없습니다
  • 남은 모래 알갱이의 양도 항상 올바르게 정렬됩니다
  • 모래 시계의 바닥 절반이 완전히 채워지거나 남아있는 모래 알갱이의 양이 0에 도달하면 더 이상 갈 수 없으며이 시점 이후의 모든 인덱스에 대한 출력이됩니다.
  • 0- 인덱싱 또는 1- 인덱싱이 모두 가능하며 답변에 사용한 것을 지정하십시오.
  • 후행 및 선행 공간과 단일 후행 또는 선행 개행은 선택 사항입니다.
  • 모래 시계 하단 부분의 빈 공간을 채우려면 0 대신 다른 문자를 사용할 수 있습니다 (숫자, 줄 바꾸기 또는 목으로 사용한 문자 제외).
  • 하단 가장자리 길이는 항상 홀수
  • 최하단 길이는 >= 3; 그리고 모래 알갱이의 양>= 0
  • 원하는 경우 주어진 색인을 포함하여 모든 상태를 인쇄 할 수도 있습니다
  • (0- 인덱싱 된) 인덱스가 총 모래 알갱이의 양보다 크지 않다고 가정 할 수 있습니다 (따라서 100 개의 모래 알갱이가 있으면 인덱스 100은 최대 유효한 인덱스 입력입니다).
  • 첫 번째 인덱스 (0 인덱스의 경우 0, 1 인덱스의 경우 1)는 그 위에 모래 알갱이가있는 빈 모래 시계를 출력합니다.

예 : 그림 (또는 아트 아트)은 천 단어 이상을 말하므로 여기에 예가 있습니다.

하단 가장자리 길이 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ˆëć<¸«¸ì]
그런 다음 목록이 0으로 만 구성되고 다음으로 넘어갈 때까지 목록에서 요소를 감소시키는 이러한 목록을 반복합니다. 총합이 두 번째 입력과 같을 때 멈 춥니 다.

[     #              ]   # 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 : 당신은 나를 outgolf에 매우 환영합니다 :)이 방법에 대한 몇 가지 사항은 더 나은 방법을 찾지 못한 언어 문제 때문에 약간 지저분 해졌습니다. 어쩌면 더 좋은 방법이 있습니까? 좀 더 수학적인 것이 있을까요?
Emigna

나는 이진 숫자를 어떻게 든 사용하려고 생각하고 ... 완전히 생각하지 않았고 여가 시간이 없었습니다.
Magic Octopus Urn

20 바이트가 넘는 솔루션 중 하나를 아웃 고프하려고 시도한 지 오래되었습니다. 인정하기는 조금 부끄러운 일이지만, 당신의 대답을 볼 때 나는 보통 더 이상 개선점을 찾는 데 시간을 낭비하지 않습니다. 보통 나는 아무것도 찾을 수 없기 때문에!
Magic Octopus Urn

@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 수정되었습니다.
OUurous

1

펄 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≧⁻λη≧⁻λζ»

가능하면이 숫자에 모래 알갱이를 분배하여 모래와 색인의 양을 줄이십시오. 인덱스를 통과 한 경우에도 여전히 모래 시계를 채우면서 공백을 0으로 변환합니다. 커서는 마지막 숫자 다음에 목에 위치하기 때문에 숫자가 위쪽으로 인쇄됩니다.

↑-

목을 인쇄하십시오.

M⊘⊖LIη←Iη

남아있는 모래의 양을 중앙에 인쇄하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.