Un pangrama es una oración o extracto que contiene las veintiséis letras del alfabeto, como se demuestra en este código de desafío de golf . Sin embargo, una ventana pangramática es un pangrama en forma de algún segmento de texto, que puede terminar o comenzar a la mitad de una palabra, que se encuentra en algún lugar dentro de un trabajo más grande. Estos ocurren naturalmente en todas partes, siendo subconjuntos apropiados de pangramas verdaderos, por lo que solo verificar si algo contiene una ventana pangramática sería aburrido y también se hizo previamente.
Por lo tanto, ¡estamos interesados en encontrar el más pequeño que haya en un texto determinado en función de la longitud de su letra! En el código más corto posible en bytes, por supuesto, para ajustarse al tema.
Reglas y guías
- Reciba una cadena como entrada y devuelva la cadena de la ventana pangramática más pequeña en la entrada si hay una. Si no lo hay, devuelva un Falso booleano o una cadena vacía.
- Si una cadena es una ventana pangramática o no distingue entre mayúsculas y minúsculas y solo depende de las 26 letras, no de signos de puntuación o números u otros símbolos impares.
- Del mismo modo, la longitud de las letras de una ventana pangramática es el número total de la cantidad de apariciones de letras que aparecen solo en ella, y no simplemente el número de cada carácter. El valor devuelto debe ser el más pequeño según este recuento. Somos lingüistas, después de todo, no programadores.
- Sin embargo, una salida de una ventana pangramática debe ser una subcadena exacta de la entrada, que contenga la misma mayúscula y puntuación, etc.
- Si hay varias ventanas pangramáticas más cortas de la misma longitud de letra, devuelva cualquiera de ellas.
Casos de prueba
'This isn't a pangram.'
==> False
'Everyone knows about that infamous Quick-Brown-Fox (the one who jumped over some lazy ignoramus of a dog so many years ago).'
==> 'Quick-Brown-Fox (the one who jumped over some lazy ig'
'"The five boxing wizards jump quickly." stated Johnny, before beginning to recite the alphabet with a bunch of semicolons in the middle. "ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ!" he shouted to the heavens.'
==> 'ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ'
The five boxing wizards jump quickly
devuelve?Q
? No se suma al recuento de letras.Respuestas:
Pyth,
201614 bytesExplicación:
Pruébalo aquí!
Cuando no hay una solución correcta, el programa sale con un error sin salida a stdout.
fuente
!-GrT0
es más corto para la condición del filtro, creo. También creo que necesitasl
para que el ordenamiento funcione correctamente.l
, y sin él obtienes resultados diferentes . Creo que el problema son las letras repetidas, pero no estoy 100% seguro.Pyth - 22 bytes
\ o / FGITW!
Test Suite .
fuente
Ruby, 100 bytes
Devuelve nil si no se encuentra ninguna ventana.
fuente
JavaScript (ES6),
139138136 bytes¡Ahorré 2 bytes gracias a @Neil!
Sangrado
fuente
[r=l="",...s].map((_,b,a)=>
?map
función.PowerShell v2 +, 218 bytes
Sí, por lo que la manipulación de subcadenas (no hay incorporados) no es realmente el fuerte de PowerShell ...
Tomamos información
param($a)
y establecemos una nueva tabla hash vacía$z
. Este será nuestro almacenamiento de subcadenas pangramáticas candidatas.Usando una ligera modificación de mi código de Subcadenas explotadas , construimos todas las subcadenas de la entrada. Sí, incluso subcadenas de un solo carácter de puntuación. Este es el código de golf , no el código más rápido . ;-)
Todas esas subcadenas se encapsulan en parens y se canalizan a otro bucle con
|%{...}
. Establecemos temporalmente$y
nuestra subcadena actual, establecemos un contador auxiliar$j
e iniciamos otro ciclo65..90|%{...}
, convenientemente sobre los códigos de caracteres ASCII para letras mayúsculas. Tomamos cada bucle interno, lo ponemos$y
todo en mayúscula y sacamos.IndexOf
ese char en particular. Como esto regresará-1
si no se encuentra, tenemos+1
el resultado antes de multiplicarlo en$j
. Esto garantiza que si no se encuentra ningún carácter,$j
será igual a cero.De eso se trata exactamente
if
. Si$j
no es cero, eso significa que cada letra se encontró al menos una vez en la subcadena$y
, por lo que debemos agregarla a nuestro grupo de candidatos. Lo hacemos tomando$y
e ingiriendo-replace
cada no letra sin nada, lo que nos da la longitud de la letra de esa subcadena. Lo usamos como índice en hashtable$z
y store$y
en ese índice. Esto tiene la peculiaridad de sobrescribir subcadenas de la misma longitud de letra con la que aparece "más lejos" en la cadena original, pero eso está permitido por las reglas, ya que solo nos preocupa la longitud de la letra.Finalmente, tenemos que clasificar
$z
y sacar el más pequeño. Tenemos que usar la.GetEnumerator
llamada para ordenar los objetos dentro$z
, luegosort
los que están enName
(es decir, el índice de longitud desde arriba), seleccionando el[0]
uno (es decir, el más corto) y generando su.Value
(es decir, la subcadena). Si no se ajusta dicha subcadena, esto arrojará un error (Cannot index into a null array
) cuando intente$z
indexarse y no muestre nada, lo cual es falso en PowerShell. (el tercer caso de prueba a continuación tiene un reparto explícito[bool]
para mostrar esto)Casos de prueba
fuente
Haskell, 180 bytes
Esto fue difícil, pero realmente divertido sin importaciones.
Mucho menos golfizado:
Sorpresa, sorpresa: es realmente lento.
fuente
Oracle SQL 11.2, 461 bytes
Sin golf
La
s
vista divide la entrada en caracteres y también devuelve la posición de cada carácter.La vista recursiva
v
devuelve cada subcadena de la entradas es la subcadena
f la posición del primer carácter de la subcadena
l la posición del último carácter agregado a la subcadena actual
La
c
vista devuelve el alfabeto, una letra a la vez.La
a
vista devuelve el alfabeto concatenado como una sola cadenaSELECT s,f,SUM(SIGN(INSTR(LOWER(s),c))
Devuelve para cada subcadena el número de letras distintas presentes en ella
INSTR
devuelve la posición de una letra en la subcadena, 0 si no está presenteSIGN
devuelve 1 si pos> 0, 0 si pos = 0WHERE x=26
Filtra la subcadena que contiene el alfabeto completo
TRANSLATE(LOWER(s),' '||a,' ')
Elimina todas las letras de la subcadena.
LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')
La longitud en letras es la longitud de la subcadena menos la longitud de la subcadena sin letras
SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')),0))
Mantiene solo la subcadena con el recuento de letras más pequeño.
Si hay más de uno, el primero, ordenado como cadenas ascendentes, se mantiene
fuente
Python 3,
171, 167, 163, 157, 149 bytes.Guardado 4 bytes gracias a DSM.
Guardado 8 bytes gracias a RootTwo.
Tener que ordenar según la cantidad de letras me está matando.
Casos de prueba:
fuente
.upper()
es necesario en la función clave.PowerShell (v4),
198156bytesCasos de prueba
Explicación sin fundamento del original
Es un bucle anidado de fuerza bruta que hace que las ventanas deslizantes de todos los tamaños:
Para cada ventana, filtra solo las letras (coincidencia de expresiones regulares que no distingue entre mayúsculas y minúsculas), ejecuta los caracteres restantes a través de un filtro único, verifica si hay 26 caracteres únicos como prueba de pangrama.
Todas las ventanas con pangramas se convierten en trillizos de (número de letras que incluyen duplicados, índice de inicio, longitud de la ventana que incluye puntuación) , que se ordenan para encontrar el más corto por recuento general de caracteres, el primero se selecciona y la cadena de salida se construye a partir de ese .
Hay una gran cantidad de indexación fuera de los límites de la cadena, que PowerShell devuelve $ nulo, en lugar de generar excepciones.
NÓTESE BIEN. el nuevo 156 byte uno es el mismo enfoque, pero reescrito para usar la tubería mucho más.
NÓTESE BIEN. No estoy seguro de que la versión sin golf funcione, porque no escribí eso y luego la golfé, es solo para exposición.
fuente
Haskell, 123 bytes
Define una función
h
, que devuelve la lista vacía si no hay una ventana pangramática o una lista de un elemento con la ventana mínima. Ejemplo de uso:Cómo funciona:
fuente