Disegna le combinazioni che aggiungono fino a 100


13

Hai una casella con un numero a una cifra in ogni angolo:

1|2
---
3|4

Se concateniamo le cifre lungo le righe da sinistra a destra, otteniamo 12 e 34. Se concateniamo le cifre lungo le colonne dall'alto verso il basso, otteniamo 13 e 24. Se aggiungiamo tutti questi numeri, otteniamo 12 + 34 + 13 + 24 = 83.

Sfida

Scrivi un programma per stampare tutte queste caselle in cui la somma calcolata come sopra è uguale a 100.

Supponendo che ogni angolo contenga un numero di una sola cifra compreso tra 1 e 9, ci sono 9 combinazioni: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 e 3119. (Nota che ci sono 25 combinazioni se includiamo 0, ma non siamo per questa sfida.)

Si noti che l'esempio 1234 non funziona poiché 12 + 34 + 13 + 24 non è uguale a 100.

Ingresso

Nessuna

Produzione

Caselle di risposta nel seguente formato:

A|B
---
C|D

L'output deve essere stampato su STDOUT o sull'alternativa più vicina.

Regole

  • AB + CD + AC + BD = 100
  • Ogni angolo conterrà solo i numeri interi positivi 1-9.
  • 0 è escluso.
  • I numeri possono essere usati più di una volta.
  • Devi disegnare le scatole, come sopra. ( A|B\n---\nC|D\n)
  • Devi fornire tutte le risposte valide.
  • Una nuova riga finale aggiuntiva va bene.
  • , vince il codice più breve in byte.
  • Si applicano scappatoie standard e T&C.

Questa è la mia prima presentazione, quindi per favore fatemi sapere se devo chiarire qualcosa.


Potresti mostrare quale dovrebbe essere l'output? Inoltre, che dire di un personaggio newline finale?
Spikatrix,

Bella sfida. Penso che tu debba dire esplicitamente quali numeri devono essere aggiunti. La riga "I due numeri concatenati a due cifre su PLUS i due numeri a due cifre verso il basso devono essere uguali a 100". non è abbastanza chiaro. Ho solo capito usando l'esempio del 1234. Inoltre, sto ottenendo solo 9 di queste combinazioni. Puoi per favore menzionare le 16 combinazioni?
Ottimizzatore

1
Ho apportato alcune modifiche alla spiegazione e alla formattazione. Se non corrisponde al tuo intento originale, ripristina la modifica.
Alex A.

1
@DenhamCoote in realtà, la mia soluzione semi-hardcoded era abbastanza interessante da fare, perché è solo semi-hardcoded. Questa è stata un'eccezione alla regola, perché le domande in cui il palese hardcoding è l'opzione migliore / più ovvia spesso non producono risposte interessanti (vedi la domanda recente sugli anelli di borromeo per esempio). Grazie per la domanda.
Level River St

1
Accettare una risposta può dare l'impressione che la domanda sia terminata, quindi la lascio ancora un po '. Se in seguito ricevi più risposte, puoi modificare l'accettazione, ma ciò significa che devi tenere d'occhio, cosa che potresti non avere il tempo di fare. Ai contesti di popolarità non piace perché sono spesso scritti pigramente e eccessivamente ampi, spesso del tipo "Do X nel modo più complesso possibile". Generalmente le uniche buone domande sulla popolarità riguardano l'elaborazione delle immagini, in cui la valutazione umana è l'unico modo per decidere se l'algoritmo è valido o meno. L'elaborazione delle immagini esclude l'arte pura che è fuori tema.
Level River St

Risposte:


8

Pyth, 42 38 34 byte

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

La nuova riga finale nel codice è importante. Il motivo principale per cui sono competitivo è perché utilizzo il prodotto dot vector di [1, 1, 5, 7]e [20, 11, 11, 2]lo confronto con 100.


"|"-> \|, \n-> (letterale avanzamento riga) e non è necessario il preventivo finale.
Dennis,

@Dennis dormiva>. <
orlp

2
Se non ti dispiace, potresti per favore aggiungere una spiegazione per quelli (come me) che non riescono a decifrare la tua risposta incredibilmente breve?
Denham Coote,

6

Ruby, 71

Poiché l'hardcoding non è vietato (e in ogni caso è difficile tracciare una linea) ecco una risposta parziale hardcoded.

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

Spiegazione

La formula per una soluzione è la seguente:

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

Da argomenti aritmetici modulari, vediamo che A e D devono differire di una quantità costante, tale che (A*20+D*2)%11è costante. In effetti D = A + 6. Il iciclo scorre attraverso i tre possibili valori di A.

Il valore di B può essere compreso tra 1 7-i*2e il totale di B e C deve essere 14-A-D. Quindi otteniamo le seguenti espressioni, che sono stampate. Ruby consente letteralmente newline nelle stringhe racchiuse in''

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

4

Java, 202 200 198

Prova per la prima volta: D

EDIT: salvato 2 byte con un calcolo leggermente più piccolo trovato in un altro commento.

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

Lotto - 187 byte

Forza 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

Non golfato è leggermente meno disgustoso:

@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 byte

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

L'approccio per trovare le combinazioni è diverso da quello di @ Optimizer, ma il codice per stamparle è identico.

Provalo online nell'interprete CJam .

Come funziona

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#

Dal momento che so molto poco a parte qualche Java, mi piacerebbe una spiegazione di come funziona, se vuoi ...?
Denham Coote,

È un bel trucco.
Ottimizzatore,

Wow. Ho molto da imparare. Grazie per la spiegazione :)
Denham Coote,

3

Haskell, 107 131 byte

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 seconda versione del mio primo programma Haskell di sempre!

Questa volta con display secondo i requisiti, rubato senza vergogna adattato da Nimi (beh, ho fatto qualche ricerca, ma sembra che non ci siano modi così efficienti per mostrare i personaggi in Haskell, così che putStr $ unlines è difficile da evitare).

E ... a parte la fattorizzazione della formula alla fine, è ancora leggibile =)


3

Haskell, 125 121 byte

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]]crea un elenco con 4 copie (lunghezza del 1o parametro) del secondo elemento, ad es [[1..9],[1..9],[1..9],[1..9]]. mapM idcrea un elenco di tutte le combinazioni degli stessi, ovvero [0,0,0,0]a [9,9,9,9]. Conserva quelli che riassumono 100e costruisci una stringa con la relativa scatola. Stampa tutte le scatole.

Grazie @Mauris per 1 byte e facendomi rivedere il mio post per trovarne altri 3.


mapM idrisparmiare un contro di byte sequence.
Lynn,

2

Python 2, 145 129 byte

Attualmente sto giocando con alcuni diversi metodi di calcolo che dovrebbero essere più brevi di quanto indicato, ma posterò quello che ho ora.

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 byte

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

Spiegazione da seguire .. da oggi EOD

Provalo online qui


La mia versione java golf (che non dà fastidio alle scatole, elenca solo le sequenze) era di 197 caratteri. Questo fa tutto in un quarto della lunghezza! Cool :)
Denham Coote,

@DenhamCoote Ecco tutte le risposte di CJam, Pyth e GolfScript.
fase

Non vedo l'ora che arrivi questa spiegazione ;-)
Denham Coote,

1

Python 3, 159

Veloce e sporco.

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 byte

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

Ciò sarebbe stato significativamente più breve se avessi scelto di codificare l'output in qualche modo. Come alcune altre soluzioni, questo sfrutta l'identità 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Ungolfed + spiegazione:

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

Ti starai chiedendo perché l'ultima affermazione è un compito. A quanto pare, la catfunzione, che concatena e stampa, restituisce un valore di NULL. Quando si chiama catda una funzione simile apply, l'output sarà seguito da NULL, il che è indesiderabile. Ci sono due modi per aggirare questo: assegnarlo a una variabile o racchiuderloinvisible . Qui ho optato per il primo poiché è significativamente più breve.

Puoi provarlo online .


1

Java, 450

Il mio primo tentativo (ungolfed) sembrava così:

classe B {
  public static void main (String [] a) {
    per (int i = 1; i <10; i ++)
      per (int j = 1; j <10; j ++)
        per (int k = 1; k <10; k ++)
          per (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
Suggerimento: 20*a + 11*(b + c) + 2*d == 100.
orlp,

Sì, questa soluzione era una concatenazione di stringhe: un primo tentativo molto umile.
Denham Coote,

1
Conto solo 436 byte , non 450. Inoltre, lo spazio bianco non è necessario, il che ti farebbe risparmiare una quantità considerevole.
Alex A.

Inoltre, rimuovendo gli spazi bianchi non necessari, questo dovrebbe essere più vicino a 340 byte :)
Kade,

1

PowerShell, 98

adattata la formula di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.