Zeichnen Sie die Kombinationen, die 100 ergeben

13

Sie haben eine Box mit einer einstelligen Nummer in jeder Ecke:

1|2
---
3|4

Wenn wir die Ziffern entlang der Zeilen von links nach rechts verketten, erhalten wir 12 und 34. Wenn wir die Ziffern entlang der Spalten von oben nach unten verketten, erhalten wir 13 und 24. Wenn wir alle diese Zahlen addieren, erhalten wir 12 + 34 + 13 + 24 = 83.

Herausforderung

Schreiben Sie ein Programm, um alle diese Felder zu drucken, wobei die wie oben berechnete Summe gleich 100 ist.

Angenommen, jede Ecke enthält eine einstellige Zahl zwischen 1 und 9, dann gibt es 9 Kombinationen: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 und 3119. (Beachten Sie, dass es 25 Kombinationen gibt, wenn wir 0 einschließen, aber Wir sind nicht für diese Herausforderung.)

Beachten Sie, dass das Beispiel 1234 nicht funktioniert, da 12 + 34 + 13 + 24 nicht gleich 100 ist.

Eingang

Keiner

Ausgabe

Antwortfelder im folgenden Format:

A|B
---
C|D

Die Ausgabe sollte auf STDOUT oder die nächstgelegene Alternative gedruckt werden.

Regeln

  • AB + CD + AC + BD = 100
  • Jede Ecke enthält nur die positiven ganzen Zahlen von 1 bis 9.
  • 0 ist ausgeschlossen.
  • Zahlen können mehrmals verwendet werden.
  • Sie müssen die Kästchen wie oben zeichnen. ( A|B\n---\nC|D\n)
  • Sie müssen alle gültigen Antworten ausgeben.
  • Ein zusätzlicher Zeilenumbruch ist in Ordnung.
  • , also gewinnt der kürzeste Code in Bytes.
  • Es gelten Standardlücken und AGB.

Dies ist meine erste Einreichung. Bitte lassen Sie mich wissen, wenn ich etwas klären muss.

Denham Coote
quelle
Könnten Sie zeigen, was die Ausgabe sein soll? Und was ist mit einem abschließenden Newline-Zeichen?
Spikatrix
Schöne Herausforderung. Ich denke, Sie müssen explizit angeben, welche Zahlen hinzugefügt werden müssen. Die Zeile "Die zwei, verketteten, zweistelligen Zahlen plus die zwei, zweistelligen Zahlen nach unten müssen gleich 100 sein." ist nicht klar genug. Ich habe es nur am Beispiel von 1234 herausgefunden. Außerdem bekomme ich nur 9 solcher Kombinationen. Können Sie bitte die 16 Kombinationen erwähnen?
Optimierer
1
Ich habe einige Änderungen an der Erklärung und der Formatierung vorgenommen. Wenn es nicht Ihrer ursprünglichen Absicht entspricht, setzen Sie die Bearbeitung zurück.
Alex A.
1
@DenhamCoote Eigentlich war meine semi-hardcodierte Lösung sehr interessant, weil sie nur semi-hardcodiert ist. Dies war eine Ausnahme von der Regel, da Fragen, bei denen offensichtliche Hardcodierung die beste / naheliegendste Option ist, häufig keine interessanten Antworten liefern (siehe aktuelle Frage zu Borromäischen Ringen zum Beispiel). Vielen Dank für die Frage.
Level River St
1
Das Akzeptieren einer Antwort kann den Eindruck erwecken, dass die Frage erledigt ist. Ich würde es also noch eine Weile belassen. Wenn Sie später weitere Antworten erhalten, können Sie die Akzeptanz ändern. Dies bedeutet jedoch, dass Sie Ausschau halten müssen, wofür Sie möglicherweise keine Zeit haben. Beliebtheitswettbewerbe werden nicht gemocht, weil sie oft träge geschrieben und übermäßig weit gefasst sind, oft vom Typ "Mach X auf die komplexeste Art und Weise, die möglich ist". Im Allgemeinen sind die einzigen Fragen zu guter Popularität in der Bildverarbeitung zu finden, bei der nur die Bewertung durch den Menschen entscheidet, ob der Algorithmus gut ist oder nicht. Die Bildverarbeitung schließt reine Kunst aus, die nicht zum Thema gehört.
Level River St

Antworten:

8

Pyth, 42 38 34 Bytes

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

Die nachfolgende Zeile im Code ist wichtig. Der Hauptgrund, warum ich wettbewerbsfähig bin, ist, dass ich das Vektorpunktprodukt von [1, 1, 5, 7]und verwende [20, 11, 11, 2]und es mit 100 vergleiche.

orlp
quelle
"|"-> \|, \n-> (wörtlicher Zeilenumbruch) und Sie brauchen das endgültige Zitat nicht.
Dennis
@ Tennis schlief>. <
Orlp
2
Wenn es Ihnen nichts ausmacht, können Sie bitte eine Erklärung für diejenigen (wie mich) hinzufügen, die Ihre unglaublich kurze Antwort nicht entschlüsseln können?
Denham Coote
6

Ruby, 71

Da die Hardcodierung nicht unzulässig ist (und es auf jeden Fall schwierig ist, eine Linie zu ziehen), ist hier eine teilweise hardcodierte Antwort.

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

Erläuterung

Die Formel für eine Lösung lautet wie folgt:

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

Durch modulare arithmetische Argumente sehen wir, dass A und D sich um einen konstanten Betrag unterscheiden müssen, der (A*20+D*2)%11konstant ist. Tatsächlich ist D = A + 6. Dasi Schleife durchläuft die drei möglichen Werte von A.

Der Wert von B kann irgendetwas von 1 bis sein 7-i*2und die Summe von B und C muss sein 14-A-D. So erhalten wir die folgenden Ausdrücke, die gedruckt werden. Ruby erlaubt wörtliche Zeilenumbrüche in Strings, die in eingeschlossen sind''

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

Java, 202 200 198

Zum ersten Mal versuchen: D

BEARBEITEN: 2 Bytes mit etwas kleinerer Berechnung in einem anderen Kommentar gespeichert.

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
quelle
4

Batch - 187 Bytes

Rohe Gewalt.

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

Ohne Golf ist es etwas weniger ekelhaft:

@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
                )
            )
        )
    )
)
unclemeat
quelle
3

CJam, 40 Bytes

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

Die Vorgehensweise zum Finden der Kombinationen unterscheidet sich von der von @ Optimizer, der Code zum Drucken ist jedoch identisch.

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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
quelle
Da ich abgesehen von Java nur sehr wenig weiß, würde ich gerne eine Erklärung darüber erhalten, wie dies funktioniert, wenn Sie dazu bereit sind.
Denham Coote
Das ist ein schöner Trick.
Optimierer
Beeindruckend. Ich habe viel zu lernen. Vielen Dank für die Erklärung :)
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]

Die zweite Version meines ersten Haskell-Programms!

Diesmal mit Display nach Vorgabe, schamlos gestohlen angepasst an Nimis.

Und ... abgesehen von der Faktorisierung der Formel am Ende ist sie noch lesbar =)

Dungeoncrawler
quelle
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]

Verwendung:

*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 erstellt "abcd">>[[1..9]]eine Liste mit 4 (Länge des 1. Parameters) Kopien des zweiten Elements, dh [[1..9],[1..9],[1..9],[1..9]]. mapM iderstellt eine Liste aller Kombinationen davon, dh [0,0,0,0]bis [9,9,9,9]. Behalten Sie die, die zusammenfassen, 100und bauen Sie eine Zeichenfolge mit der Box davon. Drucken Sie alle Felder.

Vielen Dank an @ Mauris für 1 Byte und ich muss meinen Beitrag überprüfen, um weitere 3 zu finden.

nimi
quelle
mapM idspart ein Byte gegen sequence.
Lynn
2

Python 2, 145 129 Bytes

Momentan spiele ich mit ein paar verschiedenen Berechnungsmethoden, die kürzer sein sollten als die angegebenen, aber ich werde veröffentlichen, was ich jetzt habe.

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
quelle
2

CJam, 43 42 Bytes

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

Erklärung folgt .. bis heute EOD

Probieren Sie es hier online aus

Optimierer
quelle
Meine Golf-Java-Version (die sich nicht um Kisten kümmert, sondern nur die Sequenzen auflistet) hatte 197 Zeichen. Das macht alles in einem Viertel der Länge! Cool :)
Denham Coote
@DenhamCoote Das ist jede CJam-, Pyth- und GolfScript-Antwort.
Phase
Freue mich immer noch auf diese Erklärung ;-)
Denham Coote
1

Python 3, 159

Schnell und dreckig.

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

Dies wäre bedeutend kürzer gewesen, wenn ich mich dafür entschieden hätte, die Ausgabe auf irgendeine Weise hart zu codieren. Wie bei einigen anderen Lösungen wird die Identität 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100 verwendet.

Ungolfed + Erklärung:

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

Sie fragen sich vielleicht, warum die letzte Anweisung eine Aufgabe ist. Wie sich herausstellt, gibt die catFunktion, die verkettet und druckt, einen Wert von zurück NULL. Wenn Sie catinnerhalb einer Funktion wie aufrufen apply, folgt der Ausgabe NULL, was unerwünscht ist. Es gibt zwei Möglichkeiten, dies zu umgehen: Zuweisen zu einer Variablen oder Einschließen invisible. Hier habe ich mich für das erstere entschieden, da es deutlich kürzer ist.

Sie können es online ausprobieren .

Alex A.
quelle
1

Java, 450

Mein erster (ungolfed) Versuch sah so aus:

Klasse b{
  public static void main (String [] a) {
    für (int i = 1; i <10; i ++)
      für (int j = 1; j <10; j ++)
        für (int k = 1; k <10; k ++)
          für (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
quelle
3
Hinweis: 20*a + 11*(b + c) + 2*d == 100.
Orlp
Ja, diese Lösung war reine String-Verkettung - ein sehr bescheidener erster Versuch.
Denham Coote
1
Ich zähle nur 436 Bytes , nicht 450. Außerdem ist das Leerzeichen nicht erforderlich, wodurch Sie eine beträchtliche Menge sparen würden.
Alex A.
Wenn Sie unnötige Leerzeichen entfernen, sollte dies näher an 340 Bytes liegen :)
Kade
1

PowerShell, 98

Die Formel von Steveverrill wurde angepasst

:\>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
quelle