Inteiros, Montar!


30

Sua tarefa é montar os números inteiros de 1até N(dados como entrada) em um retângulo de largura We altura H(também dados como entrada). Os números individuais podem ser girados por qualquer múltiplo de 90 graus, mas devem aparecer como blocos contíguos no retângulo. Ou seja, você não pode dividir um dos números em vários dígitos e colocar os dígitos no retângulo individualmente, nem dobrar três dígitos de um número em uma esquina. Você pode considerar cada número um tijolo a partir do qual você está construindo um muro.

Aqui está um exemplo. Diga que sua opinião é (N, W, H) = (12, 5, 3). Uma solução possível é:

18627
21901
53114

Para maior clareza, aqui estão duas cópias dessa grade, uma com os números de um dígito ocultos e outra com os números de dois dígitos ocultos:

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

Tudo bem se o retângulo não puder ser desmontado novamente de uma maneira única. Por exemplo, no exemplo acima, o 12também poderia ter sido colocado assim:

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

Regras

Você pode assumir que Né positivo e que W*Hcorresponde ao número de dígitos nos números inteiros de 1até Ninclusivo, e que existe um lado a lado do retângulo nos números fornecidos. No momento, não tenho uma prova de que isso sempre seja possível, mas estaria interessado em uma, se você tiver.

A saída pode ser uma única cadeia de caracteres separada por avanço de linha ou uma lista de cadeias (uma para cada linha) ou uma lista de listas de números inteiros de um dígito (uma para cada célula).

Os resultados do seu envio devem ser determinísticos e você deve poder lidar com todos os casos de teste em menos de um minuto em uma máquina de desktop razoável.

Você pode escrever um programa ou uma função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída.

Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.

Isso é , então a resposta mais curta e válida - medida em bytes - vence.

Casos de teste

Exceto pelo primeiro, nenhum deles é único. Cada caso de teste é N W Hseguido por uma saída possível. Verifique se sua resposta funciona quando o retângulo é muito estreito para escrever os números maiores horizontalmente.

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
Existe uma prova de que isso sempre é possível?
Fatalize

@Fatalize Boa pergunta, na verdade. Você pode assumir que é possível para todas as entradas fornecidas, mas uma prova de qualquer maneira seria interessante.
Martin Ender

@Fatalize: Pelo menos no caso trivial de entrada (10, 1, 1), não é possível (assumindo que todos os números de 1 a NDEVEM ser usados ​​na construção). Se essa restrição for mantida, a área do retângulo em unidades deverá ter pelo menos o número de dígitos 1..Npara possibilitar isso. Se essa restrição é relaxada, é possível em todos os casos (mas, em seguida, o desafio não é muito divertido: P)
Sebastian Lenartowicz

2
@SebastianLenartowicz: Acho que você perdeu a parte em que diz que a área do retângulo corresponde à soma dos dígitos dos números em [1, N]. Se N == 10, a largura e a altura deverão ser 1 e 11. Se a largura ou a altura forem 1, esse problema será sempre solucionável.
precisa saber é o seguinte

1
@MartinEnder O desafio oposto também pode ser interessante: um retângulo de dígitos como entrada (e eventualmente N, mas o programa pode calculá-lo a partir da largura e da altura), e o programa precisa verificar se o retângulo é uma resposta valida para esse desafio. ...
Dada

Respostas:


3

Pitão, 35 bytes

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

Créditos para mbomb007. Eu usei o algoritmo dele. Originalmente, eu só queria ajudar Steven H., mas queria ver uma versão curta.

Toma Nna primeira linha e W,Hna segunda linha: Experimente on-line: Demonstração

Encontrei um bug desagradável na implementação do Pyth .[(minha própria culpa, desde que eu o implementei). Preciso consertar amanhã. Isso resultou em +3 bytes.

Explicação:

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

Python 2, 210 200 bytes

Edit: Funciona agora!

Preenche de cima para baixo, da esquerda para a direita, começando com os maiores números. Em seguida, transponha e faça novamente. Transponha e imprima. Eu tive que preencher com espaços para a transposição funcionar, já que as linhas ainda não estão em seu comprimento total.

Eu tive problemas para conseguir um exectrabalho aninhado (para fazer exec'exec"..."*w\n;...'*2. Se alguém puder descobrir isso, me avise.

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

Experimente on-line - usa uma função modificada para executar vários casos de teste com mais facilidade (e não pode ser usadoexec). Remova o comentário da outra versão e modifique stdin para vê-la sendo executada.

Menos golfe:

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)

É muito provável que isso funcione para todos os casos agora, mas uma prova (informal) ainda seria apreciada. ;)
Martin Ender

@MartinEnder Provavelmente está além de mim. Para os números variarem mais, os casos de teste ficam muito grandes. Provavelmente está relacionado ou é o mesmo que a prova de que sempre existe uma solução.
mbomb007

6

JavaScript, 284 259 245 241 240 223 209 205 bytes

// 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
Salve 1 byte usando em -vez de !=para testar se dois números são diferentes.
Neil

2

Pyth, 79 50 48 Bytes

Não competindo até que eu resolva bugs (por exemplo, [6,6,1] retorna o mesmo que [6,1,6]). É a minha primeira vez tentando usar o Pyth, então provavelmente estou perdendo muitos recursos.

Graças a Jakube, salvei 29 bytes e fiz meu código realmente funcionar!

Economizou mais dois bytes ao perceber que as repr()chamadas eram desnecessárias.

É basicamente apenas uma tradução da resposta Python 2 do mbomb007.

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

Recebe entrada na forma de
n
w,h.


2
As respostas devem ser excluídas até que sejam uma solução válida.
Mbomb007 03/08

Eu acho que a maior parte do código está correta. O único erro que vejo acontece durante a transposição. mbomb007 transpõe preenchendo cuidadosamente as colunas restantes com espaços, depois fecha e remove os espaços. Isso garante. que após a transposição da matriz tenha wcomprimento. =.TZnão posso garantir isso, pois não sabe o comprimento w.
Jakube 3/08

Na verdade, o principal erro é que !>+@ZN`zKdeveria ser !>+@ZN`zJ. Todos os pequenos casos de teste funcionam. Mas você pode criar casos de teste, nos quais a transposição falha (como descrito acima). Para que isso funcione, você precisa de algo como =.[.TZkK(preencha as colunas ausentes com cadeias de caracteres vazias) em vez de =.TZ.
Jakube 3/08

E tente não se confundir com Pyth. No seu código, você tem duas variáveis ​​múltiplas que apontam para os mesmos valores (como Ke @Q1). Era muito difícil rastrear qual variável é qual valor, ... E não basta copiar o código. Mantenha simples. O truque booleano =Y...pode ser uma boa idéia para o Python, mas um simples I(se) seria muito mais legível (e também mais curto).
Jakube 3/08

Aqui está uma solução muito simples usando o código do mbomb007: Link Leva nna primeira linha (desta forma, não precisamos atribuir o valor a uma variável extra, podemos simplesmente usá-lo Q). E we hna segunda linha, que se imediatamente designado para Ge Hcom AE.
Jakube 3/08

1

Stax , 27 bytes

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

Execute e depure

É necessário inserir uma linha no for {N} {H} {W}.

Este programa começa com uma grade de espaços do tamanho especificado. Para cada número de N.. 1, ele tenta fazer uma única substituição de sequência de uma sequência de espaços do tamanho apropriado para o número formatado. Se nenhuma substituição puder ser executada, tente novamente com uma grade transposta.

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

Execute este

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.