Mes défis ont tendance à être un peu difficiles et peu attrayants. Voici donc quelque chose de simple et amusant.
La séquence d'Alcuin
La séquence d'Alcuin A(n)
est définie par le comptage des triangles. A(n)
est le nombre de triangles dont les côtés et le périmètre sont entiers n
. Cette séquence est appelée d'après Alcuin of York.
Les premiers éléments de cette séquence, à commencer par n = 0
:
0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...
Par exemple A(9) = 3
, parce que les seuls triangles avec des côtés et un périmètre entiers 9
sont 1 - 4 - 4
, 3 - 3 - 3
et 2 - 3 - 4
. Vous pouvez voir les 3 triangles valides ci-dessous.
Il y a un schéma assez intéressant dans cette séquence. Par exemple A(2*k) = A(2*k - 3)
.
Pour plus d'informations, voir A005044 sur OEIS.
Défi
Mais votre défi concerne la représentation binaire de ces nombres. Si nous convertissons chaque numéro de séquence en sa représentation binaire, les mettons dans des vecteurs de colonne et les alignons, cela crée une image binaire assez intéressante.
Dans l'image suivante, vous pouvez voir la représentation binaire des numéros de séquence A(0), A(1), ..., A(149)
. Dans la première colonne, vous pouvez voir la représentation binaire de A(1)
, dans la deuxième colonne la représentation de A(1)
, etc.
Vous pouvez voir une sorte de motif répétitif sur cette image. Cela ressemble même un peu à des fractales, si vous regardez par exemple l'image avec les numéros de séquence A(600), A(601), ..., A(899)
.
Votre travail consiste à générer une telle image. Votre fonction, votre script recevra deux entiers 0 <= m < n
, et il doit générer l'image binaire de la séquence d'Alcuin A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1)
. Donc, l'entrée 0, 150
génère la première image, l'entrée 600, 900
la deuxième image.
Vous pouvez utiliser n'importe quel format graphique populaire que vous souhaitez. Disons tous les formats qui peuvent être convertis en png en utilisant image.online-convert.com . Alternativement, vous pouvez afficher l'image à l'écran. Aucune première ligne blanche n'est autorisée!
C'est du code-golf. Ainsi, le code le plus court (en octets) gagne.
white=1 and black=0
l'inverse?white=0 and black=1
. Donc dans l'autre sens.A(0)
produit une colonne blanche,A(9)=3
produit une colonne blanche avec 2 pixels noirs en bas.0,0,0,1,0,2
pendant la liste au début de la question0,0,0,1,0,1
.Réponses:
J (
5245 (page de code 437))Ce serait permis (je pense)
Vidage hexadécimal
(Rien de vraiment spécial, le carré noir est DB 16 ou 219 10 en page de code 437.)
Usage
Cela sort comme suit (les balises de code gâchent le tout en ajoutant de l'espace entre les lignes):
Dans la console J standard, il n'y a pas d'espacement entre les lignes, donc j'appelle la règle «Alternativement, vous pouvez afficher l'image à l'écran». (Nulle part n'a-t-il été dit que cette image devait être représentée en tant que format d'image sensible en interne)
EDIT: Jconsole (par opposition à JQT) utilise la page de code 437 par défaut, et rend correctement les rectangles lors de leur utilisation à partir d'une chaîne.
la source
Mathematica,
126122121 12189 octetsCeci définit une fonction sans nom prenant les deux entiers comme paramètres et affichant l'image à l'écran. Il trace chaque carré comme un seul pixel, mais si vous le souhaitez, vous pouvez réellement zoomer.
J'utilise maintenant une formule explicite donnée dans l'article OEIS (la première dans la section Mathematica, merci à David Carraher de l'avoir signalé). C'est aussi incroyablement rapide maintenant.
Voici le code en retrait avec quelques commentaires:
Voici la sortie pour
0, 600
:la source
Image[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
CJam (
56 5553 caractères) / GolfScript (64 caractères)CJam:
GolfScript:
Les deux produisent une sortie au format NetPBM et sont essentiellement des ports l'un de l'autre.
Dissection
Merci à Optimizer pour CJam 56 -> 53.
la source
'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
Pyth -
1016059Sorties a
.pbm
. Peut probablement être joué au golf plus.Très peu golfé car je vais traduire en Pyth.Explication à venir. Regardez maintenant le code Python équivalent.Il utilise l'algorithme OEIS pour calculer la séquence, puis il se convertit en binaire, remplit les nombres, effectue une rotation de matrice et la formate en une
pbm
image. Comme je n'utilise pas la force brute, c'est incroyablement rapide.Voici l'
600,900
exemple:Essayez-le ici en ligne .
la source
R -
127125Je ne sais pas si cela est totalement conforme aux règles. Il ne génère pas d'image dans un fichier, mais il crée un raster et le trace sur un périphérique de sortie.
J'ai trouvé la même formule que Martin, mais ici .
Il utilise une fonction sans nom.
Exécutez comme suit
Produit l'intrigue suivante
la source
raster
à l'espace de noms, carraster()
c'est la seule chose spécifique à ce package. Au lieu de cela, faites-leraster::raster(...)
.Python 2
+ PIL,255184Ma première version utilisait PIL pour afficher une image:
La nouvelle version produit juste une image PPM n & b sur stdout:
la source
for
. Vous pouvez éviter les parensx%2
en changeant l'ordre enx%2*...
. Il est plus court de ne pas définir l'impression en tant que fonction et d'utiliser simplement deuxfor
boucles imbriquées , en utilisantprint ...,
pour éviter les sauts de ligne et un blancprint
pour commencer une nouvelle ligne. Une astuce pour forcer les extensions binaires à avoir une longueurh
sanszfill
est d'ajouter2**h
, puis d'extraire les derniersh
chiffres.JAVASCRIPT - 291
Code:
Explication:
Résultat:
Oui le résultat est à l' envers, mais c'est parce que
0,0
sur unjs canvas
est en haut à gauche. : 3Démo:
Démo sur jsfiddle
la source