Um haiku é um poema com três linhas, com uma contagem de sílabas de 5/7/5 , respectivamente.
Um haiku-w é um poema com três linhas, com uma contagem de 5/7/5 palavras , respectivamente.
Desafio
Escreva um programa que retorne true se a entrada for um haiku-w e false se não.
Uma entrada válida do haiku-w deve consistir em 3 linhas, separadas por uma nova linha.
- A linha 1 deve consistir em 5 palavras, cada palavra separada por um espaço.
- A linha 2 deve consistir em 7 palavras, cada palavra separada por um espaço.
- A linha 3 deve consistir em 5 palavras, cada palavra separada por um espaço.
Exemplos
The man in the suit
is the same man from the store.
He is a cool guy.
Resultado: Verdadeiro
Whitecaps on the bay:
A broken signboard banging
In the April wind.
Resultado: Falso
Regras
- Isso é código-golfe , então a resposta mais curta em bytes vence.
- Aplicam-se lacunas de código-golfe padrão. É proibido fazer batota.
- Outros valores de retorno booleano, como
1
e0
, são aceitáveis. - Também é aceitável uma lista de seqüências de comprimento 3 como entrada.
- As entradas válidas do haiku-w não devem ter espaços à esquerda ou à direita ou vários espaços que separam as palavras.
code-golf
decision-problem
DomTheDeveloper
fonte
fonte
Respostas:
JavaScript (ES6),
73726463544239 bytesAgradecimentos a Neil por salvar 13 bytes
Explicação
Essa é uma função de seta gorda que aceita uma matriz de seqüências de caracteres como argumento. Ele substitui cada linha pela contagem de palavras. Se for um haiku-w,
a
agora contém uma matriz de cinco, sete e cinco novamente. Como o JavaScript não nos permite comparar duas matrizes ao mesmo tempo, a matriz é convertida em uma string primeiro e depois comparada. Isso resulta em um booleano retornado.fonte
%
e*
tem a mesma precedência, então você não precisa dos()
s, embora eu ache(d*2|5)
que também possa funcionar. Além disso, você pode se safar de um single&
, embora eu ache que você pode melhorar isso mesmo usando(b...).length==3>b.some(...length-...)
.a=>a.map(c=>c.split
.length)=='5,7,5'
.+''
-==
se o outro argumento for uma string.AWK (GNU Awk),
24,30,28., 20 bytesGolfe
Produzirá "517253" para True e uma string vazia para False .
O Guia do Usuário do GNU Awk
Como funciona
Cada instrução awk (regra) consiste em um padrão (ou expressão) com uma ação associada:
O Awk lerá a entrada linha por linha (registro por registro) e avaliará a expressão do padrão para ver se uma ação correspondente deve ser chamada.
O código acima é uma expressão autônoma do Awk (padrão) sem o bloco de ação, o que está implícito
{print $0}
nesse caso.Deve ser lido da direita para a esquerda:
q=q NF NR
Acrescentar um N úmero de F fields (palavras) e N úmero de R ecords (isto é, o número de linha de corrente), para a variável q .
Dessa forma, ao processar um Haiku-w adequado, q será definido como:
$0=q
Atribua o valor recém-calculado de q a $ 0 (que mantém a linha / registro atual inteira por padrão).
517253==$0
Compare com uma "assinatura" para um Haiku-w (517253) adequado, se houver uma correspondência, a expressão inteira será avaliada como "true" e uma ação correspondente (implícita
print $0
) será executada, enviando "517253" para stdout (True) , caso contrário, a saída estará vazia (False).Observe que isso reconhecerá corretamente um Haiku-w, mesmo se for seguido por um número arbitrário de linhas de lixo, mas acredito que esteja bem, pois:
(ou seja, podemos assumir que a entrada tenha 3 linhas)
Teste
Experimente Online!
fonte
Python , 42 bytes
Experimente online!
Recebe a entrada como uma lista de linhas, com as palavras separadas por espaços únicos.
Como garantimos que não haverá espaços iniciais ou finais, e apenas espaços únicos separarão cada palavra, podemos verificar um w-haiku simplesmente contando os espaços em cada linha.
Fazemos isso em uma compreensão de lista, para criar uma lista das contagens de espaço. Se for um haiku correto, deve parecer
[4, 6, 4]
, então comparamos com isso e retornamos o resultado.fonte
map(str.count,l,' ')
.Geléia ,
109 bytesExperimente online!
Explicação
fonte
ċ€⁶⁼4,6,4
eċ€⁶⁼464D¤
... não consigo encontrar nada mais curto, no entanto. (Oh, você pode lançá-lo, também:464D⁼ċ€⁶$
)ċ€⁶Ḍ=464
funciona bem para 8.Lote, 102 bytes
Sai com nível de erro diferente de zero assim que lê uma linha com o número errado de palavras.
fonte
Mathematica, 21 bytes
Função sem nome, tendo uma lista de listas de caracteres como entrada e retorno
True
ouFalse
. Simplesmente conta quantos espaços existem em cada lista de caracteres, que segundo as regras do desafio se correlacionam perfeitamente com o número de palavras em cada linha.Submissão anterior:
Mathematica, 31 bytes
Função sem nome, tendo uma lista de seqüências de caracteres como entrada e retorno
True
ouFalse
.fonte
Haskell,
3433 bytesExperimente online! .
Edit: obrigado a @xnor por um byte!
fonte
f l=[sum[1|' '<-c]|c<-l]==[4,6,4]
.Retina , 12 bytes
(existe um espaço à direita após a primeira linha)
Experimente online!
M%`
- Conte o número de espaços em cada linha.M
- Modo de correspondência - imprima o número de correspondências.%
- para cada linha`
- configuração separada e padrão regex^4¶6¶4$
- Deve haver 4, 6 e 4 espaços e exatamente três linhas.¶
corresponde a novas linhas. O resto é uma expressão regular simples.Imprime
1
para entrada válida,0
inválida.fonte
Python,
5844 bytes-14 por tbodt
fonte
split("\n")
.lambda h:[len(l.split())for l in h]==[5,7,5]
Perl , 26 bytes
24 bytes de código + 2 bytes para
-ap
sinalizadores.Experimente online!
fonte
Pitão, 9 bytes
Um programa que recebe a entrada de uma lista
"quoted strings"
e imprimeTrue
ouFalse
conforme apropriado.Suíte de teste
Como funciona
fonte
Japonês , 11 bytes
Economizou muitos bytes graças a @ETHproductions
Isso leva uma matriz de três strings como entrada.
Execute-o online!
fonte
PowerShell , 43 bytes
Experimente online!
Explicação
Recebe entrada como uma sequência separada por nova linha.
Remove todo o espaço não em branco e verifica se ele corresponde exatamente a "4 espaços, nova linha, 6 espaços, nova linha, 4 espaços nova linha", usando uma regex.
O grupo de captura corresponde a 4 espaços, a
\1
referência anterior refere-se a isso. Novas linhas são incorporadas na sequência. Observe que a segunda linha do regex contém dois espaços após a referência anterior.fonte
Pyke,
119 bytesExperimente aqui!
Após o
u
byte, existem os seguintes bytes:0x03 0x04 0x06 0x04
fonte
J, 12 bytes
A entrada é uma lista em caixa de strings.
Explicação
Este é um garfo com um dente esquerdo constante. Isso verifica o resultado do dente certo,,
#@;:@>
para igualdade com4 6 4
. A hora certa desmarca cada (>
), depois (@
) converte cada sequência em palavras (;:
) e depois (@
) assume o comprimento de cada (#
).fonte
R, 48 bytes
Lê um vetor de caracteres de três tamanhos de stdin e funciona contando o número de espaços. Para contar o número de espaços que usamos
str_count
dostringr
pacote, que pode contar ocorrências com base em um padrão regex.Uma abordagem alternativa sem o uso de pacotes pode ser:
fonte
el
antes, obrigado por isso.C 142 bytes
Versão não destruída:
Retorna 1 para 5/7/5 da sequência 0.
Um teste positivo:
fonte
C ++, 357 bytes
Tipo de código novo para o golfe, mas é o melhor que posso fazer rapidamente
fonte
Ruby 1.9.3
Não é um jogador de golfe, mas é um haiku-w
ou...
Infelizmente, não funciona com espaços em branco à esquerda em nenhuma linha, mas lida com a direita.
fonte
Python 2 ,
5764 bytesEditar Corrigido com a adição de 7 bytes após o feedback do @Dada. Obrigado!
Experimente online!
Não é a resposta mais curta do Python, mas queria apenas usar o novo truque que aprendi recentemente
input()
para exibir a saída e salvar umaprint
declaração. Toma uma lista de linhas como entrada. Requer Ctrl C (ou qualquer outra tecla pressionada) para finalizar o programa (com exceção) em um terminal, mas funciona bem sem o TIO.fonte
MATL, 16 bytes
A entrada é uma matriz de células de strings e retorna uma matriz de verdade ou falsey .
Experimente Online
Explicação
fonte
MATLAB / oitava, 38 bytes
Esta solução aceita uma matriz de células de cadeias como entrada, conta o número de espaços em cada linha e compara o resultado à matriz
[4 6 4]
e gera uma matriz de verdade (todos os valores são 1) ou falsey (qualquer valor é zero).Demonstração online
fonte
Perl 6 , 25 bytes
fonte
Clojure, 44 bytes
Entrada é uma lista de cadeias. A função encontra apenas espaços e os conta. Esta explicação é um haiku. :)
fonte
Java 7, 154 bytes
O requisito do programa e o potencial de ter menos ou mais de três linhas, sem mencionar muito a verbosidade do Java, faz com que esse código 'golfado' seja muito grande.
Ungolfed:
Experimente aqui.
fonte
SimpleTemplate, 77 bytes
Infelizmente, a abordagem da expressão regular é a mais curta.
Requer que o texto seja fornecido como o primeiro argumento, com novas linhas no estilo * NIX. Isso não funcionará com novas linhas no estilo Windows.
Ungolfed:
Não baseado em regex, 114 bytes
Isso requer que cada linha seja fornecida como argumento para a função.
Ungolfed:
fonte
Empilhados, 22 bytes
Recebe entrada da parte superior da pilha como uma lista de cadeias de caracteres, como:
Explicação
fonte
Java (OpenJDK) , 82 bytes
-2 bytes graças a @ corvus_192!
Experimente online!
Parece tão fácil de jogar, mas sem uma função de mapa embutida, não consigo encontrar um bom caminho. A iteração na matriz é mais alguns bytes, assim como a escrita de uma função de mapa usando fluxos.
A expressão lambda pega uma matriz de Strings e retorna um booleano.
fonte
Arrays.stream
, mas isso é tempo suficiente para que ele não pode valer a pena usar (especialmente se você precisar de importaçãoArrays
)&
vez de&&
salvar dois bytesSmileBASIC,
9694 bytesfonte
R, 100 bytes
Toma como argumento uma lista de seqüências de caracteres de comprimento 3. Provavelmente não será mais jogado, já que o golfe o transforma na resposta de @ Billywob.
fonte