Dada una cadena no vacía que consta de solo caracteres alfabéticos en mayúsculas y minúsculas y espacios ( [a-zA-Z ]
), reduzca a un fragmento del alfabeto, comenzando con el primer carácter.
Para reducir una cadena, comience con el primer carácter alfabético, luego elimine todos los caracteres que no sean la siguiente letra del alfabeto. Continúa haciendo esto hasta llegar al final de la cadena.
Por ejemplo codegolf
:
Comience con c
, elimine o
ya que no es la siguiente letra del alfabeto.
Mantenga d
como es la siguiente letra del alfabeto, y mantenga e
como es la siguiente letra también.
Retire g
, o
y l
, y mantener f
.
Su fragmento final sería entonces cdef
Reglas
- La capitalización debe mantenerse, por
CodEgolF
lo que daría como resultadoCdEF
- El espacio no es una letra del alfabeto y, por lo tanto, siempre debe eliminarse, incluso si es el comienzo de la cadena
- Debido a la naturaleza de la reducción, el primer carácter alfabético de la entrada siempre será el primer carácter de la salida.
zZ
Es la última letra del alfabeto. No hay letras después, el alfabeto no se repite.
Casos de prueba
codegolf -> cdef
CodEgolf -> CdEf
codeolfg -> cdefg
ProgrammingPuzzles -> P
Stack Exchange -> St
The quick red fox jumped over the lazy brown dog -> Tuvw
Zebra -> Z
Abcdegfhijkl -> Abcdef
Tanteo
Este es el código de golf , ¡por lo que gana menos bytes en cada idioma !
z
, simplemente nos detenemos, ¿verdad?<space>codegolf
Respuestas:
JavaScript (ES6),
66796867 bytes¿Cómo?
Probar letras consecutivas
Debido a que convertir dos caracteres a sus códigos ASCII sería una operación bastante larga en JS, en su lugar utilizamos la siguiente fórmula:
Siempre que tanto a como b estén dentro
[a-zA-Z ]
, la expresión anterior es igual0
si y solo si a y b son letras consecutivas (es decir, dígitos consecutivos en la base 36), sin importar el caso de los caracteres.Por ejemplo:
Formateado y comentado
Casos de prueba
Mostrar fragmento de código
fuente
Python 2 , 69 bytes
Pruébalo en línea!
Una simple reducción de la cuerda. Simplemente concatenamos el siguiente carácter si y solo si
(ord(y)-ord(x[~0]))%32==1
. Verificación muy fea: estoy seguro de que se puede mejorar, ¡pero no estoy seguro de cómo!fuente
from functools import*
.import functools as f
yf.
es mucho más largo quefrom functools import*
seguro, incluso se usa una vez. Vea este hilo para más información.Python 3 ,
75 85 84 91 81 7775 bytesCreo que esto es lo más corto posible en Python 3 . Se puede acortar en unos pocos bytes en Python 2, como se muestra en el envío de Sisyphus .
Pruébalo en línea!
fuente
05AB1E , 13 bytes
Pruébalo en línea!
-1 gracias a Adnan
fuente
ðK
porá
?Brachylog , 15 bytes
Pruébalo en línea!
Esto sería 10 bytes:
⊇.ḷ~sẠ&h~h
si no fuera por la restricción poco interesante "las cadenas pueden comenzar con espacios".Explicación
Como esto es bastante declarativo, esto también es realmente lento.
fuente
MATL ,
181615 bytesGracias a Mr.Xcoder por señalar un error, ahora corregido
Las letras en la salida están separadas por nuevas líneas.
Pruébalo en línea! O verifique todos los casos de prueba (el código de pie de página muestra todas las letras de salida en la misma línea para mayor claridad).
Explicación
fuente
Java (OpenJDK 8) ,
10210174 bytesPruébalo en línea!
-27 bytes gracias a @Olivier Grégoire
fuente
s->{char c=0;for(char x:s)if(c<33&x>33|~-x%32==c%32)System.out.print(c=x);}
(conchar[]
entrada).C # (Mono) ,
129107939187 bytesGuardado 2 bytes gracias a @Mr. Xcoder
Guardado 4 bytes gracias a @jkelm.
Pruébalo en línea!
fuente
(c-1)%32
es~-c%32
PHP, 64 + 1 bytes
Ejecutar como tubería
-nR
o probarlo en línea .Aparte de los trucos habituales: Cuando
$c
alcancesZ
,++$c
resultados enAA
,y
&__
mantiene intacta esa longitud; así$n
que no coincidirá más$c
.fuente
Pyth ,
23 22 2120 bytes-1 byte indirectamente gracias al truco
-Qd
de @Erik the Outgolfer ( ) .-1 byte gracias a @Erik the Outgolfer.
Pruébalo aquí.
fuente
Haskell,
10610597 bytesIntenté usar
fromEnum
aritmética + char en lugar de importarData.Char
, pero eso terminó siendo más largo ...¡Guardado 8 bytes gracias a H.PWiz!
Pruébalo en línea.
fuente
filter
Data.List
Pyth,
212018 bytesPruébalo aquí.
Versión de 20 bytes mucho más eficiente:
Pruébalo aquí.
-1 gracias al Sr. Xcoder (indirectamente).
fuente
.U+b?tlrreb1rZ1kZrz6
(creo). Sin embargo, ese truco me ayudó..U+b?tlrreb1rZ1kZr6
pero, desafortunadamente ,r <str> 6
significaA.strip()
, no eliminar espacios en blanco no iniciales o finales.32
, mientras que todas las letras tienen> 64
, y por lo tanto no afecta la funcionalidad. Creo que esto también se aplica a tu respuesta.Perl 6 , 51 bytes
Pruébalo
Expandido:
Tenga en cuenta que
<!before …>
es una aserción de ancho cerofuente
Jalea , 17 bytes
Pruébalo en línea!
fuente
Japt ,
181716 bytesGuardado 1 byte gracias a @Shaggy
¡Pruébelo en línea!
Estaba pensando que esto sería un poco más corto, pero ... Así es la vida ...
Explicación
fuente
rS
conx
.C # (.NET Core) ,
7060 + 18 bytes-10 bytes gracias a TheLethalCoder
El recuento de bytes también incluye:
Pruébalo en línea!
1 byte más
(actualmente)(no más) que TheLethalCoder's, por lo que se publica por diversión. Enfoque diferente, con LINQ.Esto aprovecha dos características similares a C en C #: una
char
variable de caracteres se comporta implícitamente igual que un enteroint
, y el operador booleano AND&&
no ejecuta la operación correcta si la izquierda devuelve afalse
. Explicación del código:fuente
.ToArray()
mediante la devolución como unIEnumerable<char>
para guardar bytes.q / kdb +,
4745 bytesSolución:
Ejemplos:
Explicación:
Aprovechando el
mod 32
truco de las soluciones existentes junto con la función de convergencia . Iterar sobre la cadena, si la diferencia entre el último elemento del resultado (por ejemplo, comienza conT
"El zorro rojo rápido ...") y el carácter actual es 1 (después de sermod
'd con 32), entonces agregamos esto a el resultado (por lo tanto, tomando por qué tomamoslast x
), luego vuelve todo a una cadena.fuente
Perl 5 , 30 + 1 (-n) = 31 bytes
Pruébalo en línea!
¿Cómo?
fuente
Retina , 76 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Eliminar espacios.
Triplique el primer carácter e inserte un separador.
Convierta los caracteres segundo y tercero a minúsculas e increméntelos. Convierta este último a mayúsculas. Estos son ahora los personajes de búsqueda.
Intenta hacer coincidir cualquiera de los caracteres de búsqueda. Si se encuentra, triplicar la coincidencia, lo que reinicia el ciclo para la próxima búsqueda. De lo contrario, simplemente elimine los caracteres de búsqueda y el resto de la entrada.
fuente
8vo , 114 bytes
Código
Explicación
Ejemplo
fuente
C (gcc) ,
79787570 bytesPruébalo en línea!
fuente
Protón , 59 bytes
Puerto de la presentación de Python 2 .
Pruébalo en línea!
fuente
Pyth, 15 bytes
Banco de pruebas
A diferencia de todas las otras respuestas, esto no une la salida, genera todas las subsecuencias de la entrada, y luego les ordena colocar la cadena deseada al final, y la genera.
fuente
J, solución parcial
Estoy publicando esto para obtener comentarios e ideas para mejorar más que cualquier otra cosa. Funciona, pero no maneja los casos de mayúsculas y espacio, y ya es largo para J.
Primero, un verbo auxiliar diádico que te dice si los argumentos izquierdo y derecho son alfabéticamente adyacentes:
A continuación, un verbo que elimina el primer elemento que no forma parte de una línea alfabética a partir del primer elemento:
Tenga en cuenta que usamos Adverso
::
para devolver el argumento completo sin cambios si no se encuentra un elemento que no sea una raya (es decir, si todo el argumento es una racha alfabética válida).Finalmente, la solución se da aplicando
f
hasta la convergencia:Pruébalo en línea!
Y aquí hay una versión analizada
f
para facilitar la lectura:Pregunta secundaria : ¿por qué los caracteres del cuadro no se alinean perfectamente cuando se muestran en SO (funcionan en mi consola):
fuente