Le flocon de neige de Koch (également connu sous le nom d'étoile de Koch et d'île de Koch) est une courbe mathématique et l'une des premières courbes fractales à avoir été décrite. Il est basé sur la courbe de Koch, qui est apparue dans un article de 1904 intitulé "Sur une courbe continue sans tangentes, constructible à partir de la géométrie élémentaire" (titre français original: "Sur une courbe continue sans tangente, obtenue par une construction géométrique élémentaire") par le mathématicien suédois Helge von Koch.
Voici quelques représentations ascii de diverses itérations:
n=1
__
\/
n=2
__/\__
\ /
/_ _\
\/
n=3
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/ \__
\ /
/_ __ __ _\
\/ \ / \/
/_ _\
\/
Puisqu'il y a évidemment une limite à la résolution de la représentation ascii, nous devons agrandir la taille du flocon de neige d'un facteur 3 pour chaque itération pour montrer le détail supplémentaire.
Écrivez le code le plus court pour sortir le flocon de neige dans le même style pour n = 4
Votre programme ne doit prendre aucune entrée.
Votre programme devrait écrire le flocon de neige sur la console.
la source
Réponses:
Python, 338 octets
Juste un autre exploit unicode
courir à ideone
la source
Python,
650612594574 caractèresCela fonctionne en agrandissant le triangle d'un facteur 3 à chaque fois. Pour ce faire, nous devons garder une trace de si chaque symbole est une limite gauche ou droite (par exemple, comment
/
est développé dépend de quel côté de/
l'intérieur est). Nous utilisons des symboles différents pour les deux cas possibles, comme suit:La
d
variable gère le cas spécial où l'expansion d'una
doit s'étendre au 3x3 de la ligne suivante.la source
('acEei',r'_/\\ ')
=>('aecEi','_\/\ ')
enregistre 1 de plus. Vous pouvez également consulter leunicode.translate()
.Code machine MS-DOS 16 bits: 199 octets
Décodez en utilisant ce site , enregistrez-le en tant que fichier 'koch.com' et exécutez à partir de l'invite de commande WinXP.
Mise à jour
Voici une version d'assembleur facile à lire:
la source
"scAA...w==".decode("base64")
pour décoder en Python2 (ne fonctionne pas pour Python3)Perl,
176175 octetsPublier cela comme une réponse distincte car il utilise un fichier source binaire, ce qui est peut-être un peu tricheur. Mais étant donné que c'est toujours du code source Perl , je pense qu'il est remarquable qu'il bat la solution de code machine MS-DOS !
Source encodée en base64
Un peu plus lisible
Remplacez toutes les instances de
/<[0-9a-f]+>/
par les données binaires pertinentes:Dans cette version, le flocon de neige est codé de la manière suivante:
Les 8 bits de chaque octet sont divisés comme suit:
R
code une série d'espaces. La course la plus longue est de 27 caractères, donc toutes les courses tiennent sur 5 bits.C
code une séquence de caractères qui sont simplement recherchés dans le tableau littéral. (J'avais l'habitude d'avoir des encodages légèrement plus fous ici où le tableau contenait uniquement/ \ _
, mais le code Perl nécessaire pour le décoder était plus long ...)J'ai de la chance que les données binaires ne contiennent aucun
"
/'
ou\
qu'il faudrait échapper. Je n'avais pas prévu ça. Mais même si c'était le cas, j'aurais probablement pu changer l'ordre des éléments du tableau pour résoudre ce problème.Il est étonnant de voir à quel point cette solution est simple par rapport aux dizaines d'autres solutions que j'ai rencontrées avant d'en arriver là. J'ai expérimenté de nombreux codages au niveau du bit plus complexes que celui-ci, et il ne m'est jamais venu à l'esprit qu'un plus simple pourrait en valoir la peine simplement parce que le code Perl pour le décoder serait plus court. J'ai également essayé de compresser les répétitions dans les données en utilisant l'interpolation variable (voir l'autre réponse), mais avec la dernière version qui ne gagne plus de caractères.
la source
Python, 284
Avec un peu plus d'espace:
Le côté gauche est compressé; le côté droit est reproduit du côté gauche.
la source
Perl,
224223 caractèresUn peu plus lisible
Comment ça marche
Pour une explication de la façon dont cela fonctionne, voir l'autre réponse dans laquelle je poste la même chose en binaire . Je suis vraiment désolé de ne pas générer le flocon de neige Koch, je le compresse juste ...
Versions précédentes
(359) Encodé tout le flocon de neige au lieu de juste la moitié gauche. Des espaces ont été inclus dans l'encodage des bits; pas encore de longueur. Utilisé plusieurs variables interpolées plus un
@_
tableau accessible à l'aide des/\d/$_[$&]/eg
. Les retours à la ligne ont été codés comme!
.(289) Première version qui n'encodait que la moitié gauche du flocon de neige.
(267) Première version qui utilisait l'encodage de longueur pour les espaces.
(266) Remplacer
' '
par$"
.(224) Compression radicalement différente, codée en base-64. (Maintenant équivalent à la version binaire .)
(223) Je me suis rendu compte que je pouvais mettre l'impression à l'intérieur du dernier subst et ainsi enregistrer un point-virgule.
la source