Générez une grille de 7 x 7, remplie de nombres aléatoires. Cependant, dans les cellules avec un numéro de ligne et de colonne impair (à partir de 0), vous devez utiliser la somme des cellules environnantes. Voici un petit exemple avec une grille 3 x 3 (somme en carré en gras):
2 2 2
2 16 2
2 2 2
Et voici un exemple de grille 7 x 7:
6 5 4 3 7 2 5
6 43 3 50 8 43 8
4 7 8 8 9 3 1
4 36 1 43 6 40 5
3 3 6 1 4 7 5
4 35 3 45 9 42 1
2 6 8 6 8 5 3
Règles
Les nombres qui ne sont pas des sommes doivent toujours être compris entre 1 et 9 inclus.
La grille doit être générée aléatoirement. Pour chaque non-somme, chaque chiffre doit avoir une chance égale d'apparaître, quelle que soit la cellule dans laquelle il se trouve.
Les nombres doivent être alignés. Cela signifie que le premier ou le dernier chiffre de chaque numéro d'une colonne doit être aligné verticalement. (Vous pouvez supposer que les chiffres du milieu seront toujours à deux chiffres.)
Les cellules environnantes comprennent des diagonales. Par conséquent, chaque carré de somme aura huit chiffres qui l'entourent, que vous devez ajouter.
Le code le plus court gagne, car il s'agit du code-golf .
la source
Réponses:
APL,
53 49 43 42 40 3936J'ai réussi à répliquer les J
;.
dans APL, et j'ai utilisé l'approche de Gareth , économisant 13 caractères.Exemple d'exécution:
Explication:
∘.∨⍨9⍴0 1
génère un masque de bits.×∘?∘9¨
multiplie chaque bit par une valeur aléatoire de 1 à 9 inclus, générant une grille masquée de nombres aléatoires.3,⌿3,/
utilise ce qui ne peut être décrit que comme du piratage pour renvoyer toutes les cases se chevauchant 3 par 3 dans le tableau masqué. Ceux-ci sont également aplatis dans le processus.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
itère sur le tableau, en affectant chaque élément à⍵
. Pour chaque itération, il prend la cinquième (au milieu, en se souvenant que l'indexation APL est basée sur 1), et retourne son signe. Dans ce cas, cela équivaut à tester si le nombre est supérieur à 0. Si cela renvoie 1 (pour vrai), alors retournez cet élément. Sinon, renvoyez la somme des éléments dans la case 3 par 3 aplatie. Il utilise l':⋄
opérateur ternaire, qui est l'équivalent de?:
dans de nombreuses langues.la source
J,
63615955525149473937 caractèresMerci à Volatility pour sa sauvegarde de 10 personnages.
Explication (chaque étape aura des nombres aléatoires différents ...):
Générez le masque pour générer les nombres aléatoires (utilise
$
:Maintenant, nous avons un crochet . Il s'agit en fait d'un heureux accident lorsque je réduisais une version antérieure. Il devait être transposé
|:
et OU+.
avec l'original. Cela avait du sens puisque j'utilisais des uns et des zéros à l'époque, mais maintenant j'ai des neuf et des zéros. Il se trouve que cela fonctionne de la même manière avec la signification GCD de+.
. Heureusement pour moi. :-)Donc, maintenant que nous avons une grille de 9 et de 0, nous voulons générer des nombres aléatoires.
?
génère un nombre aléatoire de 0 à (mais sans inclure) un nombre donné. Étant donné une liste, il générera un nombre aléatoire de cette manière pour chaque membre de la liste. Ainsi, dans ce cas, il générera un nombre de 0 à 8 pour chaque 9 du tableau et un nombre à virgule flottante de 0 à 1 pour chaque 0.Mais nous voulons des nombres de 1 à 9 et non de 0 à 8. Nous ajoutons donc 1.
C'est très bien mais nous avons perdu les zéros que je veux, nous allons donc le multiplier par le masque d'origine après avoir transformé tous les neuf en un. Je le fais en vérifiant si la valeur est supérieure à 1. Cela nous donne:
(1&<*1+?)
.Il se passe deux ou trois choses ici:
&
) le 1 au<
verbe.Ainsi, tous combinés
(1&<*1+?)
génèrent des nombres aléatoires et mettent à zéro tous les nombres générés par des zéros dans la grille d'origine.Le bit suivant est le (à mon avis, de toute façon :-) peu intelligent.
Le
;.
verbe coupé a une formex u;._3 y
qui coupe l'entrée dans les cases décrites parx
, puis leur applique le verbeu
. Dans ce cas, nous avons3 3(4&{++/*0=4&{)@,;._3
.3 3
décrit les boîtes que nous voulons - 3x3.(4&{++/*0=4&{)@,
est un train de verbes qui décrit ce que nous voulons faire pour chaque boîte.Pour démontrer le
;.
verbe que j'utiliserai<
pour montrer chaque case:Quelques points à noter:
0
au centre de la boîte.Il ne nous reste plus qu'à passer la valeur au centre arrière (si elle n'est pas nulle) ou à additionner les nombres dans la case 3x3 (si le centre est zéro).
Pour ce faire, nous avons besoin d'un accès facile au numéro du centre.
,
aide ici. Il fait tourner la grille de 3x3 dans une liste de 9 articles avec le numéro du centre au numéro 4.4&{
utilisera{
pour tirer la valeur centrale, puis le comparer avec 0:0=4&{
. Cela renvoie un0
ou1
pour vrai ou faux, que nous multiplions ensuite par la somme+/
. Si elle était nulle au centre, nous avons maintenant notre somme comme requis. Si ce n'est pas le cas, nous avons zéro, donc pour terminer, nous ajoutons simplement la valeur centrale4&{+
.Cela donne le train de verbes
(4&{++/*0=4&{)@,
la source
?
. Je vais changer l'explication pour refléter la dernière version.Ruby (135 caractères)
Exemple de sortie
Panne
Ce n'est pas trop évident comment cela fonctionne, alors voici une ventilation rapide. REMARQUE: vous pouvez probablement ignorer certaines de ces étapes et passer à des versions plus courtes plus rapidement, mais je pense que c'est assez pédagogique pour voir différentes façons dont je rase les caractères, en particulier en repérant les modèles dans les littéraux pour transformer les nombres à 2 chiffres en versions à 1 chiffre .
Version naïve
Contrairement aux autres solutions Ruby qui reposent sur un tableau bidimensionnel, vous pouvez (éventuellement) obtenir une version plus courte en commençant par un tableau unidimensionnel et en travaillant avec des valeurs de décalage, car les motifs se répètent.
Le principe clé ici est que nous travaillons aux positions d'index 8, 10, 12, juste compensées par des multiples de 14. Les positions 8, 10 et 12 sont les centres des grilles 3x3 que nous résumons. Dans l'exemple de sortie, 34 est la position 8, 42 est la position 8 + 14 * 1, etc. Nous remplaçons la position 8 par 34 par des positions décalées de la position 8 par
[-8,-7,-6,-1,1,6,7,8]
- en d'autres termes34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])
. Ce même principe vaut pour toutes les valeurs de[8 + 14*i, 10 + 14*i, 12 + 14*i]
, puisque le motif se répète.L'optimiser
Tout d'abord, quelques optimisations rapides:
3.times { ... }
, et calculant àj + 14*i
chaque fois, "aligner" les positions[8,10,12,22,24,26,36,38,40]
.offsets
tableau est utilisé une fois, alors remplacez la variable par le littéral.do ... end
par{...}
et basculez l'impression vers$> << foo
. (Il y a un truc ici impliquantputs nil
et() == nil
.)Le code suivant est de 177 caractères:
Pour la prochaine réduction, notez que le
inject
tableau de décalages n'a pas besoin d'être en ordre. Nous pouvons avoir[-8,-7,-6,-1,1,6,7,8]
soit un autre ordre, car l'addition est commutative.Donc, associez d'abord les points positifs et les points négatifs à obtenir
[1,-1,6,-6,7,-7,8,-8]
.Vous pouvez maintenant raccourcir
à
Il en résulte
qui est de 176 caractères.
Décaler de 8 et passer aux différences
Les valeurs littérales à deux caractères semblent pouvoir être raccourcies, alors prenez
[8,10,12,22,24,26,36,38,40]
et décalez tout par le bas8
, en mettantj
à jour au début de la boucle. (Notez que cela+=8
évite d'avoir à mettre à jour les valeurs de décalage de1,6,7,8
.)C'est 179, ce qui est plus grand, mais il
j+=8
peut être supprimé.Premier changement
à un tableau de différences:
et ajouter cumulativement ces valeurs à une initiale
j=8
. Cela couvrira éventuellement les mêmes valeurs. (Nous pourrions probablement passer directement à cela au lieu de passer de 8 en premier.)Notez que nous ajouterons également une valeur fictive de
9999
à la fin du tableau des différences et ajouteronsj
à la fin , pas au début de la boucle. La justification est que cela2,2,10,2,2,10,2,2
ressemble terriblement aux mêmes 3 chiffres répétés 3 fois, et en calculantj+difference
à la fin de la boucle, la valeur finale de9999
n'affectera pas réellement la sortie, car il n'y a pas d'a[j]
appel oùj
est une valeur fini10000
.Avec ce tableau de différences, le
j+=8
est maintenant justej=8
, bien sûr, car sinon nous en ajouterions8
trop à plusieurs reprises . Nous avons également changé la variable de bloc dej
àl
.Donc, puisque l'
9999
élément n'a aucun effet sur la sortie, nous pouvons le changer10
et raccourcir le tableau.C'est 170 caractères.
Mais maintenant, l'
j=8
apparence est un peu maladroite, et vous pouvez enregistrer 2 caractères en diminuant[2,2,10]
de 2 pour obtenir facilement un que8
vous pouvez utiliser pour l'attribution. Cela doit aussij+=l
devenirj+=l+2
.Il s'agit de 169 caractères. Un moyen détourné de presser 7 caractères, mais c'est bien.
Derniers ajustements
L'
values_at
appel est en fait en quelque sorte redondant, et nous pouvons incorporer unArray#[]
appel. Doncdevient
Vous pouvez également remarquer que
flat_map
+j+e/j-e
+inject
peut être réduit à une somme plus directe avec une initiale0
dans le tableau.Cela vous laisse avec 152 caractères:
Finalement:
map.with_index
peut devenireach_slice
.135 :
la source
each
parmap
un octet.Python, 132
Techniquement, cela ne satisfait pas aux règles, car les derniers chiffres de chaque numéro sont alignés plutôt que le premier. Mais je pensais partager quand même:
Exemple de sortie:
la source
Mathematica, 108
Pour une sortie plus jolie, il
Column/@
peut être remplacé parTableForm@
un coût de 2 caractères.la source
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
donne une sortie plus propre et enregistre quelques caractères si vous ne comptez pas Transposer comme un seul caractère, ce qui est dans Mathmatica. Btw, le modèle OneLinerSubmission de Wolfram comptait 106 caractères, 105 avec le caractère Transpose.:>
à un symbole, bien qu'il se trouve dans la zone d'utilisation privée de l'unicode. On pourrait même supprimer la transposition, car la règle de sommation de validité est valable même après la transposition. Mais ilGrid
ne semble pas aligner les entrées sans autres options (v8)Grid
centre les nombres dans les colonnes. Techniquement, cela ne satisferait pas le défi, mais cela semble mieux que d'avoir une liste dans le tableau affiché.Part
etTuples
. Bientôt.p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
GolfScript (
79 78 72 70 68 66 6560 caractères)NB Il contient un onglet littéral que Markdown pourrait bien casser.
Le morceau intelligent est dû à Gareth: voir sa solution J.
Démo en ligne
la source
R: 114 caractères
La première ligne crée un tableau 7 x 7 rempli de nombres choisis au hasard de 1 à 9 (distribution uniforme avec remplacement, donc
r=T
qui signifiereplace=TRUE
). Deuxième ligne, calculer des sommes de 3 par 3 grilles, soustraire le centre et le remplacer par le résultat. La troisième ligne imprime la grille résultante (par défaut, les colonnes de matrice et de tableau sont alignées à droite).Exemple de sortie:
la source
J,
6765 octetsUne solution naïve et verbeuse en J. C'est une implémentation simple de la tâche.
Je crée d'abord un tableau 7 x 7 d'entiers compris entre 1 et 9. En fait, J? le verbe génère des nombres jusqu'à son argument, c'est pourquoi nous devons incrémenter chaque élément,>: in J
Je prépare un masque à utiliser pour la remise à zéro des cellules impaires de lignes / colonnes, une paire d'indices de lignes / colonnes impaires:
Le verbe Catalogue {combine les éléments des atomes à l'intérieur de la liste encadrée
pour former un catalogue, le tableau 3x3 des paires ci-dessus
Ensuite, je prépare un tableau des indices ligne / col à utiliser pour la sélection de chacun des sous-réseaux 3x3.
Pour chaque paire dans le tableau m, je fais une paire de triplets, centrée autour de chaque numéro de la paire m:
Ces paires de triplets sont utilisées par le verbe J From {, qui peut sélectionner plusieurs lignes et colonnes simultanément. 0 1 2/2 3 4 signifie que je sélectionne les lignes 0, 1 et 2 ainsi que les colonnes 2, 3 et 4, sélectionnant ainsi le deuxième sous-tableau 3x3 en haut.
Enfin, je peux utiliser le tableau 7x7 et les masques pour accomplir la tâche: d'abord j'utilise m comme masque pour mettre les éléments correspondants à 0:
Ensuite, je prends tous les sous-réseaux 3x3 en utilisant s comme sélecteur et trouve leurs sommes:
Ensuite, je remets ces chiffres dans le tableau de départ.
Essayez-le en ligne!
la source
APL (Dyalog Unicode) ,
323130 octets SBCS-1 octet grâce à @jslip
Essayez-le en ligne!
la source
∧/¨~
->⍱/¨
Rubis, 207
Je présenterai d'abord ma solution (comme je le fais toujours):
la source
Ruby, 150 caractères
si la justification de l'exigence de justification de gauche est juste, cela
ljust
devrait être utilisé ... eh bien, non. J'adore les capacités de formatage de Ruby.Ne pas utiliser
Array.new(7){...}
.(0..6).map{...}
est à la fois plus court et plus lisible et vous obtenez une plage assignable gratuitement.Ligne # 3 inspirée de la solution de Doorknob .
la source
GolfScript, 87 caractères
Il y a trop de zips là-dedans ... (voir en ligne )
la source
J, 58/64/67 caractères
Bien que la spécification exige que les nombres soient alignés à gauche, il n'est pas nécessaire d'utiliser la notation décimale, donc je suppose que c'est une sortie valide:
Si l'alignement à droite au lieu de l'alignement à gauche est acceptable, nous sommes à 58 caractères
J's
":
(format) a trois modes de formatage:Le format le plus verbeux mais aussi le plus polyvalent et le seul capable de produire la sortie selon l'exemple est le
8!:2
formatage étranger, qui prend une chaîne de formatage comme argument de gauche. Aussi 67 caractères :Voici le format encadré:
la source
Perl, 117 caractères
C'est l'un de ces scripts Perl où toutes les boucles for sauf une ont été regroupées en
map
appels afin que tout puisse être fait en une seule instruction. Les variables globales font également des apparitions importantes dans celle-ci. Je suppose que ce que j'essaie de dire ici, c'est que ce programme est un peu dégoûtant.Attendez, ça empire: il y a un bug connu dans le script! Cependant, il a moins d'une chance sur un million de se déclencher, donc je n'ai pas encore réussi à le réparer.
la source
Mathematica , 106/100
J'ai trouvé quelque chose de très similaire au code de ssch, avant de le voir. J'emprunte son idée d'utilisation
Column
. Avec ASCII uniquement, 106 :Avec les caractères Unicode (tels qu'utilisés par ssch), 100 :
la source
Excel VBA, 74 octets
Fonction immédiate VBE qui sort vers
[B2:H9]
.Exemple de sortie
la source
Powershell,
149148 octets-1 octet grâce à @AdmBorkBork. C'est cool!
Explication:
la source
$a
affectation en parens et en déplaçant la ligne suivante vers le haut pour faire une grande ligne -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Voici donc deux étapes. J'ai eu plusieurs tentatives pour encapsuler dans un tuyau. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
est entièrement rempli avant la prochaine instance de pipeline. Ça devrait marcher (du moins, ça marche pour moi).Mathematica
142 151 172179Code
Usage
la source
0
s; les règles disent 1-9Julia 0,6 , 127 (89) octets
Essayez-le en ligne!
89 octets utilisant l'affichage natif, ce qui pourrait être admissible si des lignes supplémentaires peuvent être imprimées:
la source
Java 10,
262260248239 octets-12 octets grâce à @ceilingcat .
Explication:
Essayez-le ici.
la source
var
au lieu deString
et+=Math.random()*9+1;
au lieu de=(int)(Math.random()*9+1);
. Il est en fait assez utile pour vous de visiter toutes mes anciennes réponses, haha! : D