Objectif
Étant donné une chaîne avec un train de hachages, calculez sa longueur totale et divisez par la distance du début à la fin.
Simulation
Que simulons-nous? Selon cet article , le rapport de la longueur d'une rivière à la distance entre le début et la fin est d'environ Pi! (Cela peut avoir été réfuté empiriquement, mais j'ai pu trouver les données et pour ce défi, nous supposerons que c'est vrai).
Comment simulons-nous cela?
- Prendre une entrée de chaîne d'espaces et de hachages
- Chaque hachage en aura deux autres adjacents
- A l'exception du premier et dernier hachage qui n'aura que 1
- Chaque personnage se trouve sur un point de réseau
(x, y)
x
est l'index du personnage sur sa ligne- par exemple
c
est le 4ème caractère0123c567
- par exemple
y
est le numéro de ligne du caractère- par exemple
c
est sur la 3ème ligne:
- par exemple
0line
1line
2line
3c...
- Additionnez les distances entre les hachages adjacents, appelez-le
S
- Prenez la distance entre le premier et le dernier hachage, appelez-le
D
- Revenir
S/D
spécification
- Contribution
- Flexible, saisissez les données de n'importe quelle manière standard (par exemple, paramètre de fonction, STDIN) et dans n'importe quel format standard (par exemple chaîne, binaire)
- Production
- Flexible, donne une sortie de n'importe quelle manière standard (par exemple retour, impression)
- Les espaces blancs, les espaces blancs arrière et avant sont acceptables
- Précision, veuillez fournir au moins 4 décimales de précision (c.-à-d.
3.1416
)
- Notation
- Le code le plus court gagne!
Cas de test
Ce sont mes approximations des rivières. Mes approximations peuvent être médiocres ou celles-ci peuvent être un échantillon pauvre de la population fluviale. Aussi, j'ai fait ces calculs à la main; J'aurais pu manquer calculé.
### ####
# # #
# # #
# # #
# # #
# # #
## # # #####
## # #
##
1.6519
#
#
#
#
#
#
#
#
# #
# # #
# #
#
##
#
#
#
#
#
#
#
#
# #
# ##
#
#
#
#
#
#
#
#
#
#
#
1.5498
###
# #
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
###
#
#
#
#
#
#
#
#
#
##
#
#
##
##
##
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
####
#
#
1.5257
TL; DR
Ces défis sont des simulations d'algorithmes qui ne nécessitent que la nature et votre cerveau (et peut-être quelques ressources réutilisables) pour approximer Pi. Si vous avez vraiment besoin de Pi pendant l'apocalypse zombie, ces méthodes ne gaspillent pas de munitions ! Il y a neuf défis au total.
#<tag>
Réponses:
MATL ,
4844423733 octetsBeaucoup d'octets économisés grâce à l'idée de rahnema1 (réponse Octave) de fusionner deux convolutions en une
Cela prend l'entrée comme une matrice binaire, avec
;
comme séparateur de lignes.1
correspond au hachage et0
à l'espace.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Voici un convertisseur de format qui prend les entrées sous forme de tableaux de caractères 2D (encore une fois, avec
;
comme séparateur) et produit des représentations de chaînes des matrices binaires correspondantes.Explication
C'était amusant! Le code utilise
troisdeux convolutions 2D, chacune dans un but différent:Pour détecter les voisins verticaux et horizontaux, qui contribuent à une distance de
1
, le masque requis seraitMais nous voulons que chaque paire de voisins soit détectée une seule fois. Nous prenons donc la moitié du masque (et la dernière ligne de zéros peut être supprimée):
De même, pour détecter les voisins diagonaux, qui contribuent à une distance de
sqrt(2)
, le masque seraitmais par le même raisonnement que ci-dessus, il devient
Si ce masque est multiplié
sqrt(2)
et ajouté au premier, les deux convolutions peuvent être remplacées par une seule convolution avec le masque combinéLes points de départ et d'arrivée sont, par définition, les points avec un seul voisin. Pour les détecter, nous convolons avec
et voir quels points donnent
1
comme résultat.Pour produire le masque combiné de l'élément 1, il est plus court de générer son carré, puis de prendre la racine carrée. Le masque de l'élément 2 est un littéral prédéfini.
la source
Octave, 99 octets
presque la même méthode que la réponse MATL mais ici le noyau des convolutions est
c'est
sqrt(2) =1.41
pour les voisins diagonaux et1
pour les voisins directs, donc lorsque nous additionnons les valeurs du résultat sur la rivière, nous obtenons le double de la distance réelle.version non golfée :
Essayez (collez) sur Octave Online
la source
{[x y]=find(c<2&c>0),pdist([x y])}{2}
est tellement sacrément intelligent !!!JavaScript (ES6), 178
Entrée sous forme de chaîne avec des retours à la ligne sous forme rectangulaire : chaque ligne est remplie d'espaces de la même longueur (comme dans les exemples)
Moins golfé
Tester
la source