Insípido y otros errores


52

Algunas versiones de la aplicación de calculadora estándar de Android le permiten presionar una tecla, como 'sin' y luego la tecla 'del' para hacerlo 'si'. Probablemente solo un error que no pueden molestarse en eliminar.

Captura de pantalla de la calculadora de Android

Las siguientes letras / agrupaciones de letras son tipificables:

 

pecado
si
s
cos
co
C
bronceado
ejército de reserva
t
En
l
Iniciar sesión
lo
mi

Entonces, 'insípido' es tipificable, porque ta-steless y también lo es 'obstrucciones' porque 'c-log-s'. Sin embargo, 'got' no se puede escribir, ni 'an' o 'xyz'.

Escriba un programa que tome una sola palabra (o secuencia de letras, solo az en la entrada) como entrada y produzca la salida para indicar si una palabra se puede escribir o no.

La salida puede ser un solo carácter / letra / dígito / etc. o puede ser más grande Todas las palabras que se pueden escribir deben producir la misma salida. Todas las palabras que no se pueden escribir también deben producir la misma salida.

PD: Por curiosidad, ¿es "insípido" la palabra de diccionario más larga que se puede escribir?


1
Para ser claros: sacamos un solo dígito o letra coherente de nuestra elección para indicar que la palabra se puede escribir, y un dígito o letra diferente, único y consistente de nuestra elección para indicar que la palabra no se puede escribir. ¿Es eso correcto?
Dennis

3
La palabra más larga que pude encontrar es 10 letras, coelostatos .
Conor O'Brien

1
Entonces, ¿"πe" no es una palabra?
Sr. Lister, el

@Dennis Ya, más o menos.
ghosts_in_the_code

1
Otro 11: sissinesses
Chris H

Respuestas:


20

Perl, 47 43 41 + 1 = 42 bytes

-4 bytes gracias a @Sunny Pun. -2 bytes gracias a @Brad Gilbert b2gills y @Downgoat

Corre con la -nbandera.

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

Definitivamente se puede jugar más, pero en el espíritu de la competencia, estoy dejando la expresión regular en su mayoría original que se me ocurrió al principio. No devuelve nada si es verdadero, 1si es falso.

Pruébalo en línea!

Descargué un archivo de diccionario y la palabra más larga que encontré fue 11 letras: tattletales


1
Creo que co?debería ser suficiente ya sinque se encargará de s:) ¡Buen juego con /log?/!
Sunny Pun

1
No dice que tiene que ser sensible a mayúsculas (quitar i), o que el resultado solo tiene que tiene sentido (uno remove !)
Brad Gilbert b2gills

¿Necesita que marque al final ya que la entrada es solo az?
Downgoat

Puede simplificar esto: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/o si lo prefiere:/^([celst]|sin?|co|tan?|ln|log?)+$/
No es que Charles

1
¡Disfruta tu generosidad!
ghosts_in_the_code

16

JavaScript (ES6), 44 bytes

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

Creo que esta es la expresión regular más corta posible, pero, por supuesto, puedo estar equivocado.

Explicación

Un primer lugar obvio para comenzar sería una expresión regular que simplemente incluye todas las opciones por separado:

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

Primero, podemos observar que cosse puede formar a partir de coy s, haciéndolo innecesario:

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

Algunos de estos, como siny si, se pueden combinar haciendo que la última letra sea opcional:

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

Esto funciona porque sin?coincide sicon o sin un nal final, cubriendo así ambos siny si.

Parece que hay muchos n?s también. ¿Qué pasa si los juntamos todos?

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

Una forma más de jugar al golf sería combinar las opciones restantes de caracteres únicos en un rango de caracteres, pero esto tiene la misma longitud:

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

Y así es como se juega al golf una simple expresión regular. Creo que esta es la expresión regular más corta posible que coincide con cada cadena correctamente, pero tal vez no. Otorgaré una recompensa de +100 a cualquiera que logre mejorar esta expresión regular.


El que utilicé en mi respuesta es similar:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

En primer lugar, cuento 44 bytes. En segundo lugar, esta es una solución alternativa, pero más largo: / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien

@ ConorO'Brien Whoops, no sé cómo conté mal eso ...
ETHproductions

Puedes hacerlo a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testpor 42 bytes. Creo que esto está permitido, porque a.testes una función anónima.
NoOneIsHere

@SeeOneRhino Lo es, pero en realidad no está permitido porque f=a.testno funciona. Sin embargo, me pregunto si es aceptable llamar con el nombre alternativo a.test...
ETHproductions

7

Pyth, 37 33 29 28 bytes

El código contiene un carácter no imprimible, así que aquí hay 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

Pruébalo en línea.

Extremadamente astronómicamente ineficiente. La complejidad de tiempo y espacio es O (16 n ) O (24 n ).

Explicación

Primero, Qse agrega implícitamente a.

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

El OP ha aclarado; no necesitas el s.
Dennis

6

Jalea , 32 31 30 28 26 bytes

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

Emite 0 si la palabra es escribible, 1 si no. ¡Gracias a @JonathanAllan por jugar golf en 1 byte!

Pruébalo en línea!

Cómo 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

Brachylog , 33 bytes

Se corrigió un error gracias a @Synoli.

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

Pruébalo en línea!

Salidas true.si se pueden escribir o false.no.

Explicación

Intentamos las desconcatenaciones de la entrada hasta que encontremos una para la cual todas las cadenas que concatenemos sean un prefijo de una ["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 qué el .después true?
Kritixi Lithos

1
@KritixiLithos En SWI-Prolog cuando una consulta es verdadera, se imprime true.y de lo false.contrario. Acabo de volver a implementar esto: si se ignora la salida (como está aquí) y no hay escritura STDOUT, se imprimirá true.o false.dependerá de si el predicado principal tiene éxito o falla. Tiene un punto en SWI-Prolog porque true.y en false.realidad son programas válidos que siempre tienen éxito / siempre fallan.
Fatalize

¿Cómo funciona esta solución sin tanaparecer explícitamente en la lista?
Synoli

2
@Synoli no lo hace. Lo arreglé al costo de 3 bytes, gracias.
Fatalize

4

Perl 6 ,  60 50  44 bytes

primer intento ( 60 )

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

traducción de la respuesta Perl 5 ( 50 )

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

usando el -ninterruptor ( 43 + 1 )

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

El primero ?convierte el resultado a booleano, y el primero lo +convierte a un 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 las partes difíciles de este desafío son encontrar la expresión regular más corta y elegir el lenguaje más conciso para que coincida con la expresión regular. No tengo nada que aportar al primero, y Mathematica no es un buen candidato para el segundo ya que tienes que usar StringMatchQy RegularExpression. Lo que puedo hacer es responder a su PD: ¿es "insípido" la palabra más larga que puede escribir?

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}

Así que "tattletale" parece ser el más largo de un personaje.


¿Por qué esto no es competitivo? ¿La función f se definen no cumple con las reglas del desafío?
Dennis

No, genera Trueo Falseno un solo carácter.
ngenisis

Las publicaciones etiquetadas con un problema de decisión tratan sobre determinar Verdadero / Falso, así que creo que esto está compitiendo.
FlipTack

El estado de no competencia está reservado para los envíos que utilizan un idioma o una función de idioma que no existía o que tenía un error cuando se publicó el desafío.
Dennis

Lo suficientemente justo. Edité mi respuesta para tener una solución real.
ngenisis

2

Maravilla , 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 mal entendido la pregunta antes, pero ahora todo está solucionado Salidas Fpara partido y Tpara no partido.

Sin competencia, 35 bytes

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

Uso:

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

Esto hace uso de expresiones regulares aplicables, que se implementó después de este desafío.


2
Según tengo entendido, solo puede eliminar el último carácter de la calculadora, lo que significa que nno se puede escribir sino siny ln.
Sunny Pun

Esta expresión regular se detecta sacomo verdadera
Kritixi Lithos

1
Esto falla el caso de prueba got.
Dennis

Creo que está arreglado.
Mama Fun Roll

El ?hacer que el dócil sub expresión; ver rexegg.com/regex-quantifiers.html#cheat_sheet . Pero incluso hacerlo codicioso ??o posesivo ?+no funciona por alguna razón (al menos en PHP). coelostatsdesencadena la trampa (en loy ta).
Titus

2

Procesamiento, 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 decidió hacer una respuesta sin expresiones regulares. Para llamar a la función, use l("tasteless");. Devuelve 0falso y 1verdadero.

Código ampliado con explicación

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

Básicamente, iteramos sobre la cadena dada, construyendo bchar por char. Comprobamos el uso de d()si alguno de los tan, log, ... comenzar con b. Si lo hace, entonces es válido. De lo contrario, verificamos si el carácter en esa posición es válido y lo reiniciamos b. Ahora, si no es válido, 0se devolverá o, de lo contrario, seguirá siendo válido. Al final, si el programa aún no ha devuelto algo, devuélvalo 1.


¿No puede la dfunción devolver a bool?
Roman Gräf

@ RomanGräf Tiene más bytes que usar booleanque int. También truey falserequieren más bytes que 1y0
Kritixi Lithos

2

Scala, 49 bytes

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

Devuelve verdadero si la cadena dada coincide con la expresión regular, de lo contrario, falso.


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

Pruébalo en línea!


1
Es posible que deba verificar la sangría, tuve que editar el código para que funcione
george

@george, raro, lo intenté en IDLE y el compilador en línea, y ambos parecen funcionar
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)

editar # 1: 19 bytes afeitados usando la solución @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]);

expresiones regulares robadas de ETHproductions :
toma datos del argumento de la línea de comandos; imprime 1para tipificable, 0para no mecanografiable.

versiones anteriores, 75 73 69 bytes

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

reemplaza todas las palabras posibles con una cadena vacía, devuelve el resultado, niega.

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

divide la entrada por coincidencias de expresiones regulares. Flag 1significa PREG_SPLIT_NO_EMPTYy le dice preg_splitque solo devuelva resultados no vacíos. Si la entrada es tipificable, preg_splitsolo tendrá resultados vacíos, por lo que devolverá una matriz vacía, que es falsa. !niega el resultado.

Ambas versiones toman la entrada del argumento de la línea de comando
e imprimen 1si el resultado está vacío (la entrada se puede escribir), de lo contrario nada.

Notas:
Empacar la expresión regular usando ?no funciona aquí; hace que las expresiones no sean greedy; Probablemente debido al retroceso. Y el orden de las alternativas es importante: tatiene que estar parado antes to el motor dejará de coincidir cuando lo encuentre t.

Encontré una hoja de trucos cuantificadora , pensé ??o ?+podría ayudar; Pero no funcionaron para mí.


0

Java 8, 55 bytes

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

Renuncia: Solía ETHproductions' expresiones regulares porque era muchos bytes más corta que la mía. Crédito total en la expresión regular para él. Lo que hice fue agregar 24 bytes para que sea una función Java.

Devuelve falsesi la palabra no encaja en la expresión regular, de lo contrario true.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.