Você já quis perguntar ao compilador "Por quê?" Muitos de nós ficamos frustrados quando o código não está funcionando como deveria. Portanto, o Mathworks implementou uma pequena função agradável why
, que responde à pergunta. Para dar alguns exemplos do MATLAB:
why
The programmer suggested it.
why
To fool the tall good and smart system manager.
why(2)
You insisted on it.
why(46)
Bill insisted on it.
Sua tarefa é implementar a why
função no seu idioma. A função deve funcionar com e sem um argumento de entrada (use alternativamente input 0
ou -1
). A função deve ser nomeada why
(ou, escrever why(n)
STDIN deve resultar na impressão da string apropriada).
Se nenhum argumento for fornecido, ou o argumento for zero ou negativo, a sequência de saída deve ser uma frase válida e aleatória. Então, deve haver uma função why
, why()
, why(0)
ou why(-1)
que os retornos uma frase aleatória.
Se n
for fornecido um argumento de entrada (argumento de função, não STDIN), a saída deve ser a n-ésima sequência (definida abaixo). Portanto, why(1)
sempre deve imprimir (imprimir / exibir) o mesmo resultado.
As frases são construídas da seguinte forma (Tipo 1, Tipo 2 e Especial). Todas as frases terminam com !
.
"Person" "ending" !
"Verb" "adjective" "Person" !
A list of special cases
A lista de pessoas:
Stewie
Peter
Homer
The programmer
The system manager
You
A lista de finais:
suggested it
insisted on it
did it
A lista de verbos é:
To fool
To satisfy
To please
A lista de adjetivos:
the smart
the bald
the tall
the rich
the stupid
A lista de casos especiais:
How should I know?
Stop asking!
Don't ask!
A maneira de selecionar uma numerada é:
Tipo de frases:
Odd number => Type 1
Even number => Type 2
n % 7 = 0 => Type 3 (% is the modulus operator)
Nomes: o enésimo nome é definido usando o módulo (%).
n = 1: 1 % 7 => Stewie
n = 2: 2 % 7 => Peter
...
n = 6: 6 % 7 => You
n = 7: 7 % 7 => How should I know?
n = 11: 11 % 7 => The programmer
n = 14: 14 % 7 => Stop asking!
n = 21: 21 % 7 => Don't ask!
Finais: O enésimo final também é definido usando o módulo. Suponha que os finais (1, 2 e 3) estejam listados como (1 2 2 3)
. Como os números são sempre ímpares, use((n+1)/2 % 4)
n = 1: ((1+1)/2 % 4) => suggested it
n = 3: ((3+1)/2 % 4) => insisted on it
n = 13: ((13+1)/2 % 4) => did it
Adjetivos: O enésimo adjetivo é definido usando o módulo. Como os números são sempre pares, use:(n % 10)/2
n = 2: (2 % 10)/2 => Smart
n = 6: (6 % 10)/2 => The tall
...
Verbos: O enésimo verbo também é definido usando o módulo. Suponha que os verbos (1, 2 e 3) estejam listados como (1 2 2 3)
Como os números são sempre pares para verbos, use(n % 8) / 2
n = 2: (2 % 8)/2 => To fool
n = 4: (4 % 8)/2 => To satisfy
n = 6: (6 % 8)/2 => To satisfy
n = 8: (8 % 8)/2 => To please
Agora, a maneira de criar uma aleatória deve ser bastante simples, basta selecionar uma aleatória n
.
Alguns exemplos:
why
You suggested it!
why
To fool the tall Homer!
why
Don't ask!
why(1)
Stewie suggested it!
why(14)
Stop asking!
why(8)
To please the rich Stewie!
Aplicam-se as regras de código padrão Um vencedor será selecionado uma semana a partir do dia em que o desafio foi lançado.
why
ou seriaWHY
aceitável?/2
funcionar. Isso fornece valores fracionários.13
também deve serinsisted
(14/2 = 7% 4 = 3 = 2º do insistido).the rich The programmer
os especificadosthe
?The
eTo
em suas listas provavelmente deve estar em letras minúsculas para combinar com seus exemplos ...Respostas:
JavaScript (ES6) 345
Não tenho certeza sobre os números, mas aqui está a minha tentativa.
Teste a execução do snippet abaixo em um navegador compatível com EcmaScript.
fonte
0
como seu delimitador de string em vez de,
!split(0)
é o mesmo comprimento dasplit','
(fingir estes são crases)C #, 502 bytes
Esse projeto precisa ter o AssemblyName definido como o motivo que produzirá um executável com o nome correto.
Totalmente jogado:
Recuo e novas linhas para maior clareza:
Exemplo de entrada / saída:
fonte
Powershell
437461453 BytesEdit: Perdeu os verbos duplicados
Divisão entre o corpus e os cálculos para contagem de bytes
to
,the
,it
e!
lugares desde que tenham fixos).Define o argumento padrão como 0 se não for especificado. Se argumento for
<1
, ele obtém um número aleatório<99
fn:1
e é executado novamente . Tecnicamente, isso significa que-50
também funcionará, sendo tratado como um caso aleatório.Explicação:
fn:1
99 Escolhido para salvar um byte. Se houver mais de 99 frases possíveis acima (não calculou), aumente para 999 ou 9999, conforme aplicável (+1/2 bytes)fonte
MUMPS, 379 bytes
Quando nenhuma entrada é fornecida, um número aleatório em 0..839 é gerado.
Uso:
A estratégia de avaliação da esquerda para a direita do MUMPS economiza alguns bytes entre parênteses aqui.
Nota lateral: vê aquelas cordas que se parecem
"foo^bar^baz^qux"
? Essas são as chamadas "cadeias delimitadas" e são a maneira padrão de armazenar listas que se encaixam dentro do limite máximo de tamanho de cadeia, pois o MUMPS não possui realmente listas / matrizes (ou, de fato, nenhuma estrutura de dados além das árvores). Para listas muito grandes para caberem em uma única sequência, usamos árvores de profundidade 1 e colocamos os valores nas folhas da árvore. Diversão!fonte
why
função. ;)Emacs Lisp 473 Bytes
Maior 'resíduos' é provavelmente a
format
,%s
... seções. Se variáveis pudessem ser incorporadas nas strings sem a especificação, economizariam 10 bytes%s
e outros 12 emformat
fonte
Ruby
396378372 bytesTenho certeza de que isso não é praticado ao máximo.
Edit: Acabei de perceber que não conheço precedência do operador. Ah bem..
fonte
CJam, 281 bytes
Permalink
Não usei o CJam antes, então vou dar algumas dicas. Tenho certeza de que há muitos truques que não conheço!
(Eu não conseguia descobrir como nomear isso como uma função chamada "por quê" - parece que as funções não existem no CJam - por isso não tenho certeza se uma resposta do CJam está correta ou não ...)
fonte
Lua 5.3.0,
452460446 bytesEsta é a minha primeira tentativa de um código de golfe, por favor, corrija-me se eu fiz algo errado!
Ungolfed:
fonte
Python (2), 692 bytes
Eu ainda estou aprendendo, então por favor seja gentil! :)
Funciona com ou sem um int como argumento de linha de comando.
Tentei enfatizar a correção do código o máximo possível, como na geração de números aleatórios de
-sys.maxint - 1
parasys.maxint
e exibindo frases no caso direita.O código se baseia muito em declarações if que, com certeza, poderiam ser substituídas por algo mais eficiente em termos de local.
O feedback é muito bem-vindo!
Ungolfed (1341 bytes)
fonte
argument%8/2-1
e remova o segundo. Você também pode substituir==0
por<1
.