Una 'cadena par' es cualquier cadena donde la paridad de los valores ASCII de los caracteres siempre se alterna. Por ejemplo, la cadena EvenSt-ring$!
es una cadena par porque los valores ASCII de los caracteres son:
69 118 101 110 83 116 45 114 105 110 103 36 33
Y las paridades de estos números son:
Odd Even Odd Even Odd Even Odd Even Odd Even Odd Even Odd
Lo cual se alterna todo el camino. Sin embargo, una cadena como noHello world!
es una cadena par porque los valores ASCII son:
72 101 108 108 111 32 87 111 114 108 100 33
Y las paridades son:
Even Odd Even Even Odd Even Odd Odd Even Even Even Odd
Lo cual claramente no siempre se alterna.
El reto
Debe escribir un programa completo o una función que acepte una cadena de entrada y genere un valor verdadero si la cadena es par, y un valor falso de lo contrario. Puede tomar su entrada y salida en cualquier formato razonable, y puede suponer que la entrada solo tendrá ASCII imprimible (el rango 32-127). Usted no tiene que manejar la entrada vacía.
Ejemplos
Aquí hay algunos ejemplos de cadenas pares:
#define
EvenSt-ring$!
long
abcdABCD
3.141
~
0123456789
C ode - g ol!f
HatchingLobstersVexinglyPopulateJuvenileFoxglove
Y todos estos ejemplos ni siquiera son cadenas:
Hello World
PPCG
3.1415
babbage
Code-golf
Standard loopholes apply
Shortest answer in bytes wins
Happy golfing!
También puede usar esta solución no protegida para probar cualquier cadena si tiene curiosidad sobre un determinado caso de prueba.
lno
.Respuestas:
MATL ,
43 bytesGracias a Emigna por guardar un byte y gracias a Luis Mendo por corregir algunos errores. Código:
Explicación:
Pruébalo en línea!
fuente
A
.A
lado gracias a la forma en queif
funciona MATL .2\
poro
. Y el código se verá muy ... imperativo :-)4
sigue siendo regular4
...05AB1E ,
54 bytesGuardado 1 byte gracias a Adnan .
Pruébalo en línea!
Explicación
fuente
Ç¥ÉP
:)Gelatina ,
754 bytesGuardado 2 bytes usando la idea deltas de @ Steven H.
Guardado 1 byte gracias a @ Lynn .
Pruébalo en línea! o Verificar todos los casos de prueba.
Explicación
fuente
%2
→Ḃ
mod
.Python 2, 54 bytes
fuente
Mathematica,
5044 bytesLa versión actual es básicamente todo el virtuosismo de Martin Ender.
Devoluciones
True
oFalse
. Nada demasiado inteligente: toma la suma mod-2 de cada par de códigos ASCII consecutivos y verifica que 0 nunca se obtenga.Versión antigua:
fuente
JavaScript (ES6),
605046 bytesIntenté la recursión, pero a 51 bytes, no parece valer la pena:
Fragmento de prueba
Mostrar fragmento de código
fuente
s=>[...Buffer(s)].every(c=>p-(p=c&1),p=2)
Brain-Flak ,
13811411284 + 3 = 87 bytesGracias a @Riley por su ayuda en el golf.
Este programa trata la entrada vacía como una cadena no uniforme.
Pruébalo en línea!
Explicación (obsoleta)
Cambia la entrada de la pila izquierda a la derecha mientras modifica por 2. Encuentra la diferencia entre cada carácter adyacente hasta que todos hayan sido verificados o una de las diferencias sea igual a cero (lo que solo ocurriría en una cadena no uniforme). Si el bucle terminó debido a una cadena no uniforme, vuelva a la pila izquierda y muestre el valor restante. De lo contrario, quédese en la pila derecha y coloque el cero sobre el 1 restante en la pila.
fuente
([]){{}
->{
y elimine([])
justo antes del cierre del primer bucle.{({}(())){({}[()]<(()[{}])>)}{}({}<>)<>}<>
(42 bytes). Esto se derivó de su módulo original. Para que funcione con su programa, se debe agregar un +1 nilad adicional:{({}(())){({}[()]<(()[{}])>)}{}({}()<>)<>}<>
R,
4135 bytesEDITAR: Guardado algunos bytes gracias a @JDL al usar en
diff
lugar derle
.Explicación
readline()
leer entradautf8ToInt()%%2
convertir a valores ascii y mod 2 (almacenar como vector R)all(rle()==1)
codificación de longitud de ejecución de para encontrar ejecuciones. Todas las ejecuciones deben ser iguales o menores a 2 ya que ninguna ejecución puede ser negativa o 0 (guarda un byte en lugar de==
).fuente
prod(...)
lugar deall(... == 1)
guardar algunos caracteres.>1
?all
era completamente ceros y unos.rle
y usamosdiff
:all(diff(utf8ToInt(readline())%%2))
(recibimos una advertencia, pero no creo que eso sea rechazado)all(numeric(0))
cuál esTRUE
, la respuesta deseada para una longitud de una cadena. (Probé, si es importante, contra R-3.3.1)Pyth ( fork ), 9 bytes
No intente en línea porque la bifurcación no tiene su propia versión en los intérpretes en línea.
Explicación:
fuente
Brachylog , 17 bytes
Pruébalo en línea!
Explicación
fuente
Java 8,
77767257 bytes-4 bytes gracias a @Geobits .
Explicación:
Pruébalo en línea.
fuente
boolean
aquí (lo sé, apesta). Lo mejor que podría obtener de esta manera (72) es usar un flag-int como:boolean c(char[]a){int i=3,b=1;for(int c:a)b=i==(i=c%2)?0:b;return b>0;}
Brain-Flak
155151141121Incluye +3 para -a
Guardado 30 bytes gracias a 1000000000
Salida:
verdadero : 1
falso : 0 en la parte superior de la pila
Pruébalo en línea! (verdad)
Pruébalo en línea! (falso)
Mejor explicación más adelante (si puedo recordar cómo funciona después de unas horas ...)
fuente
Estrellado , 85 bytes
Pruébalo en línea!
Tenga en cuenta que, dado que un programa Starry no tiene forma de saber cuándo termina una entrada de longitud arbitraria, este programa utiliza una nueva línea final en la entrada para marcar el final de la cadena. Si recibe un mensaje de error críptico y un método indefinido
ord
paranil:NilClass
la entrada, falta una nueva línea final.Explicación
La estrategia básica que emplea el programa es leer los caracteres uno por uno desde la entrada y si no son una nueva línea (carácter 10) modifica el valor ASCII del carácter en 2 y encuentra la diferencia entre él y el carácter leído previamente. Si la diferencia es cero, el programa finaliza e imprime
0
(falsey). De lo contrario, el programa se repite y vuelve a realizar el proceso. Si el programa lee una nueva línea, finaliza e imprime10
(verdad).Programa anotado
fuente
Perl, 24 + 1 (
-p
) = 25 bytes-4 bytes gracias a @Ton Hospel !
Necesita
-p
bandera. Salidas 1 es la cadena es par, nada de lo contrario. Por ejemplo :Explicaciones : reemplaza cada carácter por su valor mod 2 (por lo que la cadena contiene solo 0s y 1s después de eso). Luego busque dos siguientes 1 o 0: si encuentra alguno, entonces la cadena no es par, de lo contrario lo es.
fuente
s/./$&&v1/eg;$_=!/(.)\1/
. PS(ord$&)%2
podría haber sido escrito como1&ord$&
v1
?\x01
no lo esJ, 15 bytes
Uso
Explicación
fuente
Vim, 38 bytes
qqs<C-R>=char2nr(@")%2<CR><Esc>l@qq@q:g/00\|11/d<CR>
Asume una cadena de entrada en el búfer y vacía
"q
. Emite tonterías binarias si es verdadero, nada si es falso.s<C-R>=char2nr(@")%2<CR>
: Reemplaza un personaje con 1 si es impar, 0 si es par. La macro en la que se encuentra solo hace esto a todos los caracteres de la línea (no importa cuánto tiempo sea):g/00\|11/d<CR>
: Elimina la línea si 2 "bits" consecutivos tienen el mismo valor. Más rápido que una referencia de referencia.Normalmente, en vimgolf, cuando usa una función de expresión dentro de una macro, se supone que debe hacer la macro en el registro de expresión y usar algunos trucos para completar la pestaña. Eso es más difícil esta vez. Puedo encontrar una manera de acortar eso más tarde.
fuente
Retina , 39 bytes
El recuento de bytes asume la codificación ISO 8859-1.
Salidas
1
para la verdad y0
para la falsedad.Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Explicación
Inspirado por una respuesta de mbomb007 recientemente desarrollé una
ord()
implementación razonablemente corta en Retina. Esto se basa en gran medida en eso, aunque pude hacer algunas simplificaciones ya que no necesito un resultado decimal ya que solo necesito admitir ASCII imprimible (y solo me importa la paridad del resultado, por lo que terminé con un desplazamiento arbitrario también está bien).Etapa 1: Split
Esto simplemente divide la entrada en sus caracteres individuales dividiéndolos alrededor de la coincidencia vacía y soltando los resultados vacíos al principio y al final con
_
.Etapa 2: reemplazar
los
%{
le dice a Retina a) que esta etapa y la siguiente deben ejecutarse en un bucle hasta que la cadena deje de cambiar a través de una iteración completa, y que estas dos etapas deben aplicarse a cada línea (es decir, cada carácter) de la entrada por separado.La etapa en sí es la técnica estándar para duplicar el primer carácter de la entrada. Emparejamos la cadena vacía (pero solo miramos las dos primeras coincidencias) e insertamos el prefijo de esa coincidencia. El prefijo de la primera coincidencia (al comienzo de la cadena) está vacío, por lo que esto no hace nada, y el prefijo de la segunda coincidencia es el primer carácter, que por lo tanto está duplicado.
Etapa 3: transliterar
}
indica el final del ciclo. El escenario en sí mismo es una transliteración.01
indica que solo debe aplicarse al primer carácter de la cadena.p
es una forma abreviada de todos los caracteres ASCII imprimibles y_
significa "eliminar". Entonces, si expandimos esto, la transliteración realiza la siguiente transformación:Entonces, los espacios se eliminan y todos los demás caracteres se reducen. Eso significa que estas dos etapas juntas crearán un rango de caracteres desde el espacio hasta el carácter dado (porque repetidamente duplicarán y disminuirán el primer carácter hasta que se convierta en un espacio en el que se cancele la duplicación y eliminación).
La longitud de este rango se puede usar para determinar la paridad del personaje.
Etapa 4: reemplazar
Simplemente dejamos caer todos los pares de caracteres. Esto borra las líneas de longitud par y reduce las líneas de longitud impar a un solo carácter (el carácter de entrada, de hecho, pero eso realmente no importa).
Etapa 5: partido
Es más fácil encontrar entradas que no sean pares, por lo que contamos el número de coincidencias de dos líneas vacías sucesivas o dos líneas sucesivas no vacías. Deberíamos conseguir
0
contrario, entradas pares y algo distinto de cero.Etapa 6: partido
Todo lo que queda es invertir el resultado, lo que hacemos contando el número de coincidencias de esta expresión regular, que comprueba que la entrada comienza con a
0
. Esto solo es posible si el resultado de la primera etapa fue0
.fuente
Clojure, 59 bytes
Genera todos los pares secuenciales a partir de una cadena
n
y comprueba si la suma de cada par es impar. Si una secuencia de entradas se considera un formato razonable, entonces son 50 bytes.Véalo en línea: https://ideone.com/USeSnk
fuente
Julia,
5553 bytesExplicado
Asigne caracteres a 0 | 1 y compruebe si la cadena resultante contiene "00" u "11", lo que hace que la cadena no se alterne.
fuente
Python, 52 bytes
Una función recursiva. Produce 1 (o True) para cadenas pares, 0 para las impares. Multiplica la paridad de la diferencia de los dos primeros caracteres por el valor recursivo del resto. Una cadena de un solo carácter da Verdadero, como lo verifica igualando su primer carácter. Esto supone que la entrada no está vacía; de lo contrario, se necesita un byte más para
s==s[:1]
olen(s)<2
.Python 2, 52 bytes
Alternativamente, una solución iterativa. Itera sobre los caracteres de entrada, almacenando los valores de caracteres actuales y anteriores mod 2. Multiplica el producto en ejecución por la diferencia, lo cual se debe a 0 (Falsey) solo cuando dos paridades consecutivas son iguales.
El valor "anterior" se inicializa a 2 (o cualquier valor que no sea 0 o 1) para que el primer personaje nunca coincida con la paridad con el personaje anterior ficticio.
Python, 42 bytes, salidas a través del código de salida
Salidas a través del código de salida. Termina con un ZeroDivisionError cuando dos caracteres consecutivos tienen las mismas paridades, de lo contrario termina limpiamente.
fuente
Haskell,
4240 bytesEjemplo de uso:
all odd.(zipWith(-)=<<tail).map fromEnum $ "long"
->True
.Cómo funciona:
Editar: @xnor guardó dos bytes. ¡Gracias!
fuente
all odd.(zipWith(-)=<<tail).map fromEnum
.Mathematica,
4140 Bytes-1 personaje, gracias a Martin Ender
fuente
C, 52 bytes
Compara la paridad de los primeros 2 caracteres, moviéndose recursivamente a través de la cadena hasta encontrar 2 caracteres con la misma paridad o la cadena con la longitud de 1 (
s[1] == 0
).Codifique con algunos de los casos de prueba
fuente
f(char*s){s=s[1]?(*s-s[1])%2?f(s+1):0:1;}
que no necesites int, return o [0]*++s
en lugar del segundos[1]
puede cambiarf(s+1)
af(s)
. eso más mi comentario anterior reduce el total a 39; También debo agregar que la eliminaciónreturn
hace que no funcione en ideone, pero aún funciona con gcc en windowsf(char*s){s=s[1]?(*s-*++s)%2&&f(s):1;}
Pyke, 8 bytes
Pruébalo aquí!
fuente
C #, 69 bytes
Programa completo con casos de prueba:
fuente
PHP, 69 bytes
solución con Regex 81 Bytes
fuente
PowerShell v2 +, 47 bytes
(No se puede bastante coger competidores habituales de PowerShell ...)
Toma la entrada
$args[0]
como una cadena, lachar
convierte como una matriz, la recorre|%{...}
, cada iteración coloca el módulo en la tubería (con implícito[char]
a la[int]
conversión). Éstos se encapsulan en parens y se editan-join
en una cadena, que se introduce en la mano izquierda del-notmatch
operador, verificando00
o11
(es decir, devuelveTrue
si0
s y1
s alternativo). Ese resultado booleano se deja en la tubería y la salida es implícita.Casos de prueba
fuente
> <> ,
2927 bytesEmite 1 si la palabra es par, 0 si la palabra es impar.
Puedes probarlo en línea.
Editar: guardado dos bytes gracias a Martin Ender
fuente
Perl 6,
4726 bytesExpanded:
fuente
Scala, 54 bytes
I'm sure this can be improved.
fuente