Desenhe as combinações que somam 100


13

Você tem uma caixa com um número de um dígito em cada canto:

1|2
---
3|4

Se concatenar os dígitos ao longo das linhas da esquerda para a direita, obteremos 12 e 34. Se concatenar os dígitos ao longo das colunas de cima para baixo, obteremos 13 e 24. Se adicionarmos todos esses números, obtemos 12 + 34 + 13 + 24 = 83.

Desafio

Escreva um programa para imprimir todas as caixas em que a soma calculada como acima é igual a 100.

Supondo que cada canto contenha um número de dígito único entre 1 e 9, existem 9 combinações: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 e 3119. (Observe que existem 25 combinações se incluirmos 0, mas não somos para esse desafio.)

Observe que o exemplo 1234 não funciona, pois 12 + 34 + 13 + 24 não é igual a 100.

Entrada

Nenhum

Resultado

Caixas de resposta no seguinte formato:

A|B
---
C|D

A saída deve ser impressa em STDOUT ou na alternativa mais próxima.

Regras

  • AB + CD + CA + BD = 100
  • Cada canto conterá apenas os números inteiros positivos 1 a 9.
  • 0 é excluído.
  • Os números podem ser usados ​​mais de uma vez.
  • Você precisa desenhar as caixas, como acima. ( A|B\n---\nC|D\n)
  • Você precisa produzir todas as respostas válidas.
  • Uma nova linha à direita adicional está correta.
  • , o código mais curto em bytes vence.
  • Aplicam-se brechas padrão e T&C.

Esta é a minha primeira submissão, por isso, informe-me se precisar esclarecer alguma coisa.


Você poderia mostrar qual deveria ser a saída? Além disso, que tal um caractere de nova linha à direita?
Spikatrix

Bom desafio. Eu acho que você precisa dizer explicitamente quais números precisam ser adicionados. A linha "Os dois números concatenados de dois dígitos em MAIS os dois números de dois dígitos abaixo deve ser igual a 100". não está claro o suficiente. Eu só descobri usando o exemplo de 1234. Além disso, estou recebendo apenas 9 dessas combinações. Você pode mencionar as 16 combinações?
Optimizer

1
Fiz algumas edições na explicação e formatação. Se não corresponder à sua intenção original, reverta a edição.
Alex A.

1
@ DenhamCoote, na verdade, minha solução semi-codificada foi bastante interessante, porque é apenas semi-codificada. Isso foi uma exceção à regra, porque perguntas nas quais a flagrante flagrante é a melhor / mais óbvia opção geralmente não produzem respostas interessantes (consulte a pergunta recente sobre anéis borromeanos, por exemplo.) Obrigado pela pergunta.
Level River St

1
Aceitar uma resposta pode dar a impressão de que a pergunta está finalizada, por isso ainda vou demorar um pouco. Se você receber mais respostas depois, poderá alterar a aceitação, mas isso significa que você precisa ficar atento, o que pode não ter tempo para fazer. Os concursos de popularidade não são apreciados porque costumam ser escritos com preguiça e excessivamente amplos, geralmente do tipo "Faça X da maneira mais complexa possível". Geralmente, as únicas questões de boa popularidade são no processamento de imagens, onde a avaliação humana é a única maneira de decidir se o algoritmo é bom ou não. O processamento de imagens exclui arte pura que está fora do tópico.
Level River St

Respostas:


8

Pitão, 42 38 34 bytes

V ^ ST4IqC \ ds * VNsM ^, T1 2Xj \ | N3 "
---

A nova linha à direita no código é importante. A principal razão pela qual eu sou competitivo é porque eu uso o produto escalar vetor de [1, 1, 5, 7]e [20, 11, 11, 2]e compará-lo a 100.


"|"-> \|, \n-> (avanço de linha literal) e você não precisa da cotação final.
Dennis

@Dennis estava dormindo>. <
orlp

2
Se você não se importa, poderia adicionar uma explicação para aqueles (como eu) que não conseguem decifrar sua resposta incrivelmente curta?
Denham Coote

6

Ruby, 71

Como a codificação não é proibida (e, de qualquer forma, é difícil traçar uma linha), aqui está uma resposta codificada parcial.

1.upto(3){|i|1.upto(7-i*2){|j|print i,?|,j,'
---
',8-j-2*i,?|,i+6,'
'}}

Explicação

A fórmula para uma solução é a seguinte:

A*20+(B+C)*11+D*2=100

Por argumentos aritméticos modulares, vemos que A e D devem diferir em uma quantidade constante, tal que (A*20+D*2)%11seja constante. De fato D = A + 6. O iloop percorre os três valores possíveis de A.

O valor de B pode ser de 1 a 7-i*2e o total de B e C deve ser 14-A-D. Assim, obtemos as seguintes expressões, que são impressas. O Ruby permite novas linhas literais em strings incluídas em''

   i     |    j
------------------
8-j-2*i  |   i+6

4

Java, 202 200 198

Tentando pela primeira vez: D

EDIT: salvou 2 bytes com um cálculo um pouco menor encontrado em outro comentário.

class C{public static void main(String[]c){for(int i=0;++i<5;)for(int j=0;++j<7;)for(int k=0;++k<10;)for(int l=0;++l<10;)if(20*i+11*(j+k)+2*l==100)System.out.printf("%s|%s%n---%n%s|%s%n",i,j,k,l);}}

4

Lote - 187 bytes

Força bruta.

@!! 2>nul||cmd/q/v/c%0&&exit/b
set y=for /l &set z= in (1,1,9)do 
%y%%%a%z%%y%%%b%z%%y%%%c%z%%y%%%d%z%set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d&if !a!==100 echo %%a^|%%b&echo ---&echo %%c^|%%d

Não jogar golfe é um pouco menos nojento:

@echo off
setLocal enableDelayedExpansion
for /l %%a in (1,1,9) do (
    for /l %%b in (1,1,9) do (
        for /l %%c in (1,1,9) do (
            for /l %%d in (1,1,9) do (
                set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d
                if !a!==100 (
                    echo %%a^|%%b
                    echo ---
                    echo %%c^|%%d
                )
            )
        )
    )
)

3

CJam, 40 bytes

A4m*{[KBBY].*:+56=},{:)2/'|f*"
---
"*N}/

A abordagem para encontrar as combinações é diferente da @ Optimizer, mas o código para imprimi-las é idêntico.

Experimente on-line no intérprete CJam .

Como funciona

A4m*     e# Push all vectors of length 4 with coordinates in [0 ... 9].
         e# We'd normally use [0 ... 8] here, but "9 4m*" is 1 byte longer and
         e# "A4m*" doesn't produce any false positives.

{        e# Filter the vectors:
[KBBY].* e#   Multiply the elements of the vector by 20, 11, 11 and 2.
:+       e#   Add all four products.
56=      e#   Check if the sum is 56. 56 is used instead of 100 since all elements
         e#   of the vector will be incremented and 56 + 20 + 11 + 11 + 2 == 100.
},       e# Keep only vectors for which = pushed a truthy value.

{        e# For each vector:
:)       e#   Increment each coordinate.
2/       e#   Split into pair.
'|f*     e#   Join each pair, delimiting by '|'.
"
---
"*       e#   Join the two pairs, delimiting by "\n---\n".
N        e#   Push "\n".
}/       e#

Desde que eu sei muito pouco além de Java, eu adoraria uma explicação de como isso funciona, se você estiver disposto ..?
Denham Coote

Esse é um bom truque.
Optimizer

Uau. Eu tenho muito a aprender. Obrigado pela explicação :)
Denham Coote

3

Haskell, 107 131 bytes

s=show
r=[1..9]
v=putStr$unlines[s a++"|"++s b++"\n---\n"++s c++"|"++s d++"\n"|a<-r,b<-r,c<-r,d<-r,(2*a+b+c)*10+b+2*d+c==100]

A segunda versão do meu primeiro programa Haskell de todos os tempos!

Desta vez, com exibição conforme os requisitos, descaradamente roubada e adaptada dos nimi (bem, eu fiz algumas pesquisas, mas parece que não existem maneiras eficazes de exibir caracteres em Haskell, de modo que é difícil evitar o putStr $).

E ... além da fatoração da fórmula no final, ainda é legível =)


3

Haskell, 125 121 bytes

s=show
f=putStr$unlines[s a++'|':s b++"\n---\n"++s c++'|':s d|[a,b,c,d]<-mapM id$"abcd">>[[1..9]],20*a+11*(b+c)+2*d==100]

Uso:

*Main> f
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9

>>in "abcd">>[[1..9]]faz uma lista com 4 (comprimento do 1º parâmetro) cópias do segundo elemento, ie [[1..9],[1..9],[1..9],[1..9]]. mapM idfaz uma lista de todas as suas combinações, ou seja, [0,0,0,0]para [9,9,9,9]. Mantenha aqueles que resumem100 e construa uma string com a caixa dela. Imprima todas as caixas.

Obrigado @Mauris por 1 byte e me fazendo revisar meu post para encontrar mais 3.


mapM ideconomiza um byte vs sequence.
Lynn

2

Python 2, 145 129 bytes

Atualmente, estou brincando com alguns métodos diferentes de cálculo que devem ser mais curtos do que o descrito, mas publicarei o que tenho agora.

i=int
for k in range(1000,9999):
 a,b,c,d=`k`
 if i(a+b)+i(c+d)+i(a+c)+i(b+d)==100and not'0'in`k`:print a+'|'+b+'\n---\n'+c+'|'+d

2

CJam, 43 42 bytes

A,1>4m*{2/_z+Afb:+100=},{2/'|f*"
---
"*N}/

Explicação a seguir .. hoje EOD

Experimente online aqui


Minha versão java golfe (que não se incomoda com caixas, lista apenas as seqüências) tinha 197 caracteres. Isso faz tudo em um quarto do comprimento! Cool :)
Denham Coote

@ DenhamCoote Essa é toda resposta CJam, Pyth e GolfScript.
fase

Ainda olhando para a frente a essa explicação ;-)
Denham Coote

1

Python 3, 159

Rapido e sujo.

N='123456789'
D='%s|%s\n'
O=D+'---\n'+D
I=int
[print(O%(a,b,c,d)if I(a+b)+I(c+d)+I(a+c)+I(b+d)==100 else'',end='')for a in N for b in N for c in N for d in N]

1

R, 165 bytes

e=expand.grid(d<-1:9,d,d,d)
a=apply
o=a(e[a(e,1,function(x)20*x[1]+11*(x[2]+x[3])+2*x[4]==100),],1,function(x)cat(x[1],"|",x[2],"\n---\n",x[3],"|",x[4],"\n",sep=""))

Isso teria sido significativamente menor se eu tivesse escolhido codificar a saída de alguma maneira. Como algumas outras soluções, isso tira proveito da identidade 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Ungolfed + explicação:

# Create a matrix where each row is a combination of the digits 1-9
e <- expand.grid(1:9, 1:9, 1:9, 1:9)

# Filter the rows of the matrix using the aforementioned identity
e <- e[apply(e, 1, function(x) 20*x[1] + 11*(x[2]+x[3]) + 2*x[4] == 100), ]

# Print each row formatted into boxes
o <- apply(e, 1, function(x) cat(x[1], "|", x[2], "\n---\n", x[3], "|", x[4], sep = ""))

Você pode estar se perguntando por que a última declaração é uma tarefa. Como se vê, a catfunção, que concatena e imprime, retorna um valor de NULL. Quando você chama catde dentro de uma função como apply, a saída será seguida por NULL, o que é indesejável. Há duas maneiras de contornar isso: atribuí-lo a uma variável ou envolvê-lo invisible. Aqui optei pelo primeiro, já que é significativamente mais curto.

Você pode experimentá-lo online .


1

Java, 450

Minha primeira tentativa (não destruída) foi assim:

classe B {
  public static void main (String [] a) {
    for (int i = 1; i <10; i ++)
      for (int j = 1; j <10; j ++)
        para (int k = 1; k <10; k ++)
          para (int l = 1; l <10; l ++)
            if (Integer.parseInt (i + "" + j) + Integer.parseInt (k + "" + l) + Integer.parseInt (i + "" + k) + Integer.parseInt (j + "" + l) == 100) {
              System.out.println (i + "|" + j);
              System.out.println ("---");
              System.out.println (k + "|" + l + "\ n");
            }
  }
}


3
Dica: 20*a + 11*(b + c) + 2*d == 100.
orlp

Sim, essa solução foi concatenação puramente de cordas - uma primeira tentativa muito humilde.
Denham Coote

1
Eu conto apenas 436 bytes , não 450. Além disso, o espaço em branco não é necessário, o que economizaria uma quantidade considerável.
Alex A.

Além disso, a remoção de espaços em branco desnecessários, este deve estar mais perto de 340 bytes :)
Kade

1

PowerShell, 98

fórmula de steveverrill adaptada

:\>cat printbox.ps1

1..9|%{for($j=1;$j-lt10;$j++){if(($k=(8-$j-2*$_))-gt0){"{0}|{1}`n---`n{2}|{3}"-f$_,$j,$k,
($_+6)}}}

:\>powershell -f printbox.ps1
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9
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.