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?


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


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.


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

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).

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

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)


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.


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.


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.


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.


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!


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


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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.