Défi du nombre de serpents
Je me demande combien de nombres de serpents il y a entre 1 et 50 000?
Snaking Numbers, dans ce jeu, sont des chiffres qui peuvent être saisis sur un pavé numérique traditionnel (format ci-dessous) en déplaçant une touche vers le haut, le bas, la gauche ou la droite.
7 8 9
4 5 6
1 2 3
0
Par exemple, si vous commencez par le chiffre 5, vous pouvez sélectionner 4, 6, 8 ou 2 comme prochain mouvement valide - cependant 7, 3, 9 et 1 sont hors limites car ils sont positionnés en diagonale par rapport à la clé actuelle . Donc, si vous en avez 5, puis 2, vos prochains choix de clés viables sont à nouveau 0, 1, 3 ou 5.
Dans cet exercice Code Golf, vous devez générer une liste de tous les nombres de serpents positifs entre 1 et 50k, ainsi qu'un décompte final de tous les nombres qui répondent au critère.
Règles
- Les nombres ne peuvent pas commencer par un zéro.
- Les nombres doivent être des entiers positifs entiers.
- Chaque numéro consécutif, lu de gauche à droite, doit "serpenter" autour du pavé numérique.
- Le serpent ne peut pas voyager en diagonale à travers les touches
- Le numéro 0 est accessible à partir des numéros 1 et 2
- Les numéros ne peuvent pas être jumelés (par exemple: 22)
Exemples de numéros de serpentage valides:
12369
45201
1254
10102
1
12
987
Exemples de numéros invalides
1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159 - snake cannot travel diagonally
4556 - duplicate 5
Selon les codes de golf normaux, l'objectif est le moins d'octets!
Selon mes calculs et mes règles, vous devriez avoir 670 nombres de serpents valides dans votre liste, plus 670 lui-même imprimé comme dernier numéro.
Réponses:
K (ngn / k) ,
6057 octetsEssayez-le en ligne!
!50000
liste de0
..49999
1+
ajouter 1 à tous{
}#
filtre avec la fonction{
}
10\x
chiffres décimaux de l'argument(
)@
utiliser comme indices dans ...!3 3
une paire de listes:(0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)
2*
multipliez tout par 20 1,'
ajouter0
à la première liste et1
à la seconde+
transposer (paire de listes -> liste de paires). cela nous donne les coordonnées approximatives des boutons.-':
soustraire de chaque paire la paire précédente. utiliser0 0
comme élément imaginaire avant le premier.1_
laissez tomber le premier+
transposerx*x:
carré (attribuerx
et multiplier parx
). voicix
une paire de listes - ∆xs et ∆ys+/
additionner les deux listes (élément par élément)5&
min avec 53!
mod 31=
liste booléenne d'où il est égal à 1*/
produit (booléen "et")(x;#x:
)
faire une paire du résultat et la longueur (#
) du résultatla source
Gelée ,
2423 octetsUn programme complet qui imprime une liste de tous les résultats puis le nombre de résultats.
Essayez-le en ligne!
Comment?
la source
1.
évalue-1.5
t-on?Python 3 , 140 octets
Essayez-le en ligne!
Je suis certain que quelqu'un pourra le faire avec une expression au lieu d'une chaîne de recherche.
la source
Python 2 , 101 octets
Essayez-le en ligne!
Le nombre hexadécimal est décimal
10120214525632365878969854741
, qui code pour chaque paire ordonnée de chiffres qui peuvent apparaître adjacents les uns aux autres.la source
JavaScript (V8) ,
112106104octetsEnregistré 2 octets grâce à @NahuelFouilleul
Un programme complet.
Essayez-le en ligne!
Ou 96 octets si nous pouvons sortir les nombres dans l'ordre inverse:
Essayez-le en ligne!
la source
3
peut-être parce qu'il36
est déjà dans la chaîne6589632145201478
est également un octet plus courtStax ,
3735 octetsExécutez-le et déboguez-le sur staxlang.xyz!
C'était tellement agréable et court, jusqu'à ce qu'il ne soit pas.
Déballé (42 octets) et explication
2012365478963258741 code le clavier. Regardez des paires de chiffres adjacents. Peut-être que si je pouvais obtenir une alternative assez courte qui va dans les deux sens pour chaque paire, je pourrais couper les huit octets de
{{om
.Sans ce 670 arrière, un simple filtre suffirait:
f..!
au lieu de{..C_Qf%p
. Il pourrait y avoir une meilleure façon de gérer cette irrégularité. Dans les deux cas, ce comportement de plage de filtres n'est pas documenté.la source
PHP , 145 octets
Essayez-le en ligne!
Pour chaque numéro de 1 à 50 000, vérifie chaque chiffre de ce numéro de gauche à droite. Si tous les chiffres figurent dans la liste des chiffres valides du chiffre précédent, ce numéro est imprimé. À la fin, imprime un 670 codé en dur car il prend moins d'octets que de le compter.
la source
05AB1E , 23 octets
Essayez-le en ligne!
Port de Réponse de Jelly Jonathan Allan .
la source
₄50*
ou4°5*
quand je faisais une tentative plus tôt. Et au début, je ne savais pas pourquoi vous aviez€OP
au lieu de justeOP
, mais ensuite j'ai réalisé que les nombres à un chiffre (être une liste vide après leüα
) seraient alors à la[] → 0 → 0
place de[] → [] → 1
. :)4°5*
quand vous le pouvez5°;
? Mais j'aime mieux ZAK. Et oui, ce cas de bord pour les nombres à un chiffre est une douleur.Perl 5 (
-M5.01
),96, 92 octets-4 octets grâce à @Xcali
TIO
la source
JavaScript (SpiderMonkey) ,
179173151129 octetsEssayez-le en ligne!
-22 octets merci à Arnauld -22 octets merci à dana
explication:
@dana a également donné une solution de 123 octets si nous pouvons imprimer 670 en premier
la source
Rubis , 99 octets
Essayez-le en ligne!
la source
Stax ,
2826 octetsExécuter et déboguer
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
La sauce secrète est dans la chaîne littérale
"{<f:[/T8Z"
. Après avoir brouillé tous les points de code ensemble, vous obtenez12360102589147845690
. Les paires ascendantes de cette chaîne sont les mouvements de serpent valides.la source
15JJ
au lieu de219J
fonctionnerait aussi bien, mais je ne pense pas que vous puissiez jouer au golf à partir de là à moins qu'il y ait une constante de 1 octet pour15
.Haskell , 118 octets
Essayez-le en ligne!
Une première passe; Je ne suis pas bon en compression.
Le
s=
ne compte pas, car nous n'avons pas vraiment besoin de lier le résultat.Code non golfé .
la source
Fusain , 42 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Traitez la plage inclusive de
1
à50,000
transtyper en chaîne.Filtrez ceux qui ont des paires de chiffres non contenues dans la chaîne compressée
01478963202125458565236987410
.Sortez le tableau restant et sa longueur.
la source
Japt , 34 octets
Essayez-le
la source
Perl 6 , 64 octets
Essayez-le en ligne!
Explication
la source
~>
ne soit pas encore implémenté, sinon vous pourriez être en mesure de le faire avec seulement des opérateurs de chaîne, le champ de bits étant une chaînePyth ,
686545 octetsEssayez-le en ligne!
L'inspiration pour le processus de recherche révisé est venue de la réponse Stax de Khuldraeseth na'Barya , allez leur donner un vote positif!
Edit 2: réécrit pour enregistrer un tas d'octets, version précédente:
Edit: Golfed 3 bytes by using string lookups, previous version:
la source