Pour les chiffres non nuls sur un pavé numérique standard
789
456
123
Pensez à placer un chevalier d'échecs à n'importe quel chiffre et à le déplacer avec un nombre quelconque de sauts en L normaux, en traçant un entier décimal positif. Quels entiers positifs peuvent être exprimés de cette manière?
L’un d’eux est 38
, puisque le chevalier pourrait commencer sur le 3
et aller à gauche et jusqu’à 8
. 381
et 383
sont également possibles.
3
lui-même est possible si aucun saut n'est effectué (ce qui est autorisé). Cela est 5
également le cas, mais aucun autre chiffre ne peut être atteint à partir de la 5
, c'est donc le seul numéro où le chiffre 5
apparaît.
Ecrivez un programme ou une fonction qui prend un entier décimal positif (vous pouvez le prendre comme une chaîne si vous le souhaitez) et affiche ou renvoie une valeur de vérité si le nombre peut être exprimé par un chevalier sur un pavé numérique de la manière décrite, mais renvoie sinon une valeur de fausseté .
Le code le plus court en octets gagne. Tiebreaker est une réponse plus tôt
Exemples
Vérité
1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276
Fausseté:
10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760
78963214
, répétée encore et encore. Comptez les distances - c'est toujours quatre, d'une manière ou d'une autre. J'aurais dû être plus clair et avoir explicitement dit qu'il fallait l'écrire dans l'ordre des cercles.123...9
. DésoléRéponses:
Jelly,
191514 octetsEssayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
Python 2, 52 octets
Vérifie que deux chiffres consécutifs sont dans la chaîne
'18349276167294381'
. Pour obtenir des chiffres consécutifs, plutôt que de le fairezip(`n`,`n`[1:])
, la fonction vérifie à plusieurs reprises les deux derniers chiffres et supprime le dernier chiffre.la source
Retina ,
58 à40 octetsMerci à Sp3000 pour avoir suggéré cette idée:
Essayez-le en ligne! (Légèrement modifié pour exécuter la suite de tests complète en une fois.)
Imprime
1
pour la vérité et0
pour les résultats faux.Explication
Recherchez toutes les correspondances superposées de
..
, c'est-à-dire toutes les paires de chiffres consécutives, et joignez-les à des sauts de ligne.Triez les chiffres dans chaque ligne, de sorte que nous n’ayons à vérifier que deux fois moins de paires.
Supprimez toutes les lignes qui correspondent à un mouvement valide.
Comptez les correspondances de cette regex. C'est-à-dire que si toutes les lignes ont été supprimées, cela correspond à la chaîne vide résultante une fois, sinon elle ne correspond pas et donne la valeur zéro.
la source
Pyth -
3528 octetsSuite de test .
la source
Ruby, 57 octets
Fonction anonyme. L'argument est une chaîne.
Programme avec la suite de tests:
Je viens de coder tous les mouvements possibles de chevaliers dans une chaîne et de vérifier si tous les 2 chiffres de l'entrée existaient dans cette chaîne.
la source
grep 58 octets
Parce que vraiment, si vous ne pouvez pas battre Grep ...
la source
5
ni185
émettre1
avec votre ligne de commande, tandis que5
est dans la vérité, et185
dans la liste de fausseté.Haskell 46 octets
Exemple d'utilisation:
all(`elem`q"16729438183492761").q $ "183492761"
->True
Comment cela fonctionne: Il utilise la chaîne de recherche trouvée dans la réponse de @Kevin Lau .
q
fait une liste de paires de caractères adjacents d'une chaîne, par exempleq "1672" -> [('1','6'),('6','7'),('7','2')]
. La fonction renvoie true si toutes les paires de l'entrée apparaissent dans les paires de la chaîne de recherche.q
transforme les entrées à un chiffre en liste vide, doncelem
réussit toujours.la source
zip<*>tail
fonctionne comme une version retournée dezip=<<tail
? Je pense que je ne comprends pas ce que les applications généralisent.<*>
est défini comme(<*>) f g x = f x (g x)
.JavaScript (ES6),
6562 octetsRenvoie vrai ou faux. J'avais déjà essayé une solution récursive, qui prend 63 octets,
map
et même,reduce
mais ils m'ont pris 73 octets.Edit: 3 octets sauvegardés grâce à @ user81655.
la source
match
travaux au lieu de~search
(mais de toute façon, c'est vraiment sournois) et|
peut remplacer||
(mais pas dans la version récursive, malheureusement.)!i|...match
fonctionne car le résultat de la correspondance, en cas de succès, est un tableau d'une seule chaîne de deux chiffres, que l'|
opérateur finit par forcer à former un entier valide.C,
8581 octetsGolfé:
Ancienne version non récursive (85 octets):
Ancien code avec espace et programme principal:
Ceci accepte les nombres délimités par des espaces via l'entrée standard et les sorties 0, sinon numpad-knight, ou 1 sinon.
La nouvelle version récursive de 81 octets supprime 4 octets.
la source
MATL ,
383729 octetsCeci utilise l' idée de @QPaysTaxes .
La sortie est un tableau 2D, complexe et non vide. C'est la vérité si toutes ses valeurs ont une partie réelle non nulle, et la fausseté autrement.
Essayez-le en ligne!
la source
05AB1E , 29 octets
Code:
Utilise le codage CP-1252 . Essayez-le en ligne! .
la source
MATL,
25243326 octetsRasé 1 octet grâce à @LuisMendo!
@Dennis a trouvé un bogue, puis l'a corrigé! Merci!
Prend un entier en entrée. Sorties 1/0.
Essayez-le en ligne!
la source
A
à la fin. Les vecteurs de MATL sont à vérifier si et seulement s'ils ne contiennent pas de 0.C,
14092 octetsEn supposant ASCII
Détaillé Essayez-le ici
la source
{,}[]
et que vous le codez sous forme dechar*
chaîne. Notez également que votre utilisation#define
n'est pas rentable lorsque vous ne l'utilisez que deux fois: sa suppression vous permettrait d'économiser 4 octets.\0
le tableau ayant provoqué un comportement indéfini, je l'ai donc remplacé parx
<s>oldscore</s> newscore
lors de l'édition pour refléter les améliorations apportées au score et<!-- language-all: lang-c -->
avant que votre code ne commence à corriger la mise en surbrillance de la syntaxe. J'ai également réussi à réduire un peu le nombre d'octets en abandonnant complètement la boucle.n
la version courte?). En outre, vous devriez probablement mentionner que vous supposez le codage ASCII - vous obtiendrez des numéros différents sur les ordinateurs EBCDIC.Julia,
5149 octetsVérification
la source
En fait, 30 octets
Prend l'entrée sous forme de chaîne. Affiche un entier positif pour vrai et 0 pour faux.
Essayez-le en ligne!
Explication:
la source
PowerShell v2 +,
105 à96 octetsParcourt l'entrée (qui doit être encapsulée avec
""
) en vérifiant que l'index de toute paire de caractères séquentielle se trouve dans la chaîne de recherche valide. Je vois que Kevin Lau avait quelque chose de similaire , mais je l'ai inventé de manière indépendante. Chacun de ces index est ajouté avec+1
, comme la.IndexOf()
fonction retournera-1
si la chaîne n'est pas trouvée. Cela transformera les "non trouvés" en0
.Nous avons ensuite
-join
toutes les valeurs entières résultantes avec*
et conduisent àiex
(similaire àeval
). Cela signifie que si l’un des index n’est pas trouvé, l’expression entière en résulte0
. Cela est encapsulé entre parenthèses et-or
avec$a-eq5
le cas particulier d’entrée"5"
pour obtenir notre sortie résultante.Essais
la source
C, 78 octets
Comme tout le monde a pris l’entrée sous forme de chaîne, j’ai essayé de le faire en nombres entiers. Cela fonctionne de manière récursive à partir du chiffre le moins significatif (
a%10
); si c'est le seul chiffre, alors retourne vrai. Sinon, ne retourne vrai que si le chiffre des dizaines (b%10
) ne peut pas être atteint à partir du chiffre des unités et que (de manière récurrente), le reste de l'entrée satisfait au même test.Le test d'accessibilité fonctionne en encodant le tour du chevalier de manière linéaire et en convertissant chaque chiffre en sa position (zéro à sept) sur le tour. Pour les chiffres
0
et5
, nous affectons la position neuf, qui est déconnectée des autres positions. Ensuite, les nombres mutuellement joignables diffèrent de un (mod huit); c'est à direa[x%10]-a[b%10]
- soit ± 1 ou ± 7. Nous testons donc la différence absolue (mod 6) contre 1.Cette solution fonctionne pour tout codage de caractères valable pour C (c'est-à-dire que les chiffres ont des codes contigus de 0 à 9).
la source
Java 8,
179167 octetsPlace les touches numériques (moins 5 et 0) dans un cercle.
l
détient l'index de cercle de ces ints. Si la différence de deux indices est de +/- 3 mod 8, il y a un mouvement de chevalier entre les ints correspondant à ces indices. Notez quex
c'est unint[]
.Mise à jour
<2
au lieu de==1
la source