Meu colega recentemente me enviou a seguinte peça de JavaScript como uma piada:
let butScript = (nrOfButs) => {
for(var i = 0; i < nrOfButs; i++){
if(i % 3 == 0){
console.log("Yeah")
}
if(i % 2 == 0){
console.log("But")
}
if(i % 3 == 1){
console.log("No")
}
}
}
Como o código foi escrito durante o horário de trabalho, era obviamente um enorme desperdício de recursos da empresa. Para evitar ocorrências semelhantes no futuro, devemos minimizar o desperdício de horas trabalhadas. E como é de conhecimento geral que um programa mais curto é mais rápido de escrever, devemos aplicar esse código no menor tempo possível!
Entrada
Um único inteiro não negativo. Você não deve lidar com entradas defeituosas.
Resultado
Seu programa deve produzir uma saída idêntica à do script acima. Você deve produzir uma palavra por linha e o número de palavras deve ser consistente com o script original.
É permitido incluir caracteres de espaço em branco que não sejam de nova linha no final de cada linha (mas não no início), pois são invisíveis. Um caractere de nova linha adicional é permitido no final da saída.
Exemplos
Input: 0
Output:
Input: 1
Output:
Yeah
But
Input: 2
Output:
Yeah
But
No
Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
nrOfButs
variável é muito mal nomeada e enganosa. Bom desafio simples de qualquer maneira.if
queda de s e continue no loop atual se sua condição for satisfeita.Respostas:
Excel, 78 bytes
Pressupõe a entrada na célula A1 e a formatação do Wordwrap está ativada para a célula. Use Alt + Enter para adicionar feeds de linha dentro da string e observe o espaço em branco. Somente lida com entrada de até 3570 devido ao limite da função REPT (embora boa sorte seja a obtenção de uma célula tão alta).
Reimpressão, com períodos para espaço em branco
Como funciona: o padrão se repete a cada 6 números:
Cada um deles pode ser expresso com 9 caracteres; portanto, uma seqüência de caracteres é composta por 54 caracteres (9 * 6) e repetida do tamanho que o Excel permitir. Em seguida, são aceitos os 9 caracteres esquerdos * (número de entradas) como saída.
O avanço de linha para o "mas e ninguém" é colocado após o espaço em branco, para que o Sim para # 6, 12, (etc) seja formatado para a esquerda e não para a direita, e para que não haja avanço de linha em branco adicionado a cada 6ª linha para esse item.
fonte
JavaScript (ES6),
5957 bytesExperimente online!
Quão?
Usamos uma função recursiva que vai de a 1 em vez de 0 a n - 1 .n 1 0 0 n - 1
Como resultado, os testes são desativados em comparação com o código de referência:1
Isso nos permite armazenar o caso mais simples como a primeira entrada da nossa matriz de pesquisa, onde podemos definir s : uma variável contendo umaou uma string vazia.n ≡ 0( mod3 ) s
"But\n"
As duas outras entradas são definidas como
"Yeah\n" + s
es + "No\n"
respectivamente.Nota: Ao iterar de a 0 , poderíamos definir s na primeira entrada também, mas isso custaria dois parênteses extras .n - 1 0 0 s
Comentado
fonte
LOLCODE , 257 bytes
Experimente online!
fonte
VISIBLE "But"
se à falta de calças do programa?Espaço em branco ,
315304300277276 bytesGraças ao @JoKing por -11 bytes (reduzindo a quantidade de rótulos usados de 8 para 7) e -24 mais bytes (alterando o fluxo geral do programa e reduzindo a quantidade de rótulos usados de 7 para 5 no processo).
Letras
S
(espaço),T
(tabulação) eN
(nova linha) adicionadas apenas como destaque.[..._some_action]
adicionado apenas como explicação.Experimente online (apenas com espaços brutos, guias e novas linhas).
O espaço em branco definitivamente não é o idioma certo para esse desafio. No espaço em branco, os loops e as declarações if são feitos com rótulos e salta para rótulos e, como não são casos if-elseif-else, mas múltiplos if-cases,
significa que eu terá que voltar depois de cada if, tornando-o bastante longo, significa que terei que modificar ligeiramente as verificações para pular algumas impressões (obrigado @JoKing ).Explicação em pseudo-código:
Explicação adicional:
Em geral, ele faz um loop da entrada para 0, pressionando uma nova linha e a palavra invertida (na ordem "\ noN", "\ ntuB", "\ nhaeY" em vez de "Yeah \ n", "But \ n ", "Não"). E depois que a entrada tiver diminuído para 0 e todos os caracteres estiverem na pilha, os caracteres serão impressos no sentido inverso (portanto, a ordem de saída correta).
Mais detalhadamente, no entanto: embora seja necessário imprimir palavras no intervalo
(input, 0]
, ele será repetido no intervalo[input, 0)
. Por esseif(i%3 == 2)
motivo , podemos usar a verificação de "\ noN" (ou, na verdade,if(i%3 != 2)
ignorar o envio de "\ noN") e usar a verificaçãoif(i%2 != 1)
de "\ ntuB" (ou, na verdade,if(i%2 == 0)
ignorar a solicitação de "\ ntuB" ) Somente após essas duas verificações, diminuímos a iteraçãoi
em 1. E, em seguida, faça a verificaçãoif(i%3 == 0)
para pressionar "\ nhaeY", semelhante ao código de exemplo JS na descrição do desafio. Ignorando as verificações se não, em vez de ir para um rótulo e retornando do rótulo com as verificações se salvas 23 bytes.Além disso, no espaço em branco, os valores dos caracteres são armazenados na pilha como valores unicode (ou seja,
10
para novas linhas,65
para 'A',97
para 'a' etc.). Como já preciso percorrer a pilha para imprimir os caracteres, também posso usar minha dica de espaço em branco para diminuir a contagem de bytes, adicionando uma constante aos valores numéricos, antes de imprimi-los como caracteres.Essa constante é
104
neste caso, que é gerada com este programa Java que eu também usei para obter outra resposta em branco do Whitespace antes . Essa também é a razão pela qual esta parte do código:tem os valores
-94
para a nova linha,7
para o 'o' e-26
para o 'N'. Porque adicionando a constante de104
vontade dar corretamente nossos valores unicode10
,111
e78
para esses caracteres, respectivamente.fonte
if i modulo-3 != 1 jump to next if else push NO
i
antes daif(i is 0) call PRINT
verdade é verdadeira, mas o seu outro está verificando ai
antes de subtraí-la e pulando as impressões. Muito inteligente, na verdade. Continuará a implementá-lo.Python 3 ,
8582 bytesExperimente online!
Python 3 ,
7976 bytesPorto de Keeta 's resposta Excel .
Experimente online!
fonte
Perl 6 ,
6350 bytesExperimente online!
Bloco de código anônimo que pega um número e retorna uma lista de linhas
Explicação:
fonte
C (gcc) , 75 bytes
Experimente online!
C (gcc) , 60 + 11 = 71 bytes (usando
-D$=||puts(
)Experimente online!
fonte
05AB1E (legado) ,
272524 bytesGuardou 1 byte graças a Kevin Cruijssen .
Experimente online!
Explicação
fonte
×
, não tinha pensado nisso!Θ
agora que não está mais usando×
, uma vezÏ
que apenas olhará1
apenas s, portanto ele ignora o2
(e, é0
claro).Python 2 , 73 bytes
Experimente online!
fonte
Python 2 ,
979592908381 bytesExperimente online!
-2 bytes, graças a ovs
Python 3 ,
92908583 bytesExperimente online!
-4 bytes, graças a ovs
-4 bytes, graças a Jo King
fonte
len(w)<3
->'N'in w
, 81 bytes :len(w)%2
->(w<'N')
Tela , 27 bytes
Experimente aqui!
fonte
Groovy (função), 79 bytes
Desde que enviei minha resposta inicialmente, examinei aqui algumas discussões históricas sobre o que constitui uma resposta adequada. Como parece comumente aceito fornecer apenas um método em Java (incluindo declarações de tipo e parâmetro de retorno), aqui está um método Groovy mais curto, que tem o valor de retorno do método como resposta. O uso de
def
significa que o tipo de retorno é inferido.Diferentemente da resposta original abaixo, que passa de 0 a n-1, esta se chama de n até 1, mas diminui a entrada do restante da linha na chamada recursiva.
Experimente online!
Groovy (programa), 87 bytes
Os scripts do Groovy não exigem certas importações comuns, portanto, este pode ser um programa que imprime a resposta para o STDOUT do Java sem precisar declarar
System.out.
antesprint
. Ele também fornece alguns métodos de utilidade comuns, como este,toLong()
que nos permitem analisar o argumento de entrada de maneira razoavelmente consistente.Essencialmente, a resposta do Java 10, mas aproveitando a sintaxe de loop mais curta do Groovy e a capacidade de avaliar declarações de verdade.
Experimente online!
fonte
Retina 0.8.2 , 45 bytes
Experimente online! Explicação:
Converta a entrada para unário.
Para cada número inteiro
0...n-1
, gere três linhas de texto, uma para cada palavra, cada uma comi
1
s antes, exceto porNo
, que possui dois1
s extras, para que possamos calcular(i+2)%3==0
qual é o equivalente ai%3==1
.Remova pares de
1
s antes deB
s.Remova
1
s em grupos de três em qualquer outro lugar.Exclua todas as linhas que ainda possuem a
1
.fonte
11No¶
como calcular(i+2)%3==0
(para que todos os três sejam verificações de if==0
), parece tão óbvio, mas eu não teria pensado nisso, então é realmente bastante engenhoso. +1 de mim, boa resposta!Java 10,
10099 bytes-1 byte graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
++i%3>1
provavelmente salvará um bytePowershell,
7574726766 bytes-1 byte thanks TessellatingHeckler
Script de teste e explicação:
Resultado:
Script simples, 72 bytes:
fonte
======
. Ele geraYeah,But,No
apenas strings. O script de teste mostra um separador para facilitar a leitura apenas dos resultados.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 bytes
Experimente online!
Explicação
Muito simples, salvou dois bytes usando em
[1..n]
vez de[0..n-1]
e ajustou os demais: O operador(?)
testa quatro argumentos, retornando uma lista vazia ou a sequência fornecida como um singleton, se o resultado estiver correto.Currying o quarto argumento de
(?)
podemos usar(<>)
para concatenar os resultados de cada função, ou seja:fonte
C # (compilador interativo do Visual C #) ,
10599949689bytesExperimente online!
fonte
x++%3==1?
pode ser++x%3>1?
. Alguém acabou de dar uma gorjeta para minha resposta Java, mas o mesmo se aplica à sua resposta C #. :)Pip ,
373533 bytes(Observe o espaço depois
But
.) Recebe a entrada como argumento da linha de comando. Experimente online!Explicação
Esta explicação é para a versão anterior - veja abaixo o changelog
Inspirado na resposta Perl 6 de Jo King . Construímos esta lista:
e produza os primeiros
a
elementos usando indexação cíclica.Atualização: percebi que não preciso usar o comando substituir para alterar 0/1/2 em seqüências de caracteres - posso usar esses números para indexar diretamente em uma lista. Para fazer isso, precisamos garantir que os números de vários dígitos sejam divididos em listas de seus dígitos (caso contrário, selecionaremos o índice 10 em vez dos índices 1 e 0). Felizmente, o uso de uma lista arbitrariamente aninhada como um índice no Pip funciona conforme o esperado, fornecendo uma lista (aninhada) de resultados. Para a entrada 3, obtemos essa progressão de dados (onde
_
representa uma nova linha):Como antes, o resultado final é concatenado e impresso automaticamente.
fonte
Anexo , 48 bytes
Experimente online!
Explicação
fonte
C (gcc) ,
7771747269 bytesJá existe um melhor resposta C aqui, mas essa é recursiva e demorei algum tempo para entender, então estou postando.
Até 69 bytes, graças a @ceilingcat e @JonathanFrech
(Eu nunca acho que use n- ~ -i no lugar de n-i + 1)
Experimente online!
fonte
j
salvou dois bytes.n-~-i
é equivalente an-i+1
- nãoi<n+1
- e por isso não realmente salvar quaisquer bytes ...Ruby, 69
7274BytesResposta muito direta, buscando um método mais curto e recursivo no momento.
Economizou dois bytes graças a @BWO :)
Salvo outros três bytes usando símbolos em vez de cadeias
fonte
Python 3, 93 bytes
Esta não é exatamente a melhor solução, mas é minha opinião.
Experimente online!
fonte
R, 65 bytes
Devido ao fato de estarmos replicando um programa ligeiramente defeituoso (ele perde a cada quatro "mas" - ele deveria ter usado
%4 == 1
e%4 == 3
não%3
condições), precisamos usar uma chamada estranhac
e trabalhar na base sete. Ainda assim, é mais baixo que LOLCODE ...(Eu esperava que (3,1,2,3,2,1,2) ou uma permutação semelhante pudesse aparecer no
lh
conjunto de dados em algum lugar, mas não parece)fonte
sed -E ,
179150 bytesA parte mais difícil não foi construir a lista, mas analisar o número decimal.
Podem ser salvos 2 bytes se a nova linha no final não for necessária:
c\
→d
.Ainda requer otimização.
Experimente online .
Explicação
fonte
Limpo , 116 bytes
Experimente online!
fonte
F #,
108106 bytesExperimente online!
-2 bytes mudando a partir
i=0 to p-1
dei=1 to p
e ajustando modulos. Além disso, bem direto.fonte
v
função imprimisse tudo.i=1 to p
(e ajuste de módulos, naturalmente). Os intervalos reversos estão vazios. :)PHP,
6568 bytesExecute como pipe
-nR
ou experimente online .fonte
VBA (Excel),
105, 101,99 bytesEdit: -4 bytes do Keeta! Obrigado!
Edite 2: -2 bytes de Cronocida! Woot! (Percebi que os casos de teste funcionavam apenas para 10. Corrigido agora)
Sim, o Excel venceu o VBA desta vez. Tanto faz. (Estamos vindo para você)
^ Isto é colado na janela imediata e produz na janela de depuração
Ungolfed
fonte
&
entre cadaIIf(..)
para um extra de 2 bytesGelatina , 22 bytes
Um link monádico produzindo uma lista de linhas (que parece ter sido permitida nos comentários)
Experimente online! (o rodapé chama o Link usando
Ç
e se une a novas linhas usando,Y
pois a impressão implícita no Jelly esmaga tudo, se puder)Quão?
Primeira nota que temos um período de2 × 3 = 6 devido à definição do módulo.
Agora observe que os seis primeiros valores são:
Portanto, a lista de linhas resultante deve ser esses valores repetidos (ou truncados) para o comprimento
n
concatenado juntos.Agora observe que o conjunto de poder de
"Yeah", "But", "No"
é:Portanto, cada período são esses valores indexados em 1 do conjunto de poder de
"Yeah", "But", "No"
:O código faz essa lista, molda-a no comprimento
n
, indexa no conjunto de potência e remove as listas internas (que também remove as strings vazias, já que strings são listas no Jelly) ...fonte
Python 2 ,
939283 bytesExperimente online!
Um enorme 9 bytes salvos com agradecimentos a @Jonathan Frech
fonte
('','Yeah\n')[x%3<1]
é equivalente a"Yeah\n"*(x%3<1)
.