J'ai eu spontanément l'idée de créer une série de défis d'utilisateurs qui ont aidé et continuent d'aider la communauté des PPCG à devenir un lieu agréable pour tous, ou peut-être plus précisément pour moi. : P
Si vous convertissez le nom de Dennis en un tableau de 1
s et 0
s où chaque consonne 1
et chaque voyelle sont 0
, le tableau [1, 0, 1, 1, 0, 1]
est symétrique. Votre défi consiste donc à déterminer quels autres noms sont comme ceci.
Défi
Avec une chaîne ASCII, supprimez tous les caractères qui ne sont pas des lettres et déterminez si la configuration des voyelles et des consonnes est symétrique. y
n'est pas une voyelle.
Veuillez noter que votre programme ne doit pas nécessairement être ce type de chaîne lui-même.
Cas de test
Dennis -> truthy
Martin -> truthy
Martin Ender -> truthy
Alex -> falsy
Alex A. -> truthy
Doorknob -> falsy
Mego -> falsy
Mise en oeuvre de référence
Ce code Python 3 donnera la sortie correcte à partir d’un scénario de test. Il est aussi non-golfé que je pourrais le faire sans être ridicule.
Python 3
s = input()
l = []
for c in s:
if c in 'AEIOUaeiou':
l.append(0)
elif c in 'BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz':
l.append(1)
print(l == list(reversed(l)), end = '')
la source
Réponses:
05AB1E , 9 octets
Essayez-le en ligne!
-2 grâce à Adnan .
Cela attaque le point de douleur de Jelly exactement. Il utilise
l
etA
, des équivalents sur 1 octet pour JellyŒl
etØa
respectivement.la source
AÃ
pará
etDR
parÂ
.á
, je ne savais pas quoiÂ
, merci!00
àFF
ces 256 caractères, voir la réponse JellyGelée , 11 octets
Essayez-le en ligne!
Versions alternatives:
Bien sûr, un défi appréciant Dennis doit avoir une réponse dans une langue à lui.
la source
Fonction de code machine x86 32 bits,
42 à41 octetsActuellement, la réponse la plus courte dans une langue autre que le golf est 1B plus courte que q / kdb + de @ streetster .
Avec 0 pour la vérité et non nul pour la fausseté:
41 à40 octets. (en général, enregistre 1 octet pour 32 bits, 2 octets pour 64 bits).Avec des chaînes de longueur implicite (style C terminé par 0):
4544 octetsCode machine x86-64 (avec pointeurs 32 bits, comme l’ABI x32):
4443 octets .x86-64 avec des chaînes de longueur implicite, toujours 46 octets (la stratégie de bitmap décalage / masque est équilibrée à présent).
Ceci est une fonction avec la signature C
_Bool dennis_like(size_t ecx, const char *esi)
. La convention d'appel est légèrement non standard, proche de MS vectorcall / fastcall mais avec des registres arg différents: string dans ESI et la longueur dans ECX. Il ne fait que clobber ses arg-regs et EDX. AL conserve la valeur de retour, avec les octets élevés contenant des déchets (comme le permettent les ABI SysV x86 et x32. IDK ce que les ABI de MS disent à propos des déchets élevés lors du renvoi de nombres entiers bool ou étroit).Explication de l'algorithme :
Boucle sur la chaîne d'entrée, filtrage et classification en un tableau booléen sur la pile: pour chaque octet, vérifiez s'il s'agit d'un caractère alphabétique (sinon, passez au caractère suivant) et transformez-le en entier de 0 à 25 (AZ) . Utilisez cet entier 0-25 pour vérifier un bitmap de voyelle = 0 / consonne = 1. (Le bitmap est chargé dans un registre en tant que constante immédiate 32 bits). Poussez 0 ou 0xFF sur la pile en fonction du résultat bitmap (en fait, dans l'octet de poids faible d'un élément 32 bits, ce qui peut avoir des défauts dans les 3 premiers octets).
La première boucle produit un tableau de 0 ou 0xFF (dans les éléments dword complétés avec garbage). Effectuez la vérification palindrome habituelle avec une deuxième boucle qui s’arrête lorsque les pointeurs se croisent au milieu (ou quand ils pointent tous deux vers le même élément s’il existe un nombre impair de caractères alphabétiques). Le pointeur qui se déplace vers le haut est le pointeur de la pile et nous utilisons POP pour charger + incrémenter. Au lieu de comparer / setcc dans cette boucle, nous pouvons simplement utiliser XOR pour détecter same / different puisqu'il n'y a que deux valeurs possibles. Nous pourrions accumuler (avec OR) si nous avons trouvé des éléments non correspondants, mais une branche précurseur sur les drapeaux définis par XOR est au moins aussi bonne.
Notez que la seconde boucle utilise la
byte
taille de l'opérande, elle ne tient donc pas compte de ce que la première boucle laisse en dehors de l'octet de poids faible de chaque élément du tableau.Il utilise l' instruction non documentée
salc
pour définir AL à partir de CF, de la même manièresbb al,al
. Il est pris en charge sur tous les processeurs Intel (sauf en mode 64 bits), même dans Knight's Landing! Agner Fog en indique également le minutage sur tous les processeurs AMD (y compris Ryzen). Par conséquent, si les fournisseurs x86 insistent pour bloquer cet octet d'espace disque depuis 8086, nous pourrions également en profiter.Trucs intéressants:
bt
, inspiré par quelques bons résultats du compilateur pourswitch
.stosb
.cmp
/salc
n’est pas une option, carsalc
ne fonctionne que pour CF, et 0xFF-0 ne définit pas CF.sete
est de 3 octets, mais éviterait l’inc
extérieur de la boucle, pour un coût net de 2 octets (1 en mode 64 bits )) vs xor dans la boucle et le réparer avec inc.C’est probablement aussi l’une des réponses les plus rapides, puisqu’aucune partie du golf ne fait vraiment mal, du moins pour les chaînes de quelques milliers de caractères où l’utilisation de la mémoire 4x ne cause pas beaucoup de pertes de mémoire cache. (Il pourrait aussi perdre des réponses qui prennent une précoce pour non-Dennis comme des chaînes avant en boucle sur tous les caractères.)
salc
Est plus lent quesetcc
sur plusieurs unités centrales (par exemple 3 uops contre 1 sur Skylake), mais un contrôle bitmap avecbt/salc
est toujours plus rapide qu'une recherche de chaîne ou une correspondance de regex. Et comme il n’ya pas de frais généraux de démarrage, c’est donc extrêmement économique pour les chaînes courtes.Le faire en une passe à la volée impliquerait de répéter le code de classification pour les directions montante et descendante. Ce serait plus rapide mais une plus grande taille de code. (Bien sûr, si vous voulez aller vite, vous pouvez faire 16 ou 32 caractères à la fois avec SSE2 ou AVX2, en utilisant toujours l’astuce de comparaison en décalant l’échelle vers le bas de l’étendue signée).
Programme de test (pour ia32 ou x32 Linux) pour appeler cette fonction avec un argument cmdline, et quitter avec status = valeur de retour.
strlen
implémentation de int80h.org .Une version 64 bits de cette fonction pourrait utiliser
sbb eax,eax
, qui n’est que 2 octets au lieu de 3 poursetc al
. Il faudrait également un octet supplémentaire pourdec
ounot
à la fin (car seul 32 bits a un octet inc / dec r32). En utilisant l'ABI x32 (pointeurs 32 bits en mode long), nous pouvons toujours éviter les préfixes REX même si nous copions et comparons des pointeurs.setc [rdi]
peut écrire directement dans la mémoire, mais réserver des octets ECX d’espace de pile coûte plus de taille de code que ce qui est économisé. (Et nous devons nous déplacer dans le tableau de sortie.[rdi+rcx]
Prend un octet supplémentaire pour le mode d'adressage, mais nous avons réellement besoin d'un compteur qui ne soit pas mis à jour pour les caractères filtrés, ce qui sera pire que cela.)C'est la source YASM / NASM avec des
%if
conditions. Il peut être construit avec-felf32
(code 32 bits) ou-felfx32
( code 64 bits avec l'ABI x32), et avec une longueur implicite ou explicite . J'ai testé les 4 versions. Voir cette réponse pour un script permettant de créer un binaire statique à partir d'une source NASM / YASM.Pour tester la version 64 bits sur un ordinateur ne prenant pas en charge l'interface ABI x32, vous pouvez modifier les paramètres de pointeur sur 64 bits. (Ensuite, soustrayez simplement le nombre de préfixes REX.W = 1 (0x48 octets). Dans ce cas, 4 instructions nécessitent des préfixes REX pour fonctionner sur des registres 64 bits). Ou appelez-le simplement avec le
rsp
et le pointeur d'entrée dans la 4G basse de l'espace d'adressage.J'ai regardé déconner avec DF (le drapeau de direction qui contrôle
lodsd
/scasd
et ainsi de suite), mais cela ne semblait pas être une victoire. Les ABI habituelles requièrent que DF soit effacé à l’entrée et à la sortie de la fonction. En supposant que l’entrée soit effacée à l’entrée mais qu’elle reste réglée à la sortie, ce serait de la triche, IMO. Il serait bien d’utiliser LODSD / SCASD pour éviter les 3 octetssub esi, 4
, en particulier dans les cas où il n’ya pas de déchets élevés.Stratégie de bitmap alternative (pour les chaînes de longueur implicite x86-64)
Il s'avère que cela ne sauvegarde aucun octet, car
bt r32,r32
il fonctionne toujours avec un niveau élevé de garbage dans l'index de bits. Ce n'est pas documenté comme çashr
.Au lieu d’
bt / sbb
obtenir le bit dans / hors de CF, utilisez un décalage / masque pour isoler le bit souhaité du bitmap.Puisque ceci produit 0/1 en AL à la fin (au lieu de 0 / 0xFF), nous pouvons faire l’inversion nécessaire de la valeur de retour à la fin de la fonction avec
xor al, 1
(2B) au lieu dedec eax
(également 2B dans x86-64) pour toujours produire une valeur correctebool
/ de_Bool
retour.Cela permettait de sauvegarder 1B pour x86-64 avec des chaînes de longueur implicite, en évitant la nécessité de mettre à zéro les octets de poids fort de EAX. (J'avais l'habitude
and eax, 0x7F ^ 0x20
de forcer à mettre en majuscule et à zéro le reste de eax avec un 3 octetsand r32,imm8
. Mais maintenant, j'utilise le codage à 2 octets immédiat-avec-AL que la plupart des instructions 8086 ont, comme je le faisais déjà. pour lesub
etcmp
.)Il perd en
bt
/salc
en mode 32 bits et les chaînes de longueur explicite ont besoin de ECX pour le décompte, de sorte que cela ne fonctionne pas là non plus.Mais ensuite, j'ai réalisé que j'avais tort: je
bt edx, eax
travaille toujours avec des déchets très élevés dans eax. Apparemment, cela masque le compte de décalage de la même manièreshr r32, cl
(en ne regardant que les 5 bits les plus bas de cl). Ceci est différent debt [mem], reg
ce qui peut accéder en dehors de la mémoire référencée par le mode / taille d'adressage, en le traitant comme une chaîne de bits. (Crazy CISC ...)Le manuel insn set ref d'Intel ne documente pas le masquage. Il s'agit donc peut-être d'un comportement non documenté qu'Intel préserve pour le moment. (Ce genre de chose n'est pas rare.
bsf dst, src
Avec src = 0, dst reste toujours non modifié, même s'il est documenté de laisser dst détenir une valeur indéfinie dans ce cas. AMD documente le comportement de src = 0.) J'ai testé sur Skylake et Core2, et labt
version fonctionne avec des ordures non nulles dans EAX en dehors de AL.Une astuce intéressante consiste à utiliser
xchg eax,ecx
(1 octet) pour obtenir le nombre dans CL. Malheureusement, BMI2shrx eax, edx, eax
est de 5 octets, contre seulement 2 octets pourshr eax, cl
. L'utilisationbextr
nécessite 2 octetsmov ah,1
(pour le nombre de bits à extraire), donc encore 5 + 2 octets comme SHRX + AND.Le code source est devenu assez compliqué après l’ajout de
%if
conditions. Voici le désassemblage des chaînes de longueur implicite x32 (en utilisant la stratégie alternative pour le bitmap, donc il reste 46 octets).La principale différence par rapport à la version à longueur explicite réside dans la première boucle. Remarquez comment il y a un
lods
avant, et au bas, au lieu d'un seul en haut de la boucle.la source
La rétine ,
49 4745 octetsEssayez-le en ligne!
2 octets sauvés grâce à Neil.
Sauvé encore 2 octets grâce à Martin.
Supprime les non-lettres puis remplace les voyelles par 1 et les consonnes par 2 pour obtenir des valeurs cohérentes. Ensuite, supprime à plusieurs reprises le premier et le dernier caractère s’ils sont identiques. Une fois qu'ils ne le sont pas, le mot était symétrique s'il ne reste qu'un ou zéro caractères.
la source
\D
2
marche pour vous sauver quelques octetsT`lL`2
?PHP, 82 octets
Essayez-le en ligne!
la source
(bool)
et supprimer le$s=
et la==$s
vérification pour enregistrer 1 octet.(bool)
avec juste0||
pour dire faux, ou… à la place, en sauvegardant 3 octets supplémentaires.\w
pour mot caractères au lieu dea-z
?\w
contient des caractères de soulignement et des lettres. Cela ne fonctionnera pas et[^/p{L}]
est plus long que[^a-z]
plus i. Je compare la chaîne inverse avec la chaîne, donc il$s
faut créer le booléenMATL, 14 octets
Essayez-le sur MATL Online .
Voici une version légèrement modifiée pour vérifier tous les cas de test.
Explication
la source
Haskell,
84757469 octets-10 grâce à @nimi
-5 grâce à @Zgarb
La compréhension de la liste remplace chaque lettre par un booléen et supprime tous les autres caractères. La première partie vérifie si la liste résultante est un palindrome.
Essayez-le en ligne!
la source
filter
suivie parmap
même si vous devez passer à non-poitfree. 2) Le<$>id
est superflu.f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,c
elem['A'..'Z']++['a'..'z']]
.c
et"
pour un octet supplémentaire.c`elem`['A'..'Z']++['a'..'z']
peut être raccourci à'@'<c,c<'{','`'<c||c<'['
Pyth,
18 à15 octetsEssayez ici.
-2 grâce à KarlKastor , puis -1.
la source
_I/L"aeiou"@Grz0
(utilisant l'opérateur d'invariance I)z
aussi, je vais supposer les commentaires cités)Brachylog , 13 octets
Essayez-le en ligne!
Explication
la source
Alice , 28 octets
Essayez-le en ligne!
Sorties en
1
tant que vérité et rien en tant que fausseté.Explication
Chaque commande de ce programme s'exécute en mode ordinal, mais avec une légère torsion dans le modèle qui me permet de sauvegarder un octet. Si une nouvelle ligne est une valeur de vérité acceptable, je peux enregistrer un octet de plus par la même méthode.
Linéarisé, le programme est le suivant:
la source
Python 3 ,
7271 octets-1 octet grâce à @ovs
Essayez-le en ligne!
la source
def f(s):s=[c in'AEIOU'for c in s.upper()if'@'<c<'['];return s==s[::-1]
pour 71 octetsJavaScript (ES6),
7269 octets3 octets sauvés grâce à Neil
Retourne un booléen.
Cas de test
Afficher l'extrait de code
la source
2
.+''
à la fin? Cela économiserait 3 octets à la place.Mathematica, 113 octets
la source
PalindromeQ@StringReplace[#,{Characters@"aeiouAEIOU"->"1",LetterCharacter->"0",_->""}]&
GolfScript , 42 octets
Essayez-le en ligne!
La partie difficile consiste à générer l’alphabet en majuscule et en minuscule dans une chaîne, que nous utiliserons dans une fonction de filtrage pour filtrer les lettres hors de l’entrée. Heureusement, étant donné que les chaînes dans GolfScript ne sont que des tableaux de points de code dotés d'une propriété spéciale, nous pouvons donc générer les points de code de manière efficace. Voici comment nous les générons:
Tout d'abord, nous générons la plage [0..122], 122 étant le codepoint pour
z
. Ensuite, nous prenons les éléments de l'élément à partir de l'indice 65. 65 est le codepoint pourA
. À l'heure actuelle, nous avons [65..122]. Tout va bien, sauf que nous avons quelques codes codés indésirables ([91..96]). Donc, nous faisons d’abord une copie de cette gamme. Ensuite, nous prenons les éléments à partir de l'index 26, et nous avons [91..122]. Après cela, nous obtenons les éléments jusqu’à l’index 5 inclus. Nous avons maintenant [91..96]. Enfin, nous retirons ces éléments de notre [65..122], nous laissant ainsi [65..90, 97..122]. Ce sont les codes que nous voulons.Maintenant que nous avons créé la liste des points de code de l'alphabet supérieur / inférieur, nous continuons notre fonction de filtrage. La fonction est mappée sur chaque caractère de la chaîne d'entrée qui, comme je l'ai dit au début, est analysé comme son code-point à la place. Alors maintenant, nous avons essentiellement
[codepoint, [65..90, 97..122]]
. Pour savoir si le caractèrecodepoint
est une lettre, il suffit de prendre son index dans la liste que nous avons créée. Si ce n'est pas là, nous aurons-1
comme index.À l'heure actuelle, nous obtenons une valeur de falsey uniquement si
codepoint == 65
, c'est-à-dire le premier index de notre liste, car alors seulement, il serait 0. Mais un incrément unique résoudra ce problème et, s'ilcodepoint
est dans notre liste, nous le ferons. obtenir son indice + 1, qui est toujours un nombre positif, donc toujours une vérité, alors que s'il n'est pas là, on aura -1 + 1 = 0, c'est-à-dire Falsey.Nous appliquons enfin la fonction que j'ai décrite à chaque caractère de l'entrée, et nous prenons uniquement les caractères pour lesquels la fonction a renvoyé un résultat de vérité.
Ensuite, nous devons déterminer si chaque caractère est une voyelle ou une consonne. Comme les voyelles sont moins nombreuses que les consonnes, créer une chaîne de voyelles afin de vérifier si cette condition est plus courte que de créer une chaîne de consonnes, nous vérifions donc si chaque caractère est une voyelle. Mais, pour vérifier si la liste booléenne est palindromique, nous avons besoin de booléens, que nous ne obtenons pas simplement en prenant l'index + 1, car cela peut donner un nombre quelconque de [1..10] si le caractère est une voyelle. Et, comme la plupart des langues de golf, celle-ci n’a pas non plus de
bool
fonction. Donc, nous utilisons simplementnot not x
, puisquenot
retourne toujours un booléen. Mais attendez; Avons-nous vraiment besoin d'avoir des booléens spécifiques? Puisquenot
retourne toujours un booléen, pourquoi ne pas simplement enlever le secondnot
et vérifie réellement si chaque caractère est une consonne? Oui, c'est exactement ce que nous allons faire!Après la vérification, qui renvoie une liste de booléens, nous vérifions si cette liste booléenne est un palindrome, ce que ce défi nous demande de faire. Eh bien, quelle est la définition d'un palindrome? Oui, un palindrome est une liste ou une chaîne égale à son inverse. Alors, comment vérifions-nous? Simple, nous le dupliquons, prenons son revers et vérifions par rapport à la liste originale. Le résultat obtenu est, enfin , ce que notre code devrait renvoyer.
la source
PHP , 87 octets
Regex version gratuite de PHP. Ajout d'une "voyelle" puisque les stripos peuvent retourner 0, ce qui est faux en PHP.
Faille corrigée par Jörg.
Essayez-le en ligne!
la source
for(;a&$c=$argn[$p++];)ctype_alpha($c)?$s.=stripos(_aeiou,$c)?0:1:0;echo$s==strrev($s);
mais il donne le bon résultat pour les chaînes contenant zéroq / kdb +,
4238 octetsSolution:
Exemple:
Explication:
Modifications:
reverse
pour k équivalent|:
la source
CJam , 26 octets
Essayez-le en ligne!
-1 grâce à Esolanging Fruit .
la source
26,'af+
par'{,97>
pour sauvegarder un octet.Braingolf,
43 octets-1 octet grâce à Erik l'Outgolfer
Il se trouve que j'avais
P
tout le temps, même avant ce défi.J
cependant, bien qu’il ait été créé avant ce défi, n’a pas été poussé à github avant le défi, il n’est donc pas compétitif.Explication:
la source
n
?Alex A.
?Python 2, 83 octets
Définit une fonction qui donne
True
ouFalse
la source
"aeiouAEIOU".__contains__
place delambda y:y.lower()in"aeiou"
.CJam , 79 octets
Première fois! (J'ai fait ce que j'ai pu)
Essayez-le en ligne!
la source
Python 3 ,
928774726968 octetsEssayez-le en ligne!
la source
for c in s
s
variable en remplaçants
sur la deuxième ligne parinput().lower()
Ruby, 57 octets
Essayez-le en ligne!
la source
Bash , 82 octets
Essayez-le en ligne!
Recives nomme en paramètre, supprime les non-leters, remplace les voyelles par 0, les non-voyelles ni 0 par 1 et compare avec les mêmes inverses.
Peut-on en jouer un peu plus si on peut se mettre au travail en double ou en triple substitution
Le statut de sortie est 0 pour vrai et 1 pour non.
la source
i=${i^^*};
convertiti
en majuscule. Mais je pense que cela vous épargne una-z
anaeiou
, ce qui est inférieur au 10B que cela coûte.Japt v2.0a0,
1911 octetsEssayez-le en ligne
Explication
la source
APL (Dyalog) ,
3433 octetsEssayez-le en ligne!
Golf en cours.
la source
819⌶⍨∘1
(⊢≡⌽)
PowerShell, 108 octets
la source
Axiome, 126 octets
tester
la source
Pyke, 12 octets
Essayez-le ici!
la source
PowerShell, 87 octets
Obtenir une copie de la chaîne où les voyelles sont 0 et les consonnes 1, tous les caractères spéciaux supprimés, comparer cette chaîne à une version inversée reliée à une chaîne
Sortie:
la source
Retina , 47 octets
Essayez-le en ligne!
Ceci est juste une approche différente pour les caractères non alphabet
la source