Este desafio consiste em duas partes. O vencedor será a solução com a menor contagem total de bytes. O mesmo idioma deve ser usado para ambos os desafios.
Parte 1:
Escreva uma função ou programa que use uma frase com apenas palavras válidas como entrada e produz uma lista dos caracteres usados, o número de vezes que cada letra é usada e o número de letras em cada uma das palavras na frase original. A saída deste programa deve ser válida para o próximo programa (exatamente como é emitida)
Vou adicionar exemplos e regras detalhadas mais adiante.
Parte 2:
Escreva uma função ou programa que use a saída do primeiro programa como entrada e use esta lista de palavras em inglês e recrie uma frase com as informações da saída. A sentença não precisa ser igual à sentença original.
Mais Informações. regras e restrições:
Parte 1:
- A primeira entrada pode estar em qualquer formato adequado, com ou sem aspas, como argumento de função ou de STDIN, com ou sem colchetes, etc.
- A frase de entrada não conterá pontuação ou caracteres especiais, exceto um ponto / ponto no final. Exceto pelo símbolo do período, todos os caracteres que estão na entrada estarão na lista de palavras.
- A primeira letra da frase será em maiúscula, o restante será em minúscula.
- A saída da parte 2 deve começar com a mesma letra maiúscula que a frase original (portanto, a conversão da entrada para minúscula não é recomendada (mas OK).
- A saída pode estar em qualquer formato adequado:
- Deve ser possível copiar e colar a saída diretamente no próximo programa / função
- Nenhuma alteração pode ser feita ao copiar e colar, toda a saída deve ser copiada e colada como um todo, não em partes.
- Por exemplo, você pode imprimir um histograma de todas as letras do alfabeto ou apenas as que são usadas (em geral, o que for necessário para concluir a parte 2)
- Você não pode exibir uma lista de caracteres em que várias ocorrências são repetidas. Por exemplo,
The queue
não pode produzir uma saída:Teeehquu (3,5)
, deve ser algo como:Tehqu, (1 3 1 1 2),(3 5)
.
Parte 2:
- O programa / função deve aceitar a entrada exatamente como na parte 1 (uma exceção, consulte o comentário abaixo sobre como colocar o nome do arquivo como entrada).
- Se colchetes, aspas ou similares forem necessários para analisar a entrada, eles deverão fazer parte da saída da parte 1.
- A lista de palavras pode ser encontrada aqui.
- A lista de palavras pode ser salva localmente como
w.txt
ou pode ser buscada no URL. O URL contará apenas 5 bytes, portanto você não precisa de um encurtador de URL. - Se o programa não puder abrir um arquivo sem ler o nome como uma entrada do STDIN (acredito que esse
sejao caso de Pyth, pelo menos), o nome do arquivo poderá ser considerado como um argumento de entrada separado.
- A lista de palavras pode ser salva localmente como
- A saída deve ser apenas uma frase (lista de palavras válidas), terminando com um ponto final e uma nova linha opcional.
- A saída deve conter palavras com o mesmo número de letras da sentença original na parte 1 (na ordem correta)
- Todas as letras que foram usadas na frase original devem ser usadas na nova saída.
- A frase deve começar com a mesma letra maiúscula que a frase de entrada original e terminar com um ponto.
Ambas as partes:
- Nenhuma das partes deve levar mais de 2 minutos para ser executada (escolher palavras aleatoriamente até que uma solução seja alcançada não é aceito).
Com as regras listadas acima, deve haver uma chance razoável de que a mesma frase seja reproduzida, no entanto, isso não é um requisito.
Exemplos:
Nos exemplos abaixo, são mostrados alguns formatos diferentes de entrada e saída. Muitos mais são aceitos.
Parte 1:
Entrada:
Zulus win.
Tipo de saída 1:
Z i l n s u w
1 1 1 1 1 2 1
5 3
Tipo de saída 2:
(('Z',1),('i',1),('l',1),('n',1),('s',1),('u',2),('w',1)), (5,2)
Tipo de saída 3:
'Zilnsuuw',[1,1,1,1,1,2,1],[5,2]
Parte 2:
Entrada: uma cópia exata da saída da parte 1. Saída:
Zulus win.
Observe que outras combinações de palavras são aceitas desde que comecem com ae Z
a primeira palavra tem 5 letras e a segunda 3.
O código mais curto em bytes vence.
f1
coladaf2
deve conter todos os dados especificados no desafio. Nenhum dado adicional pode fazer parte da saída def1
. Nenhum dado pode ser "armazenado" aof1
disponibilizar as informações ao chamá-lof2
.f1
pode receber apenas uma sequência como entrada por chamada.Respostas:
LabVIEW, 166 Primitivas do LabVIEW
Primeiro de tudo, eu não criei dois programas separados porque o Labview faz o fluxo de dados, então não há realmente nenhuma necessidade.
Salva o histograma com o primeiro elemento = código ascii do resto da primeira letra de 1 a 26 por quantidade. O comprimento simplesmente é salvo em uma matriz.
A primeira palavra possui 3 cheques, primeira letra, comprimento e letras disponíveis no histograma. A verificação da primeira letra é interrompida após a primeira palavra.
Verifico o histograma decrementando-o para cada letra e verificando se ele ficaria abaixo de 0.
Se eu encontrei minha enésima palavra e não há palavras que possam ser construídas a partir das letras que sobraram, começarei a excluir palavras do dictonário e refarei a enésima palavra e assim por diante até encontrar uma solução.
Isso pode ou não funcionar para as frases existentes, pois isso levaria uma eternidade para ser calculado (meu exemplo já levou alguns segundos).
O que eu tentei
fonte
Python 2.7, 353 bytes
Infelizmente, não posso testá-lo com o arquivo ATM w.txt real, porque o QPython para Android parece não conseguir lidar com a E / S do arquivo. Porém, funcionou com os dados que eu copiei e colei.
Parte 1, 76 bytes
No:
'Hi there.'
Fora:
{'H':1, 'i':1, 't':1, 'h':1, 'e':2, 'r':1}, (2, 5)
então, uma lista contendo:
um hashmap com o histograma
uma lista de contagens de letras
Parte 2, 277 bytes
Estou muito feliz por ter conseguido torná-lo 100% puro funcional. Não tenho certeza se isso ajuda com o golfe real, mas eu certamente entendi direito a parte da ofuscação: D Aqui está uma versão mais amigável do pt. 2 (exatamente o mesmo fluxo, mas com nomes de variáveis):
fonte
Perl,
516504 bytesinclui 2x +1 para
-p
Requer ter
w.txt
no formato unix (\n
finais de linha). Usacat
para ler o arquivo; mude paratype
para janelas.Salve o oneliner acima em
534.pl
e execute comoecho Test. | perl -p 534.pl
.Muito grande, mas é um começo - muitas oportunidades de golfe, mas eu só queria publicá-la para tornar a resposta do LabVIEW menos solitária ;-). Omiti as otimizações para execução em menos de um segundo, economizando mais de 30 bytes.
Primeiro trecho (73 bytes):
Produz um histograma e a palavra se prolonga em um formato compacto. Para entrada
Zulus win.
, produz uma saída do tipo 2 sem a(,)
, que não é necessária aqui:Aqui está, não destruído:
Segundo trecho (441 bytes)
Esta parte principal trata da E / S e do tratamento especial da primeira letra, usando sub
g
- rotinas eh
listadas abaixo.Essa função recursiva tira uma cópia do histograma, uma cópia da contagem de palavras restantes e a palavra atual. Se a matriz de comprimento de palavras estiver vazia, retornará true. Caso contrário, diminui a contagem do histograma para as letras da palavra especificada, pega o próximo comprimento de palavra e encontra uma lista de palavras adequadas da lista de palavras. Para cada palavra adequada, ela se repete.
E, finalmente, essa sub-rotina recebe uma palavra e o histograma da frase. Ele calcula um novo histograma para a palavra e verifica se todas as letras não ocorrem com mais frequência do que o permitido pelo histograma da frase.
Você pode colar os trechos não destruídos (
sub i/o/g/h
) em um único arquivo e anexar o código de teste abaixo.substr
e um parâmetro parasub g
.fonte