Erros insípidos e outros

52

Algumas versões do aplicativo de calculadora Android padrão permitem que você pressione uma tecla, como 'sin' e, em seguida, a tecla 'del' para torná-lo 'si'. Provavelmente apenas um bug que eles não podem se incomodar em remover.

Captura de tela da calculadora Android

As seguintes letras / agrupamentos de letras são digitáveis:

 

pecado
si
s
porque
co
c
bronzeado
ta
t
em
eu
registro
eis
e

Portanto, 'insípido' é tipificável, porque é sem tamanha e 'tamancos' porque 'c-log-s'. No entanto, 'got' não pode ser digitado, nem 'an' ou 'xyz'.

Escreva um programa que use uma única palavra (ou sequência de letras, apenas az na entrada) como entrada e produza saída para indicar se uma palavra é digitável ou não.

A saída pode ser um único caractere / letra / dígito / etc. ou pode ser maior. Todas as palavras digitáveis ​​devem produzir a mesma saída. Todas as palavras não tipáveis ​​também devem produzir a mesma saída.

PS Por curiosidade, 'insípido' é a palavra mais longa do dicionário que pode ser digitada?

ghosts_in_the_code
fonte
11
Só para esclarecer: produzimos um dígito ou letra único e consistente de nossa escolha para indicar que a palavra pode ser digitada, e um dígito ou letra diferente, único e consistente de nossa escolha para indicar que a palavra não pode ser digitada. Isso está correto?
Dennis
3
A palavra mais longa que consegui encontrar são 10 letras, celostatos .
Conor O'Brien
11
Então, "πe" não é uma palavra?
Mr Lister
@ Dennis Ya, mais ou menos.
ghosts_in_the_code
11
Outro 11: mariquinhas
Chris H

Respostas:

20

Perl, 47 43 41 + 1 = 42 bytes

-4 bytes graças a @Sunny Pun. -2 bytes graças a @Brad Gilbert b2gills e @Downgoat

Corra com a -nbandeira.

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

Definitivamente, ele pode ser jogado mais longe, mas, no espírito da competição, estou deixando o regex principalmente original que criei no início. Retorna nada se verdadeiro, 1se falso.

Experimente online!

Baixei um arquivo de dicionário e a palavra mais longa que encontrei foram 11 letras - tattletales

Gabriel Benamy
fonte
11
Eu acho que co?deve ser suficiente, pois sinvai cuidar do s:) Bom brincar com /log?/!
Sunny Pun
11
Ele não diz que ele precisa ser insensível caso (remoção i), ou que o único resultado tem de fazer sentido (um remove !)
Brad Gilbert b2gills
Você precisa sinalizar no final, pois a entrada é apenas az?
Downgoat
Você pode simplificar: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/ou se preferir:/^([celst]|sin?|co|tan?|ln|log?)+$/
Não que Charles
11
Aproveite a sua recompensa!
ghosts_in_the_code
16

JavaScript (ES6), 44 bytes

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

Eu acho que esse é o menor regex possível, mas é claro que posso estar errado.

Explicação

Um primeiro lugar óbvio para começar seria uma regex que simplesmente inclui todas as opções separadamente:

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

Primeiro, podemos observar que cospode ser formado a partir de coe s, tornando-o desnecessário:

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

Alguns deles, como sine si, podem ser combinados, tornando a última letra opcional:

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

Isso funciona porque sin?combina sicom ou sem um nno final, cobrindo ambos sine si.

Parece haver muitos n?também. E se juntarmos todos eles?

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

Mais uma maneira de jogar golfe seria combinar as opções restantes de caractere único em um intervalo de caracteres, mas isso ocorrerá no mesmo comprimento:

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

E é assim que você joga um regex simples. Acredito que este seja o menor regex possível que corresponda a cada string corretamente, mas talvez não. Atribuirei uma recompensa de +100 a quem conseguir melhorar esse regex.

ETHproductions
fonte
O que eu usei na minha resposta é parecido com:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll
Em primeiro lugar, conto 44 bytes. Em segundo lugar, aqui está uma solução alternativa, mas mais longo: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien
@ ConorO'Brien Whoops, não sei como me contado mal que ...
ETHproductions
Você pode fazer a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testpor 42 bytes. Eu acredito que isso é permitido, porque a.testé uma função anônima.
NoOneIsHere
@SeeOneRhino É, mas não é realmente permitido porque f=a.testnão funciona. Gostaria de saber se é aceitável para chamar com o nome alternativo a.testembora ...
ETHproductions
7

Pitão, 37 33 29 28 bytes

O código contém um caractere não imprimível, então aqui está um 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

Experimente online.

Extremamente astronomicamente ineficiente. A complexidade do tempo e do espaço é O (16 n ) O (24 n ).

Explicação

Primeiro, a Qé implicitamente anexado.

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
fonte
O PO esclareceu; Você não precisa do s.
Dennis
6

Geléia , 32 31 30 28 26 bytes

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

Emite 0 se a palavra for digitável, 1 se não for. Graças a @ JonathanAllan por jogar fora um byte!

Experimente online!

Como funciona

ŒṖ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
fonte
6

Braquilog , 33 bytes

Corrigido um erro graças a @Synoli.

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

Experimente online!

Saídas true.se tipificáveis ​​ou false.não.

Explicação

Tentamos deconcatenar a entrada até encontrarmos uma para a qual todas as strings que concatenamos sejam o prefixo de uma das ["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
Fatalizar
fonte
Por que .depois true?
Kritixi Lithos
11
@KritixiLithos Em SWI-Prolog quando uma consulta é verdade que imprime true.e false.de outra forma. Acabei de reimplementar isto: se a saída for ignorada (como está aqui) e não houver gravação STDOUT, será impressa true.ou false.dependendo de o predicado principal ter êxito ou falhar. Ele tem um ponto no SWI-Prolog porque true.e false.são realmente programas válidos que sempre tem sucesso / sempre falha.
Fatalize 4/12/16
Como essa solução funciona sem tanaparecer explicitamente na lista?
Synoli
2
@Synoli Não. Corrigi-o ao custo de 3 bytes, obrigado.
Fatalize 12/12
4

Perl 6 ,  60 50  44 bytes

primeira tentativa ( 60 )

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

tradução da resposta Perl 5 ( 50 )

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

usando o -ninterruptor ( 43 + 1 )

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

O primeiro ?converte o resultado em booleano e o primeiro +converte isso em um número ( 1para True, 0para False)

Brad Gilbert b2gills
fonte
3

Mathematica, 101 bytes

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

Parece que as partes mais difíceis desse desafio estão surgindo com o menor regex e escolhendo o idioma mais conciso para corresponder ao regex. Não tenho nada para contribuir com o primeiro, e o Mathematica não é um bom candidato para o segundo, uma vez que você precisa usá-lo StringMatchQe RegularExpression. O que posso fazer é responder ao seu PS: "insípido" é a palavra mais longa que você pode digitar?

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}

Portanto, "tattletale" parece ser o mais longo de um personagem.

ngenisis
fonte
Por que isso não é competitivo? Será que a função f você não define cumprir com as regras do desafio?
Dennis
Não, ele gera Trueou Falsemelhor que um único caractere.
Ngenisis
As postagens marcadas com problema de decisão são sobre como determinar Verdadeiro / Falso, então acho que isso é competitivo.
FlipTack
O status de não competidor é reservado para envios que usam um idioma ou recurso de idioma que não existia ou que apresentava um erro quando o desafio foi lançado.
Dennis
Justo. Eu editei minha resposta para ter uma solução real.
Ngenisis
2

Maravilha , 41 bytes

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

Uso:

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

Totalmente entendeu mal a questão antes, mas agora está tudo resolvido. Saídas Fpara correspondência e Tpara não correspondência.

Não-competidor, 35 bytes

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

Uso:

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

Isso faz uso das expressões regulares aplicáveis, que foram implementadas após esse desafio.

Mama Fun Roll
fonte
2
Pelo meu entendimento, você pode excluir apenas o último caractere da calculadora, o que significa que nnão pode ser digitado, mas sine lné.
Sunny Pun
Este regex é detectado sacomo verdadeiro #
214 Kritixi Lithos
11
Isso falha no caso de teste got.
Dennis
Eu acredito que está consertado.
Mama Fun Roll
A ?fazer a dócil sub expressão; consulte rexegg.com/regex-quantifiers.html#cheat_sheet . Mas mesmo torná-lo ganancioso ??ou possessivo com ele ?+não funciona por algum motivo (pelo menos em PHP). coelostatsaciona a armadilha (at loe ta).
Titus
2

Processando, 223 bytes

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;}

Finalmente decidiu fazer uma resposta sem regex. Para chamar a função, use l("tasteless");. Retorna 0para false e 1true.

Código expandido com explicação

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;
}

Basicamente, iteramos sobre a sequência especificada, construindo bchar por char. Verificamos utilizando d(), se qualquer um dos tan, log... começar com b. Se isso acontecer, é válido. Senão, verificamos se o caractere nessa posição é válido e redefinimos b. Agora, se for inválido, 0será retornado, ou ainda será válido. No final, se o programa ainda não tiver retornado algo, retorne 1.

Kritixi Lithos
fonte
A dfunção não pode retornar a bool?
Roman Gräf
@ RomanGräf É mais bytes para usar booleando que int. Também truee falserequer mais bytes que 1e0
Kritixi Lithos
2

Scala, 49 bytes

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

Retorna true se a string especificada corresponder ao regex, false caso contrário.

corvus_192
fonte
2

Python 3 , 154 bytes

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=='')

Experimente online!

Henke
fonte
11
Você pode precisar verificar recuo, eu tive que editar o código para que ele funcione
george
@george, estranho, tentei em IDLE eo compilador online, e ambos parecem trabalho
Henke
2

Python 3 , 149 130 bytes

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: raspou 19 bytes usando a solução @Henke

Dillanm
fonte
0

Python 2, 124 bytes

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
fonte
0

PHP, 60 bytes

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

regex roubado de ETHproductions :
recebe entrada do argumento da linha de comando; imprime 1para tipável, 0para não tipável.

versões anteriores, 75 73 69 bytes

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

substitui todas as palavras possíveis por uma sequência vazia, retorna o resultado, nega.

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

divide a entrada por correspondências regex. O sinalizador 1representa PREG_SPLIT_NO_EMPTYe informa preg_splitapenas para retornar resultados não vazios. Se a entrada for tipável, preg_splitterá apenas resultados vazios; portanto, retornará uma matriz vazia, o que é falso. !nega o resultado.

Ambas as versões recebem a entrada do argumento da linha de comando
e são impressas 1se o resultado estiver vazio (a entrada pode ser digitada), senão nada.

Notas:
Empacotar o regex usando ?não funciona aqui; torna as expressões ingratas; provavelmente devido ao retrocesso. E a ordem das alternativas é importante: tatem que estar diante de si tou o motor deixará de corresponder quando encontrar t.

Encontrei uma planilha de quantificação , pensei ??ou ?+poderia ajudar; mas eles não funcionaram para mim.

Titus
fonte
0

Java 8, 55 bytes

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

Disclamer: eu usei ETHproductions regex porque era muitos bytes menor do que o meu. Crédito total no Regex para ele. O que fiz foi adicionar 24 bytes para torná-lo uma função Java.

Retorna falsese a palavra não couber no Regex, caso contrário true.

RudolfJelin
fonte