Dibuja las combinaciones que suman 100

13

Tiene un cuadro con un número de un solo dígito en cada esquina:

1|2
---
3|4

Si concatenamos los dígitos a lo largo de las filas de izquierda a derecha, obtenemos 12 y 34. Si concatenamos los dígitos a lo largo de las columnas de arriba a abajo, obtenemos 13 y 24. Si sumamos todos estos números, obtenemos 12 + 34 + 13 + 24 = 83.

Desafío

Escriba un programa para imprimir todos esos cuadros donde la suma calculada como arriba es igual a 100.

Suponiendo que cada esquina contiene un número de un solo dígito entre 1 y 9, hay 9 combinaciones: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 y 3119. (Tenga en cuenta que hay 25 combinaciones si incluimos 0, pero no estamos para este desafío)

Tenga en cuenta que el ejemplo 1234 no funciona ya que 12 + 34 + 13 + 24 no es igual a 100.

Entrada

Ninguna

Salida

Contestar cuadros en el siguiente formato:

A|B
---
C|D

La salida debe imprimirse en STDOUT o en la alternativa más cercana.

Reglas

  • AB + CD + AC + BD = 100
  • Cada esquina contendrá los enteros positivos 1-9 solamente.
  • 0 está excluido.
  • Los números se pueden usar más de una vez.
  • Necesitas dibujar los cuadros, como arriba. ( A|B\n---\nC|D\n)
  • Necesita dar salida a todas las respuestas válidas.
  • Una nueva línea adicional está bien.
  • , por lo que gana el código más corto en bytes.
  • Se aplican las lagunas estándar y los términos y condiciones.

Esta es mi primera presentación, así que avíseme si necesito aclarar algo.

Denham Coote
fuente
¿Podrías mostrar cuál es la salida? Además, ¿qué pasa con un personaje final de línea nueva?
Spikatrix
Buen desafío Creo que necesita decir explícitamente qué números deben agregarse. La línea "Los dos números de dos dígitos concatenados a través de MÁS los dos números de dos dígitos hacia abajo tienen que ser iguales a 100". No está lo suficientemente claro. Solo descubrí el ejemplo de 1234. Además, solo obtengo 9 de esas combinaciones. ¿Puedes por favor mencionar las 16 combinaciones?
Optimizador
1
Hice algunas ediciones a la explicación y el formato. Si no coincide con su intención original, revierta la edición.
Alex A.
1
@DenhamCoote en realidad, mi solución semi-codificada fue bastante interesante, porque solo está semicodificada. Esto ha sido una excepción a la regla, porque las preguntas en las que la codificación descarada es la mejor opción / la más obvia a menudo no producen respuestas interesantes (vea la pregunta reciente de anillos de borromeo, por ejemplo). Gracias por la pregunta.
Level River St
1
Aceptar una respuesta puede dar la impresión de que la pregunta está terminada, así que la dejaré un tiempo todavía. Si obtiene más respuestas después, puede cambiar la aceptación, pero eso significa que debe estar atento, lo que puede que no tenga tiempo para hacer. A los concursos de popularidad no les gusta porque a menudo se escriben perezosamente y son demasiado amplios, a menudo del tipo "Do X de la manera más compleja posible". En general, las únicas preguntas de buena popularidad están en el procesamiento de imágenes, donde la evaluación humana es la única forma de decidir si el algoritmo es bueno o no. El procesamiento de imágenes excluye el arte puro que está fuera de tema.
Level River St

Respuestas:

8

Pyth, 42 38 34 bytes

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

La nueva línea final en el código es importante. La razón principal Soy competitivo es porque uso el producto escalar de vectores de [1, 1, 5, 7]y [20, 11, 11, 2]y compararlo con 100.

orlp
fuente
"|"-> \|, \n-> (salto de línea literal) y no necesita la cita final.
Dennis
@Dennis estaba durmiendo>. <
orlp
2
Si no le importa, ¿podría agregar una explicación para aquellos (como yo) que no pueden descifrar su respuesta increíblemente corta?
Denham Coote
6

Rubí, 71

Como la codificación no está prohibida (y en cualquier caso es difícil trazar una línea) aquí hay una respuesta codificada parcial.

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

Explicación

La fórmula para una solución es la siguiente:

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

Mediante argumentos aritméticos modulares, vemos que A y D deben diferir en una cantidad constante, de modo que (A*20+D*2)%11sea ​​constante. De hecho D = A + 6. El iciclo itera a través de los tres valores posibles de A.

El valor de B puede ser de 1 a 1 7-i*2y el total de B y C debe ser 14-A-D. Así obtenemos las siguientes expresiones, que se imprimen. Ruby permite nuevas líneas literales en cadenas encerradas en''

   i     |    j
------------------
8-j-2*i  |   i+6
Level River St
fuente
4

Java, 202 200 198

Intentando por primera vez: D

EDITAR: guardado 2 bytes con un cálculo ligeramente más pequeño que se encuentra en otro comentario.

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);}}
Koekje
fuente
4

Lote - 187 bytes

Fuerza 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

Sin golf es un poco menos desagradable:

@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
                )
            )
        )
    )
)
carne sin carne
fuente
3

CJam, 40 bytes

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

El enfoque para encontrar las combinaciones es diferente al de @ Optimizer, pero el código para imprimirlas es idéntico.

Pruébelo en línea en el intérprete de CJam .

Cómo 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#
Dennis
fuente
Como sé muy poco aparte de algunos Java, me encantaría una explicación de cómo funciona, si está dispuesto ...
Denham Coote
Ese es un buen truco.
Optimizador
Guau. Tengo mucho que aprender. Gracias por la explicación :)
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]

¡La segunda versión de mi primer programa Haskell!

Esta vez con pantalla según los requisitos, robado descaradamente adaptado de nimi (bueno, investigué un poco, pero parece que no hay formas eficientes de mostrar personajes en Haskell para que putStr $ unlines sea difícil de evitar).

Y ... aparte de la factorización de la fórmula al final, todavía es legible =)

dungeoncrawler
fuente
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

>>en "abcd">>[[1..9]]hace una lista con 4 (longitud del primer parámetro) copias del segundo elemento, es decir [[1..9],[1..9],[1..9],[1..9]]. mapM idhace una lista de todas sus combinaciones, es decir, [0,0,0,0]a [9,9,9,9]. Mantenga los que resumen 100y construya una cadena con la caja. Imprime todas las cajas.

Gracias @Mauris por 1 byte y por hacerme revisar mi publicación para encontrar 3 más.

nimi
fuente
mapM idahorra un frente de bytes sequence.
Lynn
2

Python 2, 145 129 Bytes

Actualmente estoy jugando con algunos métodos diferentes de cálculo que deberían ser más cortos de lo que se describe, pero publicaré lo que tengo ahora.

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
Kade
fuente
2

CJam, 43 42 bytes

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

Explicación a seguir .. por hoy EOD

Pruébalo en línea aquí

Optimizador
fuente
Mi versión Java de golf (que no se molesta con las cajas, solo enumera las secuencias) fue de 197 caracteres. ¡Esto lo hace todo en un cuarto de la longitud! Genial :)
Denham Coote
@DenhamCoote Esa es cada respuesta de CJam, Pyth y GolfScript.
fase
Todavía estoy esperando esa explicación ;-)
Denham Coote
1

Pitón 3, 159

Rápido y sucio.

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]
Daniel Wakefield
fuente
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=""))

Esto habría sido significativamente más corto si hubiera elegido codificar la salida de alguna manera. Al igual que algunas otras soluciones, esto aprovecha la identidad 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Ungolfed + explicación:

# 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 = ""))

Quizás se pregunte por qué la última declaración es una tarea. Como resultado, la catfunción, que concatena e imprime, devuelve un valor de NULL. Cuando llama catdesde una función como apply, la salida será seguida por NULL, lo que no es deseable. Hay dos formas de evitar esto: asignarlo a una variable o envolverlo invisible. Aquí he optado por el primero ya que es significativamente más corto.

Puedes probarlo en línea .

Alex A.
fuente
1

Java, 450

Mi primer intento (no golfista) se veía así:

clase B{
  public static void main (Cadena [] a) {
    para (int i = 1; i <10; i ++)
      para (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");
            }
  }
}

Denham Coote
fuente
3
Sugerencia: 20*a + 11*(b + c) + 2*d == 100.
orlp
Sí, esta solución era puramente concatenación de cadenas, un primer intento muy humilde.
Denham Coote
1
Cuento solo 436 bytes , no 450. Además, el espacio en blanco no es necesario, lo que le ahorraría una cantidad considerable.
Alex A.
Además, eliminando espacios en blanco innecesarios, esto debería estar más cerca de 340 bytes :)
Kade
1

PowerShell, 98

fórmula adaptada de steveverrill

:\>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
blabb
fuente