Cette compétition est terminée.
Le gagnant est CJam avec 22 caractères, battant la réponse de TwiNight par un caractère. Félicitations Dennis !
Une mention honorable va à Falko , qui est devenu complètement fou avec les importations gratuites.
.
Il y a quelque temps, je voulais savoir comment surpasser les smartphones modernes avec mon Nokia 3310, et même si certaines réponses étaient vraiment bonnes, je n'arrive toujours pas à suivre! Je devrais peut-être adopter une approche différente et ne pas écrire de mots difficiles à taper.
Nous appellerons un morceau de texte facilement saisissable s'il n'y a pas deux lettres consécutives sur le même bouton du clavier du téléphone, étant donné la disposition standard:
Ta tâche
Votre tâche consiste à écrire un programme / une fonction qui accepte une chaîne s
de stdin / comme paramètre et renvoie une valeur véridique si elle s
est facilement typable et une valeur falsifiée dans le cas contraire. L'entrée se composera uniquement de lettres minuscules et d'espaces et est garantie d'être non vide!
Notation
Il s'agit de codegolf, donc le nombre de caractères le plus bas l'emporte.
Les instructions d'importation ne seront pas prises en compte pour votre score final, donc si vous avez toujours voulu utiliser std::set_symmetric_difference
, liftM4
ou itertools.combinations
dans votre code, est maintenant le temps!
-3 si votre code source est facilement saisissable, en supposant que tout ce qui n'est pas une lettre est sur le bouton 0. Après tout, je pourrais vouloir envoyer votre code à des amis!
Cas de test
Voici quelques tests pour vérifier si votre code fonctionne comme prévu:
"x" -> True
"aardvark" -> False
"ardvark" -> True
"flonk" -> False
"im codegolfing all day long" -> False
"i indulge in minimizing bytecount" -> True
"havent heard from you in a long time" -> False
"your silence was of undue permanence" -> True
"how are you" -> False
"how are you" -> True
Bon golf!
Réponses:
CJam,
34312722 caractèresEssayez-le en ligne.
Exemple d'exécution
Comment ça marche
Contexte
Le cœur du code consiste à appliquer une mappe F à chaque caractère C de la chaîne d'entrée afin que les images des symboles sur la même clé correspondent. J'ai trouvé la carte appropriée en observant ce qui suit:
La carte T: C ↦ (C - 'h') + 13 transforme la chaîne S: = "abcdefghijklmnopqrstuvxyz" comme suit:
Pour les touches 0de 6, il suffirait de diviser T (C) par 3 , mais nous devons appliquer une sorte de correction aux caractères de s , t , v , y et z .
La carte D: C ↦ (C - 'h') / 9 transforme la chaîne S dans le tableau suivant:
Cela corrige les quotients de s , t , v , y et z , sans affecter les autres.
Enfin, la carte F: C ↦ (T (C) - D (C)) / 3 transforme la chaîne S comme suit:
Il ne reste plus qu'à comparer les personnages consécutifs d'une manière ou d'une autre. Pour cela, nous XOR F (C) avec l'image du caractère précédent - pour le premier, nous XOR F (C) avec 1 (valeur par défaut de la variable X ), qui n'a pas de pré-image - et multiplions tous les résultats.
Le produit sera falsy si et seulement si l' un des facteurs est égal à zéro, à savoir, si et seulement si deux caractères consécutifs ont la même image par F .
la source
Python 2 -
80, 68, 64, 61, 58, 50, 48, 45, 4442Même si cela devient un peu ridicule maintenant, je continuerai à utiliser les importations de bibliothèque gratuites, même la
__builtin__
bibliothèque:Ainsi, seule la ligne courte suivante compte pour la longueur du code:
Remerciements à Markuz pour les idées concernant
input()
! Ces défis d'importation gratuite vous présentent toujours des bibliothèques moins connues. ;)Alternative utilisant uniquement la
operator
bibliothèque (98, 8379):Je m'arrête ici. Mais vous pouvez approfondir cette version en utilisant
sys
,pprint
et d'autres bibliothèques ...Alternative sans bibliothèques (105):
la source
ord(c)
à une variable (disonso
) puis en soustrayantc/112
etc/119
au lieu des booléens?lambda
expressions aussi facilement. Avec[(o-1-o/112-o/119)/3for o in map(ord,s)]
je me retrouve avec 80 octets à nouveau.from sys import argv as s
, en utilisants[1]
au lieu deinput()
input
partir__builtin__
de ainsi est en fait encore mieux: D économiser encore un autre octet.RubyRegex (saveurs les plus populaires),10683 octetsParce que regex
Je viens de couper l'intermédiaire (Ruby) et en ai fait une solution pure-regex. Fonctionne dans beaucoup de saveurs et ne trouve une correspondance que si la chaîne ne contient pas deux caractères consécutifs sur le même bouton.
la source
{2}
dehors de l'alternance, économisant 22 octets?Bash + coreutils, 49
Renvoie un code de sortie de 1 pour VRAI et de 0 pour FAUX:
la source
perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")
il affiche 1 pour vrai et rien pour faux.aaadddgggjjjmmmpppptttwwww
mais j'ai abandonné.11122233344455566667778888
fera l'affaire. En base 36 codant les 19 premiers chiffres de ce nombre, nous pouvons économiser 1 caractère!APL (Dyalog),
2423Explication
⍞
: Prend l'entrée de chaîne de l'écran⎕AV
: C'est le vecteur atomique qui est fondamentalement une chaîne de tous les caractères reconnus par APL, qui comprend bien sûr toutes les lettres minuscules (index 18 ~ 43) et l'espace (index 5)⍳
:IndexOf
fonction. Pour de nombreuses fonctions dans APL qui prennent un ou deux arguments scalaires, vous pouvez lui fournir un tableau à la place d'un scalaire - APL fera la boucle pour vous.⍳
Retourne donc un tableau numérique d'indices..21-.31×
: Fois 0,31 puis soustraire de 0,21. C'est une petite astuce qui mappe une lettre sur la même clé (en particulier PQRS) au même nombre (lorsqu'il est arrondi à des entiers), sauf Z, qui est mappé à son propre groupe¯13⌈
:max
avec -13. Cela ramène Z au groupe avec WXY⌊
: Arrondir aux nombres entiers2≠/
: Pairwise-≠
. Renvoie un tableau booléen pour chaque paire consécutive.∧/
: ET ensemble toutes les entrées du tableau résultant.la source
∧/2≠/
(toutes les paires consécutives sont tapées sur des touches différentes) au lieu de~∨/2=/
(aucune paire consécutive n'est tapée sur la même touche.) APL FTW !!!Perl - 44
Il s'agit essentiellement d'une adaptation Perl de la réponse de @ DigitalTrauma publiée avec sa permission. Rasé 2 caractères grâce à @KyleStrand.
43 caractères + 1 pour le
-p
drapeau.y///
est le même quetr///
. Il imprime1
pour le vrai et rien pour le faux. Je peux poster une explication détaillée sur demande.Exemple d'exécution:
Perl - 81
+1 pour le
-n
drapeau. Il fonctionne en utilisantjoin
pour créer l'expression régulière (la même que celle de Martin ), qui rase de quelques octets.Exemple d'exécution:
la source
a
et enz
restant non traduits?y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/
De plus, cela ne gérera pas les espaces, n'est-ce pas?a
etz
reste le même. Réponse mise à jour!JavaScript -
159156octetsRenvoie 1 pour la vérité et 0 pour la fausse.
Si seulement je pouvais me débarrasser des mots-clés.
la source
function g(s){p=n=-1;for(i=0;i<s.length;i++){p=n;n=s.charCodeAt(i)-97;n>17&&n--;n>23&&n--;if(~p)continue;if(~(p/3)==~(n/3))return 0}return 1}
!=
dans la boucle for par un<
.c, 74 octets
Renvoie un état de sortie non nul pour TRUE et 0 pour FALSE:
la source
while
enfor(;c=~getchar();d=c/3)
, et un autre octet en changeant votre premierif
en?:
opérateur.c=getchar()
sont cependant nécessaires car elles~
ont une priorité plus élevée que=
. Pourtant, je vais prendre les deux autres octets :)exit(d!=c/3);
au lieu deif(d==c/3)exit(0);
fonctionner?Ruby 1,8,
89838178 octetsVoici une autre soumission. À ma honte, il bat le regex. :(
Cela prend la chaîne via un argument de ligne de commande et affiche un booléen.
En ce qui concerne l'algorithme, je décale les lettres après
p
par une et aprèsz
par deux, puis je vérifie qu'il n'y a pas de collisions après la division entière par 3.PS: C'est la première fois que l'utilisation de Ruby 1.8 raccourcit le code (en raison de la manière plus courte d'obtenir les codes de caractères).
la source
Cobra - 80
la source
JavaScript (ES6) 66
74La boucle intérieure trouve le groupe pour chaque personnage. Conceptuellement, c'est une «réduction», mais une «carte» est plus courte. La boucle externe compare le groupe de caractères consécutifs et les sorties avec false si elles sont égales.
Tester dans la console Firefox / Firebug
Sortie
la source
.some
au lieu de tout. Parce que même s'il échoue une fois, la réponse est fausse.some
etevery
sont interchangeables, jouant avec les conditions. Mais ici, simplement mettresome
au lieu deevery
ne fonctionnera pas, essayez-le.[...s].every
astuce dans mes golfs :)Perl, 83 octets
Faire de gros abus de $ _ en Perl.
la source
-e
en Perl, est libre.) 71 caractères de remplacement avec des paramètres de ligne de commande:perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'
.-l
, mais ça a l'air bien!-l
en remplacement dechop
. Mais bien sûr, vous avez raison.Deux tâches sont délicates en Python; détecter les chaînes et attribuer les groupes. Les deux peuvent être assistés à l'aide de numpy, mais ce n'est pas dans la bibliothèque standard.
Python 2 (uniquement bibliothèque standard) - fonction 59 caractères
Python 2 (uniquement bibliothèque standard) - 53 caractères stdin pour quitter la valeur
Ici, j'abuse du fait que
issubclass(bool,int)
, donc changerall()
pourany()
obtenir une valeur de sortie valide, rasernot()
la valeur de retour. La suppression de la surcharge de fonction a fait prendre du retard aux versions regex.la source
J - 42 caractères
Fonction prenant la chaîne à droite.
Tout d'abord, nous mappons l'alphabet (
u:97+i.26
) sur les chiffres de 0 à 25, tous les autres caractères (y compris les espaces) allant à 26 (i.
). Ensuite, nous mappons ({~
) les trois premiers éléments mappent à la première clé, les trois suivants à la clé suivante, et ainsi de suite à travers les touches du clavier du téléphone, en veillant à mapper l'espace / autre ponctuation à une clé distincte à la fin . (4 3 4 1,~5#3
est égal à3 3 3 3 3 4 3 4 1
et leI.
transforme en un tableau de 27 éléments où les trois premiers sont la clé 1, etc.) Ensuite, nous vérifions l'inégalité par paire (2~:/\
) et ET tous les résultats ensemble (*/
).la source
Raquette, 119
Non golfé (regexing combinatoire):
la source
JavaScript - 152
Pas un gagnant mais je lui ai donné un coup de feu. Beats @Lozzaaa de 4 octets au moment de la publication :)
Réussit tous les tests.
Profite du manque de typage de JS pour créer un tableau multi-types et profite de l'indexOf renvoyant -1 pour la prise en charge de l'espace.
Usage:
Suppose des caractères alphabétiques en minuscules et des espaces uniquement. Renvoie 1 pour vrai, 0 pour faux.
Peut-être que si je connaissais ES6, je pourrais essayer le deuxième défi ...
la source
ES6, JavaScript
8970 caractèresJe sais que ce n'est pas un gagnant parce que quand il s'agit d'opérations pratiques comme obtenir la valeur ASCII du caractère, JS met beaucoup de ballonnement (
.charCodeAt()
).Exécutez-le dans la console Web de la dernière version de Firefox.
Usage:
La fonction renvoie true ou false.
EDIT : Golfé beaucoup en utilisant le
[...x].every
truc appris de @ edc65 (Merci!)Je vais essayer de jouer au golf plus :)
la source
GML (Game Maker Language), 149
la source
Python 3 - 152 caractères
Pas le plus court possible, mais ça suffira pour l'instant
la source