Um pangram é uma frase ou trecho que contém todas as 26 letras do alfabeto, conforme demonstrado neste desafio de golfe com código . No entanto, uma janela pangramática é um pangram na forma de algum segmento de texto, que pode terminar ou começar no meio de uma palavra, encontrada em algum lugar de um trabalho maior. Estes ocorrem naturalmente em todos os lugares, sendo subconjuntos adequados de pangramas verdadeiros; portanto, apenas verificar se algo contém uma janela pangramática seria chato e também foi feito anteriormente.
Portanto, estamos interessados em encontrar o menor em um determinado pedaço de texto com base no tamanho da letra! No menor código possível em bytes, é claro, para se ajustar ao tema.
Regras e Diretrizes
- Receba uma string como entrada e retorne a string da menor janela pangramática da entrada, se houver uma. Se não houver, retorne um Boolean False ou uma string vazia.
- Se uma sequência é uma janela pangramática ou não faz distinção entre maiúsculas e minúsculas e depende apenas das 26 letras, não de qualquer pontuação ou número ou outro símbolo ímpar.
- Da mesma forma, o tamanho das letras de uma janela pangramática é o número total de quantas aparências de letras ocorrem somente nela, e não simplesmente o número de cada caractere. O valor retornado deve ser menor com base nessa contagem. Afinal, somos linguistas, não programadores.
- Uma saída de uma janela pangramática deve, no entanto, ser uma substring exata da entrada, contendo a mesma capitalização e pontuação, etc.
- Se houver várias janelas pangramáticas mais curtas do mesmo tamanho de letra, retorne qualquer uma delas.
Casos de teste
'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
retornado?Q
? Não adiciona à contagem de letras.Respostas:
Pitão,
201614 bytesExplicação:
Experimente aqui!
Quando não há uma solução correta, o programa sai com um erro sem saída para stdout.
fonte
!-GrT0
é mais curto para a condição do filtro, acredito. Também acho que você precisa fazerl
com que a classificação funcione corretamente.l
, e sem ele você obtém resultados diferentes . Acredito que o problema sejam cartas repetidas, mas não tenho 100% de certeza.Pitão - 22 bytes
\ o / FGITW!
Conjunto de Teste .
fonte
Ruby, 100 bytes
Retorna nulo se nenhuma janela for encontrada.
fonte
JavaScript (ES6),
139138136 bytesEconomizou 2 bytes graças a @Neil!
Recuado
fonte
[r=l="",...s].map((_,b,a)=>
?map
função.PowerShell v2 +, 218 bytes
Sim, então a manipulação de substring (não há embutidos) não é realmente o ponto forte do PowerShell ...
Nós recebemos informações
param($a)
e definimos uma nova hashtable vazia$z
. Este será o nosso armazenamento de substratos pangramáticos candidatos.Usando uma ligeira modificação do meu código de Exploded Substrings , construímos todas as substrings da entrada. Sim, mesmo substrings de pontuação com apenas um caractere. Isso é código-golfe , não código mais rápido . ;-)
Todas essas substrings são encapsuladas em parênteses e canalizadas para outro loop com
|%{...}
. Definimos temporariamente$y
a nossa substring atual, definimos um contador auxiliar$j
e iniciamos outro loop65..90|%{...}
, convenientemente sobre os códigos de caracteres ASCII para letras maiúsculas. Cada loop interno, pegamos, colocamos$y
tudo em maiúsculas e puxamos o.IndexOf
caractere específico. Como isso retornará-1
se não for encontrado, obtemos+1
o resultado antes de multiplicá-lo$j
. Isso garante que, se algum caractere não for encontrado,$j
será igual a zero.Qual é exatamente o que o
if
se trata. Se$j
for diferente de zero, significa que todas as letras foram encontradas pelo menos uma vez na substring$y
; portanto, precisamos adicioná-las ao nosso pool de candidatos. Fazemos isso pegando$y
e-replace
não cada letra que não seja nada, o que nos dá o tamanho da letra dessa substring. Usamos isso como índice em hashtable$z
e armazenamos$y
nesse índice. Isso tem a peculiaridade de substituir substrings do mesmo tamanho de letra pelo que ocorre "mais longe" na string original, mas isso é permitido pelas regras, pois estamos preocupados apenas com o tamanho da letra.Finalmente, precisamos classificar
$z
e extrair o menor. Temos que usar a.GetEnumerator
chamada para classificar os objetos dentro$z
, entãosort
os ativadosName
(ou seja, o índice de comprimento acima), selecionando o[0]
primeiro (ou seja, o mais curto) e exibindo seu.Value
(ou seja, a substring). Se nenhuma substring se encaixar, isso gerará um erro (Cannot index into a null array
) ao tentar indexar$z
e não produzir nada, o que é falso no PowerShell. (o terceiro caso de teste abaixo tem um elenco explícito[bool]
para mostrar isso)Casos de teste
fonte
Haskell, 180 bytes
Isso foi difícil, mas muito divertido sem importações.
Muito menos golfe:
Surpresa, surpresa: é muito lento.
fonte
Oracle SQL 11.2, 461 bytes
Sem golfe
o
s
exibição divide a entrada em caracteres e também retorna a posição de cada caractere.A vista recursiva
v
retorna cada substring da entradas é o substring
da posição do primeiro caractere do substring
l a posição do último caractere adicionado ao substring atual
A
c
exibição retorna o alfabeto, uma letra de cada vezA
a
exibição retorna o alfabeto concatenado como uma única sequênciaSELECT s,f,SUM(SIGN(INSTR(LOWER(s),c))
Retorna para cada substring o número de letras distintas presentes,
INSTR
retorna a posição de uma letra na substring, 0 se não estiver presente,SIGN
retorna 1 se pos> 0, 0 se pos = 0WHERE x=26
Filtra a substring que contém o alfabeto inteiro
TRANSLATE(LOWER(s),' '||a,' ')
Exclui todas as letras da substring
LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')
Comprimento em letras é o comprimento da substring menos o comprimento da subtring sem letras
SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')),0))
Mantém apenas a substring com a contagem menor de letras.
Se houver mais de um, o primeiro, classificado como cadeias ascendentes, é mantido
fonte
Python 3,
171, 167, 163, 157, 149 bytes.Economizou 4 bytes graças ao DSM.
Economizou 8 bytes graças ao RootTwo.
Ter que classificar com base no número de letras está me matando.
Casos de teste:
fonte
.upper()
é necessário na função principal.PowerShell (v4),
198156 bytesCasos de teste
Explicação ungolfed do original
É um loop aninhado de força bruta que cria janelas deslizantes de todos os tamanhos:
Para cada janela, ele filtra apenas as letras (correspondência sem distinção entre maiúsculas e minúsculas por padrão), executa os caracteres restantes por meio de um filtro exclusivo, verifica se há 26 caracteres únicos no teste do pangram.
Todas as janelas com pangramas são transformadas em trigêmeos de (número de letras incluindo dupes, índice inicial, comprimento da janela incluindo pontuação) , que são classificadas para encontrar o menor número total de caracteres, o primeiro é escolhido e a sequência de saída criada a partir disso .
Há muita indexação fora dos limites da string, para a qual o PowerShell retorna útil $ null, em vez de lançar exceções.
NB o novo 156 bytes é a mesma abordagem, mas reescrito para usar o pipeline muito mais.
NB não sei se a versão não-gasta funciona, porque eu não escrevi isso e depois joguei, é apenas para exposição.
fonte
Haskell, 123 bytes
Define uma função
h
que retorna a lista vazia se não houver janela pangramática ou uma lista de um elemento com a janela mínima. Exemplo de uso:Como funciona:
fonte