(Remarque: ceci est une retombée de mon précédent défi, Trouvez les mots tourbillonnants! )
Définition de mot Infinity :
- Si vous reliez par des courbes tous les caractères d'un mot Infinity de l'alphabet (AZ), vous obtenez le symbole de l'infini ∞, comme dans les schémas ci-dessous.
- Toutes les connexions paires doivent être en panne , toutes les connexions impaires doivent être en place .
- Vous pouvez ignorer les majuscules / minuscules ou considérer / convertir tout en majuscule ou tout en minuscule.
- Les mots entrés ne sont que des caractères dans la plage alphabétique de AZ, pas d'espaces, pas de ponctuation ni de symboles.
- Chaque mot doit comporter exactement 5 caractères. Les mots> 5 ou <5 ne sont pas valides.
- Si un mot a des caractères doubles consécutifs, le mot n'est pas valide, comme "FLOOD" ou "REINE".
- Tous les mots d'infini commencent et finissent avec le même caractère.
Voici quelques exemples:
Tâche:
Ecrivez un programme complet ou une fonction qui prendra un mot de l’entrée standard et qui sortira s’il s’agit d’un mot infini ou non. La sortie peut être vraie / fausse, 1/0, 1 / nulle, etc.
Cas de test:
Infinity Words:
ALPHA, EAGLE, HARSH, NINON, PINUP, RULER, THEFT, WIDOW
NOT Infinity Words:
CUBIC, ERASE, FLUFF, LABEL, MODEM, RADAR, RIVER, SWISS, TRUST,
KNEES, QUEEN, GROOVE, ONLY, CHARACTER, OFF, IT, ORTHO
Règles:
- Le code le plus court gagne.
Tâche facultative:
Trouvez, sous forme de liste, autant de mots Infinity que possible dans un dictionnaire anglais. Vous pouvez prendre par exemple comme référence la liste complète des mots anglais ici .
Réponses:
Gelée ,
43 41 40 25 24 23 22 21 1413 octets-7 octets grâce à fireflame241 (
0ị=1ị$
->=ṚḢ
et utilisation deIIA⁼2,2
pour tester les 4 rotations)-1 Merci à Kevin Cruijssen (utilisation de nilad précédemment indisponible
Ø2
qui donne[2,2]
)TryItOnline
Ou tous les cas de test (plus "RULES")
Comment?
Un mot infini a:
Tous sauf (1) et (de manière équivalente) (4) peuvent être réduits à une condition selon laquelle les signes alphabétiques du triangle sont une rotation de
[1,1,-1,-1]
(où le signe de0
est0
)fireflame241 a noté que cela équivaut alors aux deltas des deltas des signes delta de l'alphabet dans
[[2,2],[2,-2],[-2,2],[-2,-2]]
lesquels on peut tester les valeurs absolues égales à[2,2]
!Comment?
la source
II
pour vérifier l’égalité avec une rotation de 1,1, -1, -1.Java 8,
23119318512210378 octetsEssayez ici.
-38 octets merci à @ dpa97 de m'avoir rappelé d'utiliser
char[]
plutôt queString
.-63 octets grâce à la formule dérivée de @KarlNapf .
-25 octets en le convertissant de Java 7 à Java 8 (et renvoyant maintenant un booléen au lieu d'un entier).
193 octets répondent:
Explication:
false
false
true
s’il est conforme à l’un d’eux (etfalse
sinon):1<2<3>4>5
(ieALPHA
)1>2<3<4>5
(c. -àEAGLE
,HARSH
,NINON
,PINUP
)1<2>3>4<5
(ieRULER
)1>2>3<4<5
(ieTHEFT
,WIDOW
)Ces quatre règles peuvent être simplifiées
1*3<0 and 2*4<0
(grâce à la réponse Python 2 de @KarlNapf ).la source
char[]
comme entrée à la place deString
. -38 octets grâce à vous.z,x
etw,y
doivent avoir un signe alternatif, il suffit donc de vérifierz*x<0
etw*y<0
JavaScript (ES6),
918987 octets2 octets sauvés grâce à Ismael Miguel
Comment ça marche
Nous construisons un masque binaire 4 bits
k
représentant les 4 transitions entre les 5 caractères de la chaîne:NaN
que le mot soit rejeté (pour se conformer à la règle 6)Les masques de bits valides sont ceux qui ont exactement deux
1
transitions consécutives (le premier et le dernier bits étant également considérés comme consécutifs ):En d'autres termes, ce sont les combinaisons qui sont:
k?
: supérieur à 0!(k%3)
: congru à 0 modulo 3Les autres conditions sont:
!s[5]
: il n'y a pas plus de 5 caractèress[0]==s[4]
: les 1er et 5ème caractères sont identiquesNB : Nous ne vérifions pas explicitement
k != 15
car tout mot suivant un tel motif sera rejeté par cette dernière condition.Cas de test
Afficher l'extrait de code
Version initiale
Pour mémoire, ma version initiale était de 63 octets. Il réussit tous les tests mais ne détecte pas de caractères identiques consécutifs.
Voici une version de 53 octets suggérée par Neil dans les commentaires, qui fonctionne (et échoue) tout aussi bien:
Edit: Voir la réponse de Neil pour la version corrigée / complétée du code ci-dessus.
la source
0000
est également congruent à 0 modulo 3 mais encore une fois, vous ne pouvez pas avoir les mêmes lettres, alors, comme 15, vous n'avez pas besoin de le tester explicitement.!((a>b)-(b>c)+(c>d)-(d>e))
?p<c?0:NaN
peut être écrit en tant que0/(p<c)
, ce qui enregistre 2 octets.k?
test à cause du possibleNaN
.) En ce qui concerne votre version alternative: cela devrait fonctionner.JavaScript (ES6), 78 octets
Basé sur le code incorrect de @ Arnauld, mais joué au golf et corrigé. Fonctionne en vérifiant d’abord que le premier caractère est identique au cinquième (garantissant ainsi 5 caractères) et que la longueur de la chaîne n’excède pas 5. Après vérification des caractères en double consécutifs, il reste à vérifier l’ondulation de la chaîne, qui devrait avoir un pic et un creux deux lettres à part.
Edit: Solution alternative à 78 octets basée sur la réponse de @ KarlNapf:
la source
Code de sortie Python 2, 56 octets
Sorties via le code de sortie: Erreur pour False et exécution réussie pour True.
Prend la chaîne
s
avec des caractèresabcde
, la fait pivoterbcdea
, effectue une comparaison élémentaire des caractères correspondants et les assigne à cinq variablesv,w,x,y,z
. La mauvaise longueur donne une erreur.Les mots de l'infini ont tous
qui peut être vérifié conjointement comme
v*x+w*y|z == -2
. La comparaison chaînéev*x+w*y|z>-2>_
court-circuite si c'est le cas, et sinon continue à évaluer-2>_
laquelle donne une erreur de nom.la source
Python 2,
1108760 octetsÉconomiser 1 octet grâce à Neil
Nécessite une entrée entre guillemets, par exemple
'KNEES'
True
s'il s'agit d'un mot infini,False
si ce n'est pas le cas et qu'il a une longueur de 5 et affiche un message d'erreur si la longueur est incorrecteInspiré par la réponse de xnor en utilisant
map(cmp...
solution précédente:
Utiliser la logique optimisée de Kevin Cruijssen
la source
a*c+b*d+2==0==e
?a*c+b*d|e
est encore plus court.<-1
pourrait fonctionner, puisque les deux-2|1
et-2|-1
égaux-1
.PHP, 102 octets
la source
Python 2, 71 octets
Prend la chaîne
s
avec des caractèresabcde
, la fait pivoterbcdea
et effectue une comparaison élémentaire des caractères correspondants.Le résultat est une liste de
-1, 0, 1
. Ensuite, vérifie si le résultat est l’une des séquences valides de hauts et de bas:tel que généré à partir du modèle
[m,n,-m,-n,0]
avecm,n=±1
. La dernière0
vérifie que la première et la dernière lettre sont égales, et la longueur garantit que la chaîne d'entrée a une longueur de 5.Une alternative 71. Vérifie les conditions relatives aux comparaisons tout en garantissant la bonne longueur.
la source
R, 144 octets
La réponse est basée sur la logique de Jonathan Allan. Cela pourrait probablement être joué au golf.
Cas de test R-fiddle (exemple vectorisé mais même logique)
la source
length(s)==5
, vous pouvez le remplacers[1]==tail(s,1)
pars[1]==s[5]
. Une méthode plus courte d'un octet pour vérifier la longueur estis.na(s[6])
. Ensemble, ces deux modifications retournentTRUE
pour unes
longueur de 5 exactement etFALSE
sinon, telTRUE&NA
quelNA
maisFALSE&NA
estFALSE
. Vous pouvez également sauvegarder quelques octets en remplaçant!sum(sign(d))&any(rle(sign(d))$l>1)
par!sum(a<-sign(d))&any(rle(a)$l>1)
.GNU Prolog, 47 octets
Définit un prédicat
i
qui réussit (un nombre infini de fois, en fait) pour un mot infini, produisant ainsi "oui" lorsqu'il est exécuté depuis l'interpréteur (comme d'habitude pour Prolog); échoue pour un mot candidat dont les première et dernière lettres ne correspondent pas ou ne compte pas 5 lettres, générant ainsi «non» lorsqu'il est exécuté à partir de l'interprète; et se bloque avec un débordement de pile si on donne un mot candidat qui n'est pas un mot infini, mais qui est composé de cinq lettres avec les deux premières et dernières correspondantes. (Je ne suis pas sûr pourquoiil se bloque; l'appel récursif doit pouvoir être traité comme un appel d'urgence. Apparemment, l'optimiseur de GNU Prolog n'est pas très bon.) Réussir équivaut à la vérité de Prolog, et échouer à l'équivalent de Falsey; un crash est définitivement plus un falsey que une vérité, et le corriger allongerait considérablement la solution, aussi, j’espère que cela compte comme une solution valable.L'algorithme est assez simple (et en effet, le programme est assez lisible); vérifiez si les lettres forment l'un des quatre motifs formant un mot infini, sinon, permutez-les cycliquement et réessayez. Nous n'avons pas besoin de vérifier explicitement les doubles lettres, car les opérateurs
<
and>
nous laissent implicitement vérifier cela en même temps que nous vérifions la correspondance des deltas.la source
En fait ,
3827 octetsCette réponse a été largement inspirée par l'excellente réponse de Jonathan Allan sur Jelly . Il y a probablement plusieurs endroits où cela peut être joué au golf, alors vos suggestions sont les bienvenues! Essayez-le en ligne!
Ungolfing
la source
APL (Dyalog) ,
1615 octetsEssayez-le en ligne!
la source
TI-BASIC, 81 octets
La chaîne à passer dans le programme est en Ans. Retourne (et affiche implicitement) 1 si le mot entré est un mot infini et 0 (ou quitte avec un message d'erreur) s'il ne l'est pas.
Erreurs sur des caractères répétés ou des mots autres que 5 lettres.
la source
05AB1E , 16 octets
Port de @JonathanAllan réponse gelée de .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source