Dessinez les combinaisons qui totalisent jusqu'à 100

13

Vous avez une case avec un seul chiffre dans chaque coin:

1|2
---
3|4

Si nous concaténons les chiffres le long des lignes de gauche à droite, nous obtenons 12 et 34. Si nous concaténons les chiffres le long des colonnes de haut en bas, nous obtenons 13 et 24. Si nous additionnons tous ces nombres, nous obtenons 12 + 34 + 13 + 24 = 83.

Défi

Écrivez un programme pour imprimer toutes ces cases où la somme calculée comme ci-dessus est égale à 100.

En supposant que chaque coin contient un numéro à un chiffre compris entre 1 et 9, il existe 9 combinaisons: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 et 3119. (Notez qu'il y a 25 combinaisons si nous incluons 0, mais nous ne sommes pas pour ce défi.)

Notez que l'exemple 1234 ne fonctionne pas car 12 + 34 + 13 + 24 n'est pas égal à 100.

Contribution

Aucun

Production

Boîtes de réponse au format suivant:

A|B
---
C|D

La sortie doit être imprimée sur STDOUT ou l'alternative la plus proche.

Règles

  • AB + CD + AC + BD = 100
  • Chaque coin contiendra uniquement les entiers positifs 1-9.
  • 0 est exclu.
  • Les numéros peuvent être utilisés plusieurs fois.
  • Vous devez dessiner les cases, comme ci-dessus. ( A|B\n---\nC|D\n)
  • Vous devez générer toutes les réponses valides.
  • Une nouvelle ligne de fin supplémentaire est très bien.
  • , donc le code le plus court en octets gagne.
  • Les échappatoires standard et les conditions générales s'appliquent.

Ceci est ma première soumission, veuillez donc me faire savoir si j'ai besoin de clarifier quoi que ce soit.

Denham Coote
la source
Pourriez-vous montrer ce que la sortie est censée être? Et qu'en est-il d'un caractère de fin de ligne?
Spikatrix
Beau défi. Je pense que vous devez dire explicitement quels chiffres doivent être ajoutés. La ligne "Les deux nombres concaténés à deux chiffres sur PLUS les deux nombres à deux chiffres vers le bas doivent être égaux à 100." n'est pas assez clair. J'ai seulement compris en utilisant l'exemple de 1234. En outre, je ne reçois que 9 combinaisons de ce type. Pouvez-vous mentionner les 16 combinaisons?
Optimizer
1
J'ai apporté quelques modifications à l'explication et au formatage. Si cela ne correspond pas à votre intention d'origine, veuillez annuler la modification.
Alex A.
1
@DenhamCoote en fait, ma solution semi-codée était assez intéressante à faire, car elle n'est que semi-codée. Cela a été une exception à la règle, car les questions où le codage en dur flagrant est l'option la meilleure / la plus évidente ne produisent souvent pas de réponses intéressantes (voir la question récente des anneaux emprunteurs par exemple.) Merci pour la question.
Level River St
1
Accepter une réponse peut donner l'impression que la question est terminée, alors je la laisserai encore un peu. Si vous obtenez plus de réponses par la suite, vous pouvez modifier l'acceptation, mais cela signifie que vous devez surveiller, ce que vous n'aurez peut-être pas le temps de faire. Les concours de popularité ne sont pas appréciés parce qu'ils sont souvent paresseusement écrits et trop larges, souvent du type "Do X de la manière la plus complexe possible". Généralement, les seules bonnes questions de popularité sont dans le traitement d'image, où l'évaluation humaine est le seul moyen de décider si l'algorithme est bon ou non. Le traitement d'image exclut l'art pur qui est hors sujet.
Level River St

Réponses:

8

Pyth, 42 38 34 octets

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

La nouvelle ligne de fin dans le code est importante. La principale raison pour laquelle je suis compétitif est parce que j'utilise le produit scalaire vectoriel [1, 1, 5, 7]et [20, 11, 11, 2]et le comparer à 100.

orlp
la source
"|"-> \|, \n-> (saut de ligne littéral) et vous n'avez pas besoin du devis final.
Dennis
@Dennis dormait>. <
orlp
2
Si cela ne vous dérange pas, pourriez-vous s'il vous plaît ajouter une explication pour ceux (comme moi) qui ne peuvent pas déchiffrer votre réponse incroyablement courte?
Denham Coote
6

Rubis, 71

Comme le codage en dur n'est pas interdit (et en tout cas il est difficile de tracer une ligne), voici une réponse codée en dur partielle.

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

Explication

La formule d'une solution est la suivante:

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

Par des arguments arithmétiques modulaires, nous voyons que A et D doivent différer d'une quantité constante, telle que (A*20+D*2)%11constante. En fait D = A + 6. La iboucle parcourt les trois valeurs possibles de A.

La valeur de B peut être comprise entre 1 7-i*2et le total de B et C doit être 14-A-D. Nous obtenons ainsi les expressions suivantes, qui sont imprimées. Ruby permet des sauts de ligne littéraux dans les chaînes incluses dans''

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

Java, 202 200 198

Essayer pour la première fois: D

EDIT: enregistré 2 octets avec un calcul légèrement plus petit trouvé dans un autre commentaire.

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
la source
4

Lot - 187 octets

Force brute.

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

Sans golf, c'est un peu moins dégoûtant:

@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
                )
            )
        )
    )
)
dégrader
la source
3

CJam, 40 octets

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

L'approche pour trouver les combinaisons est différente de celle de @ Optimizer, mais le code pour les imprimer est identique.

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

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
la source
Étant donné que je connais très peu en dehors de Java, j'aimerais une explication de la façon dont cela fonctionne, si vous le souhaitez ..?
Denham Coote
C'est une bonne astuce.
Optimizer
Sensationnel. J'ai beaucoup à apprendre. Merci pour l'explication :)
Denham Coote
3

Haskell, 107 131 octets

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 deuxième version de mon premier programme Haskell!

Cette fois avec affichage selon les exigences, sans vergogne volé adapté de nimi's (eh bien j'ai fait des recherches mais il semble qu'il n'y ait pas de moyens efficaces d'afficher les caractères dans Haskell pour que putStr $ unlines soit difficile à éviter).

Et ... à part la factorisation de la formule à la fin, c'est toujours lisible =)

donjon
la source
3

Haskell, 125 121 octets

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]

Usage:

*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]]fait une liste avec 4 (longueur du 1er paramètre) copies du deuxième élément, ie [[1..9],[1..9],[1..9],[1..9]]. mapM idfait une liste de toutes les combinaisons de ceux - ci, soit [0,0,0,0]à [9,9,9,9]. Gardez ceux qui résument 100et construisez une chaîne avec la boîte de celui-ci. Imprimez toutes les cases.

Merci @Mauris pour 1 octet et en me faisant revoir mon post pour en trouver 3 de plus.

nimi
la source
mapM idenregistre un octet contre sequence.
Lynn
2

Python 2, 145 129 Octets

Je suis en train de jouer avec quelques méthodes de calcul différentes qui devraient être plus courtes que ce qui est décrit, mais je publierai ce que j'ai maintenant.

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
la source
2

CJam, 43 42 octets

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

Explication à suivre .. d'ici aujourd'hui EOD

Essayez-le en ligne ici

Optimiseur
la source
Ma version Java golfée (qui ne dérange pas avec les boîtes, elle ne liste que les séquences) était de 197 caractères. Cela fait tout dans un quart de la longueur! Cool :)
Denham Coote
@DenhamCoote C'est chaque réponse CJam, Pyth et GolfScript.
phase
Toujours dans l'attente de cette explication ;-)
Denham Coote
1

Python 3, 159

Rapide et sale.

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
la source
1

R, 165 octets

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

Cela aurait été beaucoup plus court si j'avais choisi de coder en dur la sortie d'une manière ou d'une autre. Comme quelques autres solutions, cela profite de l'identité 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Non golfé + explication:

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

Vous vous demandez peut-être pourquoi la dernière déclaration est une affectation. Il s'avère que la catfonction, qui concatène et imprime, renvoie une valeur de NULL. Lorsque vous appelez à catpartir d'une fonction comme apply, la sortie sera suivie de NULL, ce qui n'est pas souhaitable. Il y a deux façons de contourner cela: l'affecter à une variable ou l'envelopper invisible. Ici, j'ai opté pour le premier car il est nettement plus court.

Vous pouvez l' essayer en ligne .

Alex A.
la source
1

Java, 450

Ma première tentative (non golfée) ressemblait à ceci:

classe B {
  public static void main (String [] a) {
    pour (int i = 1; i <10; i ++)
      pour (int j = 1; j <10; j ++)
        pour (int k = 1; k <10; k ++)
          pour (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
la source
3
Conseil: 20*a + 11*(b + c) + 2*d == 100.
orlp
Oui, cette solution était purement une concaténation de chaînes - une première tentative très humble.
Denham Coote
1
Je ne compte que 436 octets , pas 450. De plus, l'espace blanc n'est pas nécessaire, ce qui vous ferait économiser beaucoup.
Alex A.
De plus, en supprimant les espaces inutiles, cela devrait être plus proche de 340 octets :)
Kade
1

PowerShell, 98

formule adaptée 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
la source