Insipides et autres insectes

52

Certaines versions de l'application de calculateur Android standard vous permettent d'appuyer sur une touche, telle que "sin", puis sur la touche "del" pour la définir "si". Probablement juste un bug qu'ils ne peuvent pas être dérangés de supprimer.

Capture d'écran de la calculatrice Android

Les lettres / groupes de lettres suivants sont typables:

 

péché
si
s
cos
co
c
bronzer
ta
t
dans
l
bûche
lo
e

Donc, "insipide" est typable, parce que ta-steless et donc "sabots" parce que "c-log-s". Cependant, 'got' n'est pas typable, ni 'an' ni 'xyz'.

Ecrivez un programme qui accepte un seul mot (ou une séquence de lettres, uniquement une entrée en z) et génère une sortie pour indiquer si un mot est typable ou non.

La sortie peut être un seul caractère / lettre / chiffre / etc. ou il peut être plus grand. Tous les mots typables doivent produire le même résultat. Tous les mots non typables doivent également produire le même résultat.

Post-scriptum Juste par curiosité, "sans goût" est-il le plus long terme du dictionnaire typable?

ghosts_in_the_code
la source
1
Soyons clairs: nous affichons un seul chiffre ou une lettre cohérent de notre choix pour indiquer que le mot est dactylographiable, et un autre chiffre ou une lettre cohérente de notre choix pour indiquer que le mot n'est pas dactylographié. Est-ce exact?
Dennis
3
Le mot le plus long que j'ai trouvé est 10 lettres, coelostats .
Conor O'Brien
1
Alors, "πe" n'est-il pas un mot?
M. Lister
@ Dennis Ya, plus ou moins.
ghosts_in_the_code
1
Un autre 11: les problèmes de santé
Chris H

Réponses:

20

Perl, 47 43 41 + 1 = 42 octets

-4 octets grâce à @Sunny Pun. -2 octets grâce à @Brad Gilbert b2gills et @Downgoat

Courez avec le -ndrapeau.

say!/^(s(in?)?|co?|t(an?)?|ln?|log?|e)+$/

On peut certainement jouer au golf plus loin, mais dans l’esprit de compétition, je quitte la regex pour l’essentiel originale que j’avais imaginée au début. Ne retourne rien si vrai, 1si faux.

Essayez-le en ligne!

J'ai téléchargé un fichier de dictionnaire et le mot le plus long que j'ai trouvé était de 11 lettres - tattletales

Gabriel Benamy
la source
1
Je pense que cela co?devrait suffire puisque sinva s'occuper du s:) Bien jouer avec /log?/!
Sunny Pun
1
Il ne dit pas qu'il doit être insensible à la casse (enlever i), ou que le résultat unique doit avoir un sens (retirer un !)
Brad Gilbert b2gills
Avez-vous besoin que je mette fin à la fin puisque l’entrée n’est que z?
Downgoat
Vous pouvez rendre ceci plus simple: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/ou si vous préférez:/^([celst]|sin?|co|tan?|ln|log?)+$/
Pas que Charles
1
Profitez de votre prime!
ghosts_in_the_code
16

JavaScript (ES6), 44 octets

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

Je pense que c'est la regex la plus courte possible, mais bien sûr je peux me tromper.

Explication

Un premier endroit évident pour commencer serait une regex qui inclut simplement toutes les options séparément:

s=>/^(sin|si|s|cos|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

Premièrement, nous pouvons observer que cela cospeut être formé coet le srend inutile:

s=>/^(sin|si|s|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

Certains d'entre eux, tels que sinet si, peuvent être combinés en rendant la dernière lettre facultative:

s=>/^(sin?|s|co?|tan?|t|log?|ln?|e)+$/.test(s)

Cela fonctionne car les sin?correspondances siavec ou sans nfin, couvrant ainsi à la fois sinet si.

Il semble y avoir beaucoup de n?s aussi. Et si on les mettait tous ensemble?

s=>/^((si|ta|l)n?|s|co?|t|log?|e)+$/.test(s)

Une autre façon de jouer au golf serait de combiner les options restantes à un seul personnage dans une plage de caractères, mais cela revient à la même longueur:

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

Et c'est comme ça que vous jouez au golf avec une regex simple. Je crois que c’est la regex la plus courte possible qui associe chaque chaîne correctement, mais peut-être pas. J'attribuerai une prime de +100 à quiconque parviendra à améliorer cette regex.

ETHproductions
la source
Celui que j'ai utilisé dans ma réponse est en quelque sorte similaire:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll
Premièrement, je compte 44 octets. En second lieu , voici une solution de rechange , mais plus: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien
@ ConorO'Brien Oups, je ne sais pas comment j'ai mal compté ça ...
ETHproductions
Vous pouvez faire a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testpour 42 octets. Je crois que cela est autorisé car il a.tests'agit d'une fonction anonyme.
NoOneIsHere
@SeeOneRhino C'est le cas, mais ce n'est pas vraiment permis car f=a.testcela ne fonctionne pas. Je me demande s'il est acceptable d'appeler avec le nom alternatif a.testsi ...
ETHproductions
7

Pyth, 37 33 29 28 octets

Le code contient un caractère non imprimable, donc voici un xxdhexdump.

00000000: 737d 5173 4d5e 733c 5252 6336 2e22 6174  s}QsM^s<RRc6."at
00000010: 14d0 69ba 76f1 ac59 6422 346c            ..i.v..Yd"4l

Essayez-le en ligne.

Extrêmement astronomique. La complexité temporelle et spatiale est O (16 n ) O (24 n ).

Explication

Tout d'abord, a Qest implicitement ajouté.

s}QsM^s<RRc6."…"4lQ     Implicit: Q = input
            ."…"        Generate "logsincostanlnee"
          c6            Split in 6 parts: ["log", "sin", "cos", "tan", "ln", "ee"]
         R      4       For each n from 0 to 3
       <R               Take the first n chars from each string
      s                 Flatten the results
                 lQ     Get length of input
     ^                  Take that Cartesian power of the list
   sM                   Join each resulting list
 }Q                     Check if the input is found
s                       Cast to integer
PurkkaKoodari
la source
Le PO a clarifié; vous n'avez pas besoin du s.
Dennis
6

Jelly , 32 31 30 28 26 octets

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ

Affiche 0 si le mot est typable, 1 sinon. Merci à @JonathanAllan pour le golf d'un octet!

Essayez-le en ligne!

Comment ça fonctionne

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ  Main link. Argument: s (string of lowercase letters)

ŒṖ                          Yield all partitions of s.
      “¡Ṡ[ẈKœịḲ-¢ȧ?-»       Yield "sine  logcostanln". Every third character
                            marks the start of a typeable word.
  w@€€                      Find the indices of all substrings in the partitions
                            in the string to the right (1-based, 0 if not found).
                     ’      Decrement. "Good" indices are now multiples of 3.
                      %3    Modulo 3. "Good" indices are mapped to 0, "bad"
                            indices are mapped to 1 or 2.
                        Ḍ   Convert from decimal to integer. A partition will
                            yield 0 iff all indices are "good".
                         Ạ  All; yield 0 if one or more integers are falsy (0), 1
                            if all integers are truthy (non-zero).
Dennis
la source
6

Brachylog , 33 octets

Correction d'un bug grâce à @ Synoli.

~c:1a
,"sincostanloglneeee"@6e@[?

Essayez-le en ligne!

Sorties true.si typables ou false.non.

Explication

Nous essayons des déconcaténations de l'entrée jusqu'à ce que nous en trouvions une pour laquelle toutes les chaînes que nous concaténons sont le préfixe de l'une de celles-ci ["sin", "cos", "tan", "log", "lne", "eee].

~c                          A list of strings which when concatenated results in the Input
  :1a                       All strings of this list satisfy the predicate below:

,"sincostanloglneeee"@5           The list ["sin", "cos", "tan", "log", "lne", "eee"]
                       e          Take one element of that list
                        @[?       The input is a prefix of that element
Fataliser
la source
Pourquoi l' .après true?
Kritixi Lithos
1
@KritixiLithos Dans SWI-Prolog, lorsqu'une requête est vraie, elle est imprimée true.et false.sinon. Je viens de réimplémenter ceci: si la sortie est ignorée (comme c'est le cas ici) et qu'il n'y a pas d'écriture sur STDOUT, alors elle sera imprimée true.ou false.selon que le prédicat principal réussit ou échoue. Il a un point dans SWI-Prolog parce que true.et false.sont en fait des programmes valides qui réussissent / échouent toujours.
Fatalize
Comment cette solution fonctionne-t-elle sans tanapparaître explicitement dans la liste?
Synoli
2
@ Synoli Ce n'est pas. Je l'ai corrigé au prix de 3 octets, merci.
Fataliser
4

Perl 6 ,  60 50  44 octets

première tentative ( 60 )

put +?(get~~/^<{<sin cos tan ln log e>».&{|m:ex/^.+/}}>*$/)

traduction de Perl 5 réponse ( 50 )

put +?(get~~/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/)

utilisant l' -ninterrupteur ( 43 + 1 )

put +?/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/

Le premier ?convertit le résultat en booléen et le premier+ convertit en nombre ( 1pour True, 0pour False)

Brad Gilbert b2gills
la source
3

Mathematica, 101 octets

If[StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..],"T","F"]&

Il semble que les parties les plus difficiles de ce défi consistent à proposer la regex la plus courte et à choisir le langage le plus concis qui soit. Je n'ai rien à contribuer au premier, et Mathematica n'est pas un bon candidat pour le second, car vous devez utiliser StringMatchQet RegularExpression. Ce que je peux faire, c’est répondre à votre PS: le mot le plus long que vous puissiez taper est-il sans saveur?

In[1]:= f=StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..]&;

In[2]:= Select[EntityList@"Word",f@#[[2,1]]&][[All,2,1]]//SortBy[StringLength]//DeleteDuplicates
Out[2]= {c,e,l,s,t,cc,cl,el,et,lo,si,sl,ta,te,ccc,col,cos,cot,eel,ell,eta,etc,lee,let,log,lot,sec,see,set,sic,sin,sit,tae,tan,tat,tec,tee,cell,clog,clot,coco,cole,colt,coss,cost,cote,else,less,loco,loge,loll,lose,loss,lota,sect,seel,sell,sess,seta,sett,sill,silo,silt,sine,sise,siss,site,sloe,slog,slot,stet,taco,tact,tael,talc,tale,tall,tect,tell,test,cello,close,cosec,costa,cotan,eccle,elect,elsin,ettle,loess,lotte,secle,setee,since,sleet,stale,stall,state,steel,stele,tasse,taste,tatee,teest,telco,testa,tetel,tsine,cellco,closet,coleta,collet,coltan,cosine,cosset,costal,ecesis,estate,lessee,scelet,select,sellee,sestet,settee,settle,siesta,silole,stacte,stance,stasis,tallet,tallot,taslet,tassel,tasset,tattle,tectal,teetan,tellee,testee,tsetse,celesta,cessile,cocotte,collect,costate,ecolect,ectasis,electee,sessile,sinless,sitelet,statant,tassell,tastant,testate,coestate,colessee,colocolo,cosiness,costless,electant,lossless,sceletal,siletane,statelet,tactless,tallness,telltale,telocoel,coelostat,sissiness,stateless,tasteless,tattletale}

Donc, "tattletale" semble être le plus long d'un personnage.

ngenisis
la source
Pourquoi est-ce non-concurrent? Est -ce que la fonction f définiriez - vous pas conforme aux règles du défi?
Dennis
Non, il génère Trueou Falseplutôt qu'un seul caractère.
ngenisis
Les posts marqués avec décision-problem concernent la détermination de Vrai / Faux, je pense donc que cela est en concurrence.
FlipTack
Le statut non concurrentiel est réservé aux soumissions utilisant une langue ou une fonctionnalité linguistique inexistante ou présentant un bogue lors de la publication du défi.
Dennis
C'est suffisant. J'ai édité ma réponse pour avoir une solution réelle.
ngenisis
2

Merveille , 41 octets

!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")

Usage:

(!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")) "tasteless"

Totalement mal compris la question avant, mais maintenant tout est fixé. Sorties Fpour correspondance et Tpour aucune correspondance.

Non compétitif, 35 octets

!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`

Usage:

(!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`) "tasteless"

Cela utilise les expressions rationnelles applicables, qui ont été implémentées après ce défi.

Maman Fun Roll
la source
2
Si je comprends bien, vous ne pouvez pas supprimer le dernier caractère dans le calculateur, ce qui signifie nde ne pas typable mais sinet lnêtes.
Sunny Pun
Cette regex détecte sacomme vraie
Kritixi Lithos
1
Cela échoue le cas de test got.
Dennis
Je crois que c'est réparé.
Mama Fun Roll
Le ?faire le docile sous d'expression; voir rexegg.com/regex-quantifiers.html#cheat_sheet . Mais même le rendre gourmand ??ou possessif avec ?+ne fonctionne pas pour une raison quelconque (du moins en PHP). coelostatsdéclenche le piège (à loet ta).
Titus
2

Traitement, 223 octets

int d(String b){for(String p:"tan0log0sin0cos0ln0e".split("0"))if(p.startsWith(b))return 1;return 0;}

int l(String p){String b="";int t=1;for(char c:p.toCharArray()){b+=c;if(d(b)<1){b=c+"";t=d(b);}if(t<1)return t;}return t;}

Finalement décidé de faire une réponse sans regex. Pour appeler la fonction, utilisez l("tasteless");. Retourne 0pour faux et1 pour vrai.

Code développé avec explication

int d(String b){
  for(String p:"tan0log0sin0cos0ln0e".split("0"))
    if(p.startsWith(b))
      return 1;
  return 0;
}
//main function
int l(String p){
  String b="";
  int t=1;
  for(char c:p.toCharArray()){
    b+=c;
    if(d(b)<1){
      b=c+"";
      t=d(b);
    }
    if(t<1)return t;
  }
  return t;
}

Fondamentalement, nous itérons sur la chaîne donnée, en construisant bchar par char. Nous vérifions l' utilisation d()si l' un des tan, log... commencer b. Si c'est le cas, alors c'est valide. Sinon, nous vérifions si le caractère à cette position est valide et nous réinitialisons b. Maintenant, s'il est invalide, 0sera retourné, sinon il sera toujours valide. A la fin, si le programme n'a pas encore renvoyé quelque chose, retournez-le 1.

Kritixi Lithos
la source
La dfonction ne peut pas retourner un bool?
Roman Gräf
@ RomanGräf C'est plus d'octets à utiliser booleanque int. Aussi trueet falsenécessitent plus d'octets que 1et0
Kritixi Lithos
2

Scala, 49 octets

s=>s.matches("(s(in?)?|co?|t(an?)?|ln?|log?|e)+")

Retourne true si la chaîne donnée correspond à l'expression rationnelle, false sinon.

corvus_192
la source
2

Python 3 , 154 octets

r=1;i=input()
while r:
 r=0
 for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','):
  if i.startswith(s):r=i=i.replace(s,'',1);break
print(i=='')

Essayez-le en ligne!

Henke
la source
1
Vous devrez peut-être vérifier l'indentation, j'ai dû modifier le code pour que cela fonctionne
george
@george, bizarre, j'ai essayé IDLE et le compilateur en ligne, et les deux semblent fonctionner
Henke
2

Python 3 , 149 130 octets

i=input()
for a in 'tan,sin,cos,log,si,co,ta,lo,lo,ln,s,c,t,l,e'.split(','):
    if a in i:
        i=i.replace(a,"")
print(not i)

edit # 1: rasé 19 octets avec la solution @Henke

Dillanm
la source
0

Python 2, 124 octets

f=lambda w:any(f(w[len(s):])if w[:len(s)]==s else 0for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','))if w else 1
TFeld
la source
0

PHP, 60 octets

<?=preg_match("#^((si|ta|l)n?|co?|log?|s|e|t)+$#",$argv[1]);

regex volé à partir de ETHproductions :
prend en entrée l'argument de la ligne de commande; impressions 1pour typable, 0pour non typable.

versions antérieures, 75 73 69 octets

<?=!preg_replace("#co|log|ln|lo|sin|si|tan|ta|[celst]#","",$argv[1]);

remplace tous les mots possibles par une chaîne vide, renvoie le résultat, annule.

<?=!preg_split("#co|log|ln|lo|sin|si|tan|ta|[celst]#",$argv[1],-1,1);

divise l'entrée par correspondances rationnelles. Le drapeau 1représente PREG_SPLIT_NO_EMPTYet dit preg_splitde ne renvoyer que les résultats non vides. Si input est typable, preg_splitles résultats ne seront vides que si le résultat est retourné, ce qui retournera un tableau vide, qui est faux. !annule le résultat.

Les deux versions prennent en entrée l'argument de la ligne de commande
et sont imprimées 1si le résultat est vide (l'entrée est typable), sinon rien.

Remarques: L'utilisation de
l'expression rationnelle à l'aide de regex ?ne fonctionne pas ici; cela rend les expressions peu gracieuses; probablement en raison d'un retour en arrière. Et l’ordre des alternatives est important: tadoit être arrêté avant tou le moteur cessera de s’adapter quand il trouverat .

J'ai trouvé un aide- mémoire quantificateur , pensé ??ou ?+susceptible d'aider; mais ils n'ont pas travaillé pour moi.

Titus
la source
0

Java 8, 55 octets

s->return s.matches("^((si|ta|l)n?|co?|log?|[ste])+$");

Disclamer: J'ai utilisé le regex d' ETHproductions parce que son nombre d'octets était inférieur au mien.Crédit complet sur la regex pour lui. Ce que j'ai fait a été d'ajouter 24 octets pour en faire une fonction Java.

Retourne falsesi le mot ne rentre pas dans la regex, sinon true.

RudolfJelin
la source