정수, 조립하십시오!


30

당신의 작업에서 정수를 조립하는 것입니다 1에 대한 N폭의 사각형으로 (입력으로 주어진) W과 높이 H(또한 입력으로 주어진). 개별 숫자는 90 도의 배수로 회전 할 수 있지만 사각형에서 연속 블록으로 나타나야합니다. 즉, 숫자 중 하나를 여러 자릿수로 나누고 사각형에 숫자를 개별적으로 배치 할 수 없으며, 모퉁이에서 숫자의 세 자리를 구부릴 수도 없습니다. 각 숫자는 벽을 짓는 벽돌이라고 생각할 수 있습니다.

다음은 예입니다. 입력 내용이이라고 말합니다 (N, W, H) = (12, 5, 3). 가능한 해결책은 다음과 같습니다.

18627
21901
53114

명확하게하기 위해이 그리드의 사본 두 개가 있습니다. 하나는 숫자가 숨겨져 있고 다른 하나는 숫자가 숨겨져 있습니다.

1####    #8627
2##01    #19##
##11#    53##4

사각형을 독특한 방식으로 다시 분해 할 수 없다면 괜찮습니다. 예를 들어 위의 예에서는 다음 12과 같이 배치 될 수도 있습니다.

#####    18627
21#01    ##9##
##11#    53##4

규칙

당신은 그 가정 할 수 N양이며, 그 W*H에서 정수의 자릿수와 일치 1N포함 해, 지정된 번호로 사각형의 타일이 존재하는지. 나는 이것이 항상 가능한지에 대한 증거를 현재 가지고 있지 않지만, 당신이 할 수 있다면 관심이 있습니다.

출력은 단일 줄 바꿈으로 구분 된 문자열 또는 문자열 목록 (각 줄에 대해 하나씩) 또는 한 자리 정수 목록 (각 셀에 대해 하나씩) 일 수 있습니다.

제출 결과는 결정적이어야하며 합리적인 데스크톱 컴퓨터에서 1 분 이내에 모든 테스트 사례를 처리 할 수 ​​있어야합니다.

당신은 쓸 수 있습니다 프로그램이나 기능을 하고, 우리의 사용 표준 방법 입력을 수신하고 출력을 제공합니다.

모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

테스트 사례

첫 번째를 제외하고는 이들 중 어느 것도 독특하지 않습니다. 각 테스트 사례 N W H에는 가능한 출력 이 뒤 따릅니다. 사각형이 너무 좁아서 더 큰 숫자를 가로로 쓸 수 없을 때 답이 작동하는지 확인하십시오.

1 1 1
1

6 6 1
536142

6 2 3
16
25
34

10 1 11
1
0
8
9
2
6
7
3
1
5
4

11 13 1
1234567891011

27 9 5
213112117
192422581
144136119
082512671
205263272

183 21 21
183116214112099785736
182516114011998775635
181116013911897765534
180415913811796755433
179115813711695745332
178315713611594735231
177115613511493725130
176215513411392715029
175115413311291704928
174115313211190694827
173115213111089684726
172015113010988674625
171915012910887664524
170814912810786654423
169714812710685644322
168614712610584634221
167514612510483624120
166414512410382614019
165314412310281603918
164214312210180593817
163114212110079583716

200 41 12
81711132917193661114105533118936111184136
50592924448815915414562967609909953662491
89529721161671582389717813151113658811817
41418184511110119010183423720433017331118
35171183614003547461181197275184300111711
41874381132041861871718311415915921116264
11914245014112711011594492626831219331845
17125112629222085166344707736090956375181
94507611291431121128817413566319161275711
11011540021119913511011169939551729880780
92725141607727665632702567369893534277304
78118311405621148296417218591118562161856

8
이것이 항상 가능하다는 증거가 있습니까?
Fatalize

@Fatalize 실제로 좋은 질문입니다. 주어진 모든 입력에 대해 가능하다고 가정 할 수 있지만 두 가지 방법 중 어느 것이 든 흥미로운 증거입니다.
Martin Ender

@Fatalize : 최소한 input의 사소한 경우 (10, 1, 1)에는 가능하지 않습니다 (1에서 모든 숫자를 구성에 N사용해야 한다고 가정 ). 이 구속 조건이 유지되는 경우 가능하게하려면 사각형의 영역이 최소 자릿수 이상이어야 1..N합니다. 만약 그 제약이 완화된다면, 모든 경우에 가능합니다 (그러나 도전은 그리 재미 있지 않습니다 : P)
Sebastian Lenartowicz

2
@SebastianLenartowicz : 사각형의 영역이 [1, N]의 숫자 자릿수와 일치한다고 말하는 부분을 놓쳤다 고 생각합니다. N == 10이면 너비와 높이는 1과 11이어야합니다. 너비 나 높이가 1이면이 문제는 항상 해결할 수 있습니다.
Yay295

1
@MartinEnder 반대의 도전도 흥미로울 수 있습니다 : 입력으로 숫자 N의 사각형 을 입력하면 (그리고 결국 프로그램은 너비와 높이에서 계산할 수 있습니다) 프로그램은 사각형 이이 도전에 대한 유효한 답인지 확인해야합니다. ...
Dada

답변:


3

Pyth, 35 바이트

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY

mbomb007의 크레딧. 나는 그의 알고리즘을 사용했다. 원래 Steven H. 만 도와주고 싶었지만 짧은 버전을보고 싶었습니다.

N첫 번째 줄에, 그리고 W,H두 번째 줄에 : 온라인을 시도해보십시오 데모

Pyth 구현에서 불쾌한 버그를 발견했습니다 .[( 실제로 구현 한 이후 내 잘못). 내일 고쳐야 해 그 결과 +3 바이트가 발생했습니다.

설명:

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY
                                  Y   start with the empty list []
                                      I'll perform all operations on this list. 
                                      Sometimes it is called G, sometimes N. 
                                vz    read the second line and evaluate it: [W, H]
                              _B      bifurcate it with reverse: [[W, H], [H, W]]
 u                                    for each pair H in ^:
                    .TG                  transpose G
                   +   mkeH              append H[1] empty strings
                  <        eH            use only the first H[1] strings
                                         lets call this result N
  u                          )           modify N, until it doesn't change anymore:
   m                        N               map each d in N to:
     WghHl+dQ                                  if H[0] >= len(d+Q):
    +        d  Q                                 d + Q
              ~t                                  and decrement Q by 1
             d                                 else:
                                                  d
j                                     at the end print every row on a separate line

7

파이썬 2, 210200 바이트

편집 : 지금 작동합니다!

가장 큰 숫자로 시작하여 위에서 아래로, 왼쪽에서 오른쪽으로 채 웁니다. 그런 다음 전치하고 다시 수행하십시오. 그런 다음 전치하고 인쇄하십시오. 줄이 아직 전체 길이가 아니기 때문에 조옮김이 작동 할 공간을 채워야했습니다.

나는 중첩 된 exec일 을하는 데 어려움을 겪었습니다 (해야 할 일 exec'exec"..."*w\n;...'*2. 누군가 알아낼 수 있다면 알려주십시오.

n,w,h=input()
s=[""]*h
for x in 1,2:
    exec"for i in range(h):l=len(s[i]+`n`)<=w;s[i]+=`n`*l;n-=l\n"*w;s=[r.replace(" ","")for r in map(lambda x:`x`[2::5],zip(*[r.ljust(w)for r in s]))];w,h=h,w
print s

온라인으로 시도 -수정 된 기능을 사용하여 여러 테스트 사례를보다 쉽게 ​​실행할 수 있습니다 (및 사용할 수 없음exec). 다른 버전의 주석 처리를 제거하고 stdin을 수정하여 실행되는지 확인하십시오.

덜 골프 :

def f(n,w,h):
    s=[""]*h
    for x in 1,2:
        for j in[0]*w:
            for i in range(h):
                l=len(s[i]+`n`)<=w
                s[i]+=`n`*l
                n-=l
        s=[r.ljust(w)for r in s]
        s=map(lambda x:`x`[2::5],zip(*s))
        s=[r.replace(' ','')for r in s]
        w,h=h,w
    print"\n".join(s)

이것이 현재 모든 경우에 효과가있을 가능성이 높지만 (비공식적 인) 증거는 여전히 인정 될 것입니다. ;)
Martin Ender

@MartinEnder 증거는 아마도 저 너머에있을 것입니다. 숫자가 더 길어질수록 테스트 케이스가 매우 커집니다. 항상 솔루션이 있는지 여부에 대한 증거와 관련이 있거나 동일합니다.
mbomb007

6

자바 스크립트, 284 259 245 241 240 223 209 205 바이트

// Golfed
let f = (N,W,H)=>eval('a=Array(H).fill("");while(N)g:{s=""+N--;d=s[L="length"];for(i in a)if(a[i][L]+d<=W){a[i]+=s;break g}for(p=0;d;++p){l=a[p][L];for(k=p+d;k>p;)l=a[--k][L]-l?W:l;while(l<W&&d)a[p+--d]+=s[d]}}a');

// Ungolfed
(N,W,H) => {
    a = Array(H).fill(""); // Create `H` empty rows.

    while (N) g : {
        s = "" + N--; // Convert the number to a string.
        d = s[L="length"]; // Count the digits in the number.

        // Loop through the rows trying to fit the number in horizontally.
        for (i in a) {
            if (a[i][L] + d <= W) { // If it fits.
                a[i] += s; // Append the number to the row.
                break g; // This is what a goto statement looks like in JavaScript.
            }
        }

        // Loop through the rows trying to fit the number in vertically.
        for (p = 0; d; ++p) {
            l = a[p][L]; // Get the length of the row.

            // Find `d` adjacent rows of the same length.
            for (k = p + d; k > p; ) {
                // If `a[--k][L] == l`, continue.
                // Else set `l` to `W` so the next loop doesn't run.
                l = a[--k][L] - l ? W : l;
            }

            // Put the characters in position.
            while (l < W && d)
                a[p+--d] += s[d];
        }
    }

    return a;
}

let test_data = [[1,1,1],
                 [6,6,1],
                 [6,2,3],
                 [10,1,11],
                 [10,11,1],
                 [11,13,1],
                 [27,9,5],
                 [183,21,21],
                 [184,2,222],
                 [200,41,12],
                 [1003,83,35]];

for (let test of test_data)
    console.log(f(test[0],test[1],test[2]));


1
-대신 !=두 개의 숫자가 다른지 여부를 테스트 하여 1 바이트를 절약하십시오 .
Neil

2

Pyth, 79 50 48 바이트

버그를 해결할 때까지 비경쟁 (예 : [6,6,1]은 [6,1,6]과 동일하게 반환) Pyth를 사용하는 것은 처음이므로 많은 기능이 누락되었을 수 있습니다.

Jakube 덕분에 29 바이트를 절약하고 실제로 내 코드를 만들었습니다!

repr()호출이 불필요 하다는 것을 인식하여 2 바이트를 더 절약했습니다 .

기본적으로 mbomb007의 Python 2 답변을 번역 한 것입니다.

AEJmkHFb2VHVGIgGl+@JNQ XNJ~tQ)))=.[.TJkGA,HG)jJ

형식으로 입력을
n
w,h받습니다.


2
올바른 솔루션이 될 때까지 답변을 삭제해야합니다.
mbomb007 1

나는 대부분의 코드가 정확하다고 생각합니다. 전치하는 동안 내가 볼 수있는 유일한 오류가 발생합니다. mbomb007은 나머지 열을 공백으로 조심스럽게 채우고 공간을 압축하여 제거하여 조옮김합니다. 이것은 보증합니다. 행렬을 바꾼 후에는 w길이가 있습니다. =.TZ길이를 모르기 때문에 보장 할 수 없습니다 w.
Jakube

실제로 주요 오류, 즉 !>+@ZN`zK해야한다 !>+@ZN`zJ. 그런 다음 모든 작은 테스트 사례가 작동합니다. 그러나 조옮김이 실패하는 테스트 사례를 만들 수 있습니다 (위 설명 참조). 이 작업을 수행하려면 =.[.TZkK(대신 누락 된 열을 빈 문자열로 채우십시오) 대신 필요 =.TZ합니다.
Jakube

Pyth와 혼동하지 마십시오. 코드에서 당신은 점 같은 값 (같은 두 개의 여러 변수가 K@Q1)를. 어떤 변수가 어떤 값인지 추적하는 것은 매우 어려웠습니다 ... 그리고 코드를 복사하지 마십시오. 간단하게 유지하십시오. 부울 트릭 =Y...은 Python에게는 좋은 아이디어 일 수 있지만 간단한 I경우 (if) 훨씬 더 읽기 쉽고 짧습니다.
Jakube

여기 mbomb007의 코드를 사용하여 정말 간단한 해결책이있다 : 링크 걸리는 n첫 번째 줄에 (우리가 별도의 변수에 값을 할당하지 않아도 이런 식으로, 우리는 간단하게 사용할 수 있습니다 Q). 그리고 wh즉시 할당받을 두 번째 줄에 GH함께 AE.
Jakube

1

Stax , 27 바이트

é!L↑?∞S░♠╔)¥¼/ÿµ◄÷│♦╫Δò6√√╣

실행 및 디버깅

for의 한 줄에 입력합니다 {N} {H} {W}.

이 프로그램은 지정된 크기의 공간 격자로 시작합니다. N..의 각 숫자 1에 대해 적절한 크기의 공백 문자열에서 형식화 된 숫자로 단일 문자열 대체를 시도합니다. 교체를 수행 할 수 없으면 바뀐 그리드로 다시 시도합니다.

z)A+*   create "grid" of spaces and newlines of specified size
,Rr     create range [n ... 1]
F       for each number execute the indented section; it will fit the value into the grid
  $%z(  make a string out of spaces the same length as the number; e.g. 245 => "   "
  Y     store the space string in register Y; this will be used as a search substring
  [#    count the number of occurrences of y in the grid; the grid is still on the stack
  X     store the count in register X; this will be used as a condition
  G     jump to routine at closing curly brace
  y_$|e replace the first instance of y (the spaces) with the current number
  xG    push x; then jump to routine at closing curly brace
        end program
}       called routine jump target
C       pop top of stack; if it's truthy terminate routine
|jM|J   split on newlines; transpose; join with newlines

이것을 실행

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