Esta competencia ha terminado.
El ganador es CJam con 22 caracteres, superando la respuesta de TwiNight por un personaje. ¡Felicidades Dennis !
Una mención de honor es para Falko , quien se volvió completamente loco con las importaciones gratuitas.
.
Hace un tiempo quería saber cómo puedo sobrescribir los teléfonos inteligentes modernos con mi Nokia 3310, y aunque algunas respuestas fueron realmente buenas, ¡todavía no puedo seguir el ritmo! Tal vez debería adoptar un enfoque diferente y simplemente no escribir palabras que sean difíciles de escribir.
Llamaremos a un texto fácilmente escribible si no hay dos letras consecutivas en el mismo botón en el teclado del teléfono, dada la disposición estándar:
Tu tarea
Su tarea es escribir un programa / función que acepte una cadena s
de stdin / como parámetro y devuelva un valor verdadero si s
es fácil de escribir y un valor falso de lo contrario. ¡La entrada solo consistirá en letras minúsculas y espacios y se garantiza que no estará vacía!
Tanteo
Este es codegolf, por lo que gana el recuento de caracteres más bajo.
Declaraciones de importación no serán contados hacia su resultado final, por lo que si alguna vez has querido para su uso std::set_symmetric_difference
, liftM4
o itertools.combinations
en su código, ahora es el momento!
-3 si su código fuente es fácil de escribir, suponiendo que todo lo que no sea una letra esté en el botón 0. ¡Después de todo, me gustaría enviar su código a algunos amigos!
Casos de prueba
Aquí hay algunos casos de prueba para verificar si su código funciona según lo previsto:
"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
¡Feliz golf!
Respuestas:
CJam,
34312722 caracteresPruébalo en línea.
Ejecución de ejemplo
Cómo funciona
Fondo
El núcleo del código consiste en aplicar un mapa F a cada carácter C de la cadena de entrada para que coincidan las imágenes de los símbolos en la misma tecla. Encontré un mapa adecuado observando lo siguiente:
El mapa T: C ↦ (C - 'h') + 13 transforma la cadena S: = "abcdefghijklmnopqrstuvxyz" de la siguiente manera:
Para las teclas 0a 6, bastaría con dividir T (C) por 3 , pero tenemos que aplicar algún tipo de corrección a los personajes de s , t , v , y y z .
El mapa D: C ↦ (C - 'h') / 9 transforma la cadena S en la siguiente matriz:
Esto corrige los cocientes de s , t , v , y y z , sin afectar a los demás.
Finalmente, el mapa F: C ↦ (T (C) - D (C)) / 3 transforma la cadena S de la siguiente manera:
Todo lo que descansa es comparar los caracteres consecutivos de alguna manera. Para ese propósito, hacemos XOR F (C) con la imagen del personaje anterior; para el primero, hacemos XOR F (C) con 1 (valor predeterminado de la variable X ), que no tiene preimagen, y multiplicamos todos los resultados.
El producto será Falsy si y sólo si uno de los factores es cero, es decir, si y sólo si dos caracteres consecutivos tienen la misma imagen por F .
fuente
Python 2 -
80, 68, 64, 61, 58, 50, 48, 45, 4442Aunque ahora se está volviendo un poco ridículo, seguiré utilizando las importaciones gratuitas de la biblioteca, incluso la
__builtin__
biblioteca:Entonces, solo la siguiente línea corta cuenta para la longitud del código:
Créditos a Markuz por las ideas con respecto
input()
! Estos desafíos de importación gratuita siempre le presentan algunas bibliotecas menos conocidas. ;)Alternativa usando solo la
operator
biblioteca (98, 8379):Me detendré aquí. Pero se podría avanzar en campo utilizando esta versión
sys
,pprint
y otras bibliotecas ...Alternativa sin bibliotecas (105):
fuente
ord(c)
a una variable (digamoso
) y luego restandoc/112
y enc/119
lugar de los booleanos?lambda
expresiones tan fácilmente. Con[(o-1-o/112-o/119)/3for o in map(ord,s)]
termino con 80 bytes nuevamente.from sys import argv as s
, usando ens[1]
lugar deinput()
input
desde__builtin__
, así es en realidad aún mejor: D ahorro de otro byte.RubyRegex (sabores más populares),10683 bytesPorque regex
Acabo de cortar al intermediario (Ruby) e hice de esto una solución pura de expresiones regulares. Funciona en muchos sabores y solo encuentra una coincidencia si la cadena no contiene dos caracteres consecutivos en el mismo botón.
fuente
{2}
fuera de la alternancia, ahorrando 22 bytes?Bash + coreutils, 49
Devuelve un código de salida de 1 para VERDADERO y 0 para FALSO:
fuente
perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")
imprime 1 para verdadero y nada para falso.aaadddgggjjjmmmpppptttwwww
pero me di por vencido.11122233344455566667778888
. ¡Con la base 36 que codifica los primeros 19 dígitos de este número, podemos ahorrar 1 carácter!APL (Dyalog),
2423Explicación
⍞
: Toma la entrada de cadena de la pantalla⎕AV
: este es el vector atómico que es básicamente una cadena de todos los caracteres que APL reconoce, que por supuesto incluye todas las letras minúsculas (índice 18 ~ 43) y espacio (índice 5)⍳
:IndexOf
función. Para muchas funciones en APL que toman uno o dos argumentos escalares, puede alimentarlo con una matriz en lugar de un escalar: APL hará el bucle por usted. Entonces⍳
devuelve una matriz numérica de índices..21-.31×
: Veces 0.31 y luego resta de 0.21. Este es un pequeño truco que asigna la letra de la misma tecla (especialmente PQRS) al mismo número (cuando se redondea a enteros), excepto Z, que se asigna a su propio grupo¯13⌈
:max
con -13. Esto hace que Z regrese al grupo con WXY⌊
: Redondear a enteros2≠/
: Pairwise-≠
. Devuelve una matriz booleana para cada par consecutivo.∧/
: Y juntas todas las entradas de la matriz resultante.fuente
∧/2≠/
(todos los pares consecutivos se escriben en teclas diferentes) en lugar de~∨/2=/
(no se escribe ningún par consecutivo en la misma tecla). APL FTW !!!Perl - 44
Esto es básicamente una adaptación de Perl de la respuesta de @ DigitalTrauma publicada con su permiso. Afeitado 2 personajes gracias a @KyleStrand.
43 caracteres + 1 para
-p
bandera.y///
es el mismo quetr///
. Imprime1
para verdadero y nada para falso. Puedo publicar una explicación detallada si así lo solicita.Ejemplo de ejecución:
Perl - 81
+1 para
-n
bandera. Funciona mediante el usojoin
para crear la expresión regular (la misma que la de Martin ), que se afeita de unos pocos bytes.Ejemplo de ejecución:
fuente
a
yz
sin transcribir?y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/
Además, esto no manejará espacios, ¿verdad?a
yz
seguir siendo el mismo. Respuesta actualizada!JavaScript -
159156bytesDevuelve 1 para verdadero y 0 para falso.
Si tan solo pudiera deshacerme de las palabras clave.
fuente
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}
!=
bucle for por a<
.c, 74 bytes
Devuelve un estado de salida distinto de cero para VERDADERO y 0 para FALSO:
fuente
while
afor(;c=~getchar();d=c/3)
, y otro byte cambiando su primeroif
a un?:
operador.c=getchar()
embargo, los paréntesis son obligatorios porque~
tienen mayor prioridad que=
. Aún así, tomaré los otros dos bytes :)exit(d!=c/3);
lugar deif(d==c/3)exit(0);
trabajar?Ruby 1.8,
89838178 bytesAquí hay otra presentación. Para mi vergüenza, supera la expresión regular. :(
Esto toma la cadena a través del argumento de la línea de comandos e imprime un booleano.
En cuanto al algoritmo, estoy bajando las letras después
p
de una en una y despuész
por dos, y luego verifico que no haya colisiones después de la división de enteros por 3.PD: Esta es la primera vez que usar Ruby 1.8 acorta el código (debido a la forma más corta de obtener códigos de caracteres).
fuente
Cobra - 80
fuente
JavaScript (ES6) 66
74El bucle interno encuentra el grupo para cada personaje. Conceptualmente es un 'reducir' pero 'mapa' es más corto. El bucle externo compara el grupo de caracteres y salidas consecutivos con falso si son iguales.
Prueba en la consola Firefox / Firebug
Salida
fuente
.some
lugar de cada. Porque incluso si falla una vez, la respuesta es falsa.some
yevery
son intercambiables, jugando con las condiciones. Pero aquí, simplemente, ensome
lugar deevery
no funcionará, pruébalo.[...s].every
truco en mis campos de golf :)Perl, 83 bytes
Haciendo un fuerte abuso de $ _ en Perl.
fuente
-e
en Perl, es gratis.) 71 caracteres alternativo con parámetros de línea de comandos:perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'
.-l
, ¡pero se ve bien!-l
como reemplazo dechop
. Pero, por supuesto, tienes razón.Dos tareas son complicadas en Python; detectando cadenas y asignando los grupos. Ambos pueden ser asistidos usando numpy, pero no está en la biblioteca estándar.
Python 2 (solo biblioteca estándar) - función de 59 caracteres
Python 2 (solo biblioteca estándar) - 53 caracteres stdin para salir del valor
Aquí abuso del hecho de que
issubclass(bool,int)
, por lo tanto, cambiarall()
aany()
me da un valor de salida válido, eliminandonot()
el valor de retorno. La eliminación de la sobrecarga de la función hizo que las versiones regex se quedaran atrás en tamaño.fuente
J - 42 char
Función que toma una cuerda a la derecha.
Primero mapeamos el alfabeto (
u:97+i.26
) en los números del 0 al 25, todos los demás caracteres (incluidos los espacios) van a 26 (i.
). Luego asignamos ({~
) los primeros tres elementos a la primera tecla, los siguientes tres a la siguiente tecla, y así sucesivamente a través de las teclas del teclado del teléfono, asegurándonos de asignar el espacio / otros signos de puntuación a una tecla separada al final . (4 3 4 1,~5#3
es igual3 3 3 3 3 4 3 4 1
y loI.
convierte en una matriz de 27 elementos donde los tres primeros son la clave 1, etc.) Luego verificamos la desigualdad por pares (2~:/\
) y Y todos los resultados juntos (*/
).fuente
Raqueta, 119
Sin golf (expresión combinatoria):
fuente
JavaScript - 152
No es un ganador, pero lo intenté. Supera a @Lozzaaa por 4 bytes al momento de publicar :)
Pasa todas las pruebas.
Aprovecha la falta de tipeo de JS para crear una matriz de tipos múltiples, y aprovecha la ventaja de indexOf return -1 para soporte de espacio.
Uso:
Asume solo caracteres alfabéticos en minúscula y espacios. Devuelve 1 para verdadero, 0 para falso.
Quizás si supiera ES6 podría intentar el segundo desafío ...
fuente
ES6, JavaScript
8970 caracteresSé que no es un ganador porque cuando se trata de operaciones prácticas como obtener el valor ASCII del personaje, JS pone mucha hinchazón (
.charCodeAt()
).Ejecútelo en la consola web de la última versión de Firefox.
Uso:
La función devuelve verdadero o falso.
EDITAR : Golfé mucho usando el
[...x].every
truco aprendido de @ edc65 (¡Gracias!)Intentaré jugar más al golf :)
fuente
GML (Game Maker Language), 149
fuente
Python 3 - 152 caracteres
No es lo más corto que pude ir, pero lo hará por ahora
fuente