Fatorial em haiku!


60

Tarefa

Crie um programa que calcule o fatorial de um número usando nenhuma função fatorial interna. Fácil? O problema é que você deve escrever todo o programa (incluindo testá-lo) na forma de haiku .

Trabalho insuficiente
Você pode usar quantos haikus precisar, mas quando pronunciados, eles devem seguir o formato da sílaba 5-7-5.

Pontuação

Este é um , então você deve obter o maior número de votos para ganhar. Seu programa deve consistir em pelo menos um haiku completo e todos os haikus devem estar completos.

Ao ler o código, a primeira linha de cada haiku terá 5 sílabas, a segunda terá 7 e a terceira terá 5.


5
Soa como um ajuste perfeito para algo escrito em Shakespeare: shakespearelang.sourceforge.net/report/shakespeare/…
Denis de Bernardy

2
Parece que a maioria das respostas está ignorando " incluindo testá-lo ".
Anko

5
Eu gosto de como você cria um link para um site que diz corretamente que o importante para o Haiku é (a) kiru e (b) uma referência sazonal e, em seguida, solicita apenas a parte mais ou menos opcional da contagem de mora (ou sílabas em um idioma que não 't realmente tem mora 😸.
Christopher Creutzig

1
Concordo com @ChristopherCreutzig - seria muito mais interessante se tivéssemos que garantir uma referência e corte sazonais. Infelizmente, muitas vezes ignoramos esses fundamentos do haiku. Parece-me que a thenpontuação pode ajudar no corte. Para kigo , não tenho tanta certeza ...
Darren Pedra

Não sou especialista em Haikus, mas certamente há alguma qualidade lírica esperada. Até agora, só vejo uma resposta que tenha alguma.
Sebastianh

Respostas:


54

Conversa fiada

(avaliar em um espaço de trabalho; abre uma caixa de diálogo, solicita um número e imprime o resultado no stdout):

"in" "this" 'poem,' "you" "must"
"pronounce" "characters" "like" "these:"
"return(^)," "and" "times(*);" "please".

"but" 'never' "in" "here"
"tell" "anyone" "about" "those"
"few" "parentheses".

"otherwise" "these" "words" 
"are" "stupid" "and" "this" "coded" 
"rhyme" "is" "wasted" Time.

"let" "us" "now" "begin" 
"by" "defining," "in" Object
"and" compile: "the" "rhyme:"

'fac: "with" arg"ument"
"to" "compare" arg <"against" 2 ">"
"and" ifTrue: [ ^"return"

"["1] "or" ifFalse: "then"
["return"^ arg *"times" "the" "result"
"of" ("my"self ")getting"

"the" fac:"torial"
"of" "the" "number" arg "minus"-
1 "[(yes," "its" "easy")]'.

("Let" "me" "my"self "ask"
"for" "a" "number," "to" "compute"
"the" fac:"torial"

("by" "opening" "a" 
"nice" Dialog "which" "sends" "a"
request: "asking" "for"

'the Number to use' 
"(which" "is" "(" "treated" ) asNumber)
"then" print "the" "result".

Tentei trazer alguma reflexão ("neste poema") e kigo também. Além disso, alguns elementos de rima no estilo ocidental estão incluídos (por favor -> estes, tempo -> rima); no entanto, não sendo nem falante nativo de japonês nem de inglês, perdoe quaisquer detalhes estilísticos ;-)


Entre: Para experimentar o Squeak / Pharo, substitua "Dialog" por "FillInTheBlankMorph" e "print" por "inspecionar".
blabla999

40

Haskell

fact :: Int -> Int          -- fact is Int to Int
fact x = product (range x)  -- fact x is product range x
range x = [1..x]            -- range x is 1 [pause] x

Tempo de educação Haskell:

  • A range xfunção cria uma lista de números inteiros de 1 até o valor de x.
  • A fact xfunção multiplica todos os valores da lista range xpara calcular o resultado.
  • A primeira linha diz que a factfunção pega um número inteiro e retorna um número inteiro.

3
faltando um pouco ao argumento @JanDvorak?
GTC

2
Forma sobre função. Se isso fosse uma programação real, eu certamente consideraria o caso de estouro :) #
395 danmcardle

7
range x is 1 to xé de 6 sílabas embora
David Z

9
@ David Li como "o intervalo x é um [pausa dramática] x".
Anko

3
Eu recomendo Aprender um Haskell se você quiser aprender um Haskell.
Danmcardle

40

Java - 2 haikus

protected static
        int factorial(int n) {
    if (n == 0) {
        return n + 1;
    } return factorial(n
            - 1) * n;}

Mesmo quando a pergunta não é , muitas vezes me pego jogando a resposta. Nesse caso, joguei o número de haikus.

Eu o pronunciei assim:

estático protegido
int fatorial int n
se n for zero

retorno n mais um
fatorial de retorno n
menos uma vez n


Programa de teste:

class Factorial {                                    // class Factorial
    public static void main(String[]                 // public static void main string
            command_line_run_args) {                 // command line run args

        int i = 0;                                   // int i is zero
        while (7 != 0)                               // while seven is not zero
            System.out.                              // System dot out dot

                    println(i + "!"                  // print line i plus not
                            + " = " + factorial(     // plus is plus factorial
                            i += 1));}               // i plus equals 1

    protected static
            int factorial(int n) {
        if (n == 0) {
            return n + 1;
        } return factorial(n
                - 1) * n;}}

Observe que este programa começa a produzir 0s rápido; isso é resultado do estouro. Você pode facilmente obter números corretos maiores alterando cada um intpara long.

Pronúncias padrão para System.out.printlne public static void main(String[] args)são refletidas no programa.


2
Desculpe pelo não votado; Quero impulsionar a solução Haskell
John Dvorak

26

APL

factorial←{×/⍳⍵}

Fatorial é -
o produto de naturais
até ômega


1
+1 para <- funcionando como um kireji, independentemente de você saber o que estava fazendo ou não.
Jonathan Van Matre

@JonathanVanMatre LOL nem mesmo uma pista! Eu usei um dicionário para contar as sílabas (não um falante nativo). Adicionei um traço para mostrar o kireji.
21414 Tobia

2
+1 por também ser simples e eufórico em inglês.
imallett

Simples, mas bonito.
FUZxxl 03/03

1
Salve três bytes: factorial←×/⍳"até a entrada".
Adám 12/06/19

17

Shakespeare

The Products of Love:
A haiku tragedy with
mathy undertones.

Romeo, a man.
Juliet, a maiden fair.
Friar John, a monk.

Act I: A Cycle.
Scene I: Pertinent Values.
[Enter Romeo]

[Enter Friar John]
Romeo: Listen to thy
heart. Thou art thyself.

Friar John: Thou art
as forthright as a songbird.
[Exit Friar John]

[Enter Juliet]
Romeo: Thou art as fair
as a violet.

Scene II: Questioning
Themselves. [Exit Juliet]
[Enter Friar John]

Friar John: Art thou
as just as the sum of me
and a nobleman?

Romeo: If so,
let us proceed to scene III.
[Exit Friar John]

[Enter Juliet]
Romeo: Thou art as good
as the product of

thyself and myself.
Juliet: Thou art as fierce
as the sum of an

eagle and thyself.
We must return to scene II.
Scene III: A Lengthy

Title for a Brief
Dénouement; Or, The Last Word.
[Exit Friar John]

[Enter Juliet]
Romeo: Open your heart.
[Exit Romeo]

Um caso de teste (imaginado):

Apesar de seu tamanho, este programa aceita apenas um único número inteiro como entrada e fornece um único número inteiro como saída. Assim:

6 ↵ 720
7 ↵ 5040
0 ↵ 1    1 ↵ 1

("Seis, sete e vinte. / Sete, cinco mil e quarenta. / Zero, um. Um, um.")


5
Não sei ao certo como me sinto sobre o fato de saber que esse é um código legítimo.
randomra

12

Python 2, 4 Haikus

Um programa completo em Python 2 haifac.py. Correr comopython haifac.py <n>

#run this full program
import operator as\
op; import sys#tem

#please provide an arg
n = sys.argv[1]
def haifac (n):

    if n < 1:
        return 1#to me at once
    else:#do something else

        return op.mul(
            n, haifac(n - 1))
print haifac(int(n))

Pronunciação:

execute esse
operador de importação de programa completo como
sistema de importação operacional

forneça um argumento arg
n é igual a sys arg v 1
define hai fac n

se n menos de 1
retornar 1 para mim ao mesmo tempo
, faça outra coisa

retornar ponto op mul
n hai fac n menos 1
impressão hai fac int n


1
Eu gosto do uso de #to me at oncefazer o trabalho de meter ...
Floris

2
E gosta de mim a nova linha escaparam no início :)
Johannes H.

2
Eu acho que usar comentários é como trapacear.
Ypnypn

9

GolfScript, 2 Haikus

),{0>},{,,*}*

Leia como haiku, enumerando cada pressionamento de tecla:

#close parenthesis
#comma open-brace zero
#greater-than close-brace

#comma open-brace
#comma comma asterisk
#close-brace asterisk

Com caso de teste (5 haikus):

[1 2 3]4+          #generate the array [1 2 3 4]
{                  #start creating block
),{0>},{,,*}*      #actual factorial code
}%                 #close block and map across array (so that we should have [1! 2! 3! 4!])
[1 2 6]2.3**12++=  #generate the array [1 2 6 24] and check for equality

Leia como haiku:

#open-bracket one
#space two space three close-bracket
#four plus open-brace

#close parenthesis
#comma open-brace zero
#greater-than close-brace

#comma open-brace
#comma comma asterisk
#close-brace asterisk

#close-brace percent-sign
#open-bracket one space two
#space six close-bracket

#two period three
#asterisk asterisk one
#two plus plus equals

8

Adiante

: fugu 1              \ colon fugu one                = 5
swap 1 + 1 ?do        \ swap one plus one question do = 7
i * loop ;            \ eye star loop semi            = 5

Fugu é a função e minha tentativa de kigo : blowfish é uma referência de inverno. Pretendo ?doser o kireji , o ponto de virada, antes do loop contado.


7

PHP, 4 haikus

Hikus tudo em rima !

function haiku($can) { // function haiku can (5)
    if ($can == 1) // if can is equal to one (7)
        return ++$stun; // return increase stun (5)

    if ($can == 0) { // if can equals ou (5)
        echo "It is one, you know! "; //echo "It is one, you know! " (7)
        return 1+$blow; } //return one plus blow (5)

    if ($can > $fun) { //if can exceeds fun (5)
        return haiku($can-1) //return haiku can less one (7)
            *$can; }} //multiplied by can (5)

if (null == $knee) { // if null equals knee (5)
    $free=0+3; // free equals zero plus three (7)
    echo haiku($free); } // echo haiku free (5)

1
Eu li a linha três return plus plus stun.
corsiKa

Eu realmente gosto deste.
BenjiWiebe

7

Espaço em branco

Isso faz uso de um dos mais famosos haikus e muita coisa foi escrita sobre isso.

Não faço ideia por que ninguém fez isso antes, faço nem é preciso esforço!

Antes de tudo, antes de ler o poema, quero que você se recoste, relaxe e desfrute da tranquilidade criada pelo grande vazio que o cerca. Ele enfatiza a lagoa, cercada por uma vasta paisagem.

古 池 や    
蛙 飛 び こ               
水 の 音             






































































































































código fonte no filebin

Caso você não fale japonês, isso será pronunciado da seguinte forma:

fu ru i ke ya

ka wa zu para bi ko mu

mi zu no o to

Naturalmente, é contada por morae. O kireji é や ( ya ) , o kigo (referência sazonal) é 蛙 ( kawazu , sapo, -> primavera) .

Usando o interpretador linux da página oficial, você pode usá-lo assim:

$ eco 5 | ./wspace .ws


6

Mathematica

f[x_]:=     (* f of x defined *)
 x f[x-1]   (* x times f of x less 1 *)
f[1]=1      (* Mogami River *) 

Os pedantes podem ler a última linha como "f de 1 é 1", mas não pude resistir aos gritos de Basho.

Testando:

Table[f[n],     (* Table f of n *)
 {n, 1, 10, 1}] (* n from 1 to 10 by 1 *)
ListLogPlot[%]  (* ListLogPlot output *)

Retornando:

(1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800)

gráfico de log de valores

Haiku de bônus de distintividade linguística (inspirado em @cormullion)

Rewrite any term
High-level functions abound —
Mathematica

5

Lote

@set /a t=1 &^
for /L %%a in (2, 1, %1) ^
do @set /a t*=%%a

Pronúncia ; ignora expressões matemáticas, bem como estes símbolos @ / % ^ , ( ):

fixado em 1 e
para LA em 2 1 1
defina ata

Nota; isso calcula o fatorial, não o produz - a variável tcontém o fatorial.

O seguinte Haiku / código pode ser anexado ao mesmo arquivo em lotes para gerar o fatorial (os |são pronunciados como canal):

@echo %t% ||^
When will you learn, unclemeat ^
Why must you use Batch?

5

Clojure

(->> *command-line-args*                ; thrush com-mand line args
  seq last read-string range (map inc)  ; seq last read string range map inc
  (reduce *) println)                   ; re-duce times print-lin

5

F #

let fact n =
    [1..n] |>
    Seq.fold (*) 1

seja n
de um até n, aplique
Seq dot fold star one


roubou o meu ...;)
Jwosty

5

newLISP

Os parênteses não são pronunciados:

(define (fac n (so))            ; define fac n so 
(if (= n 0) 1                   ; if equals n zero 1
(* n (fac (dec n)))))           ; times n fac dec n

(for (n 0 10)                   ; for n zero ten
; let's test from zero to ten
(println (fac n thus)))         ; printline fac n thus

O código Lisp consiste em

numerosos parênteses

e algumas funções


Ame o haiku comentário. Tomando como inspiração e adicionando um à minha resposta.
Jonathan Van Matre

5

Perl

$r = 1; for(1           # r gets one for one
.. pop @ARGV) { $r *=   # to pop arg v r splat gets
$_; } print $r;         # the default print r

Jogue isso em um arquivo chamado f.pl

E a saída:

$ perl f.pl 3
6 $ perl f.pl 1-1
1 $ perl f.pl 10
3628800 $ 

Que é lido como:

perl fpl three
perl fpl um menos um
perl fpl ten

1
Como você pronuncia o teste em 7-5-7?
Christopher Creutzig 17/02/2014

@ChristopherCreutzig Posso obter 5 e 6 lá muito bem para testar ('perl fpl three' (5) e 'perl fpl ze-ro' (6)) ... Não consigo descobrir um 7 limpo que mostre os testes necessários.

@ChristopherCreutzig Descobriu um truque para isso. Obrigado por me lembrar desse requisito. (Embora, para ser justo, 1-1 na verdade não teste '0', apenas fornece o mesmo resultado - embora também funcione com zero) #

5

LiveScript

Este é medieval:

prelude = ^^ do                       # prelude is clone do
  require \prelude-ls                 # require prelude dash ls
{ product } = prelude                 # product is prelude

story = (ah) ->                       # story is ah such:
  ones-misery = (one) ->              # one's misery is one such
    let death = product               # let death be product

      fight = [1 to one]              # fight is one to one
      why = (one) -> death <| fight   # why is one such death take fight
  ones-misery ah                      # one's misery ah

room = console.log                    # room is console log
room <| (story 10)!                   # room take story three bang
[null of { use : this }]              # no of use is this

Imprime 3628800, o que é 10!. É uma pequena rotatória: A função storyretorna uma funçãoones-misery , que sempre retorna a resposta. É mais artístico assim.

Sem comentários de preenchimento ou seqüências desnecessárias!


História de depuração de bônus:

Comecei a rir
quando soube que um bug era
" deathé undefined"


3
Haha, você não teria atingido esse bug se tivesse "death =! Proud". poetryfoundation.org/poem/173363
Jonathan Van Matre

5

Haskell

Este será um haiku rimado !

fato 0 = 1 - zero zero é um
fato ton = ton * (fato atordoado) - tonelada de fato é tonelada vezes fato atordoado
        onde stun = pred ton - onde stun é pred ton

sim!

Nota: Pred significa o número anterior. Também no haskell, você pode ter várias definições de uma função, e a primeira que faz sentido é usada.


Elegante! (filler)
cat

4

Ruby - um haicai

ARGV.first.to_i.
 tap do |please| puts 1.upto(
 please ).inject( :*) end

Leia (ignorando a pontuação, mas incluindo um emoticon) assim:

 arg vee first to i
   tap do please puts one up to
 please inject smile end

Não produz saída para 0 !.
200_success 17/02/2014

@ 200_success: Obrigado. Talvez eu tenha que viver com isso, não está estritamente nos requisitos, então terei uma idéia
Neil Slater

Além disso, o teste é para ser haiku. Eu senti falta disso na minha primeira leitura.
Jonathan Van Matre

@ Jonathan Van Matre: Sim, eu também perdi. Parece que nem as principais respostas estão se incomodando com isso. Como o meu está na linha de comando, é complicado obter várias linhas, acho que devo remover o teste por enquanto para torná-lo uma resposta canonicamente correta. . .
Neil Slater

4

No SML:

fun fact 0 = 1
  | fact n = n*fact(n-1)
  ;

leia como:

"fun fact 0 is one,
bar that, fact n is n times
fact of n less one"

3

Perl

Eu sei que é contra as regras usar funções prontas, mas aqui está o que eu recebo.

Imagine que sua tarefa é instruir um roedor de tamanho grande:

use Math::BigRat; use
feature 'say'; use warnings; say
new Math::BigRat($_)->bfac

Só posso adivinhar o que a última palavra significa e como é pronunciada, mas garanto que é uma sílaba. Aparentemente, ele não entende o que você quer dele, então você precisa elaborar (atenuando os padrões de qualidade à medida que perde a paciência):

use Math::BaseConvert
':all'; no strict subs; no warnings;
reset and say fact($_)

ainda sem sucesso. Então você precisa explicá-lo em inglês simples:

no strict; no warnings;
use Math::Combinatorics;
say factorial($_)

O que aconteceu depois eu não sei, mas o código é válido:

perl -nE 'use Math::BigRat; use feature "say"; use warnings; say new Math::BigRat($_)->bfac'
42
1405006117752879898543142606244511569936384000000000

e

perl -nE 'use Math::BaseConvert ":all"; no strict subs; no warnings; reset and say fact($_)'
33
8683317618811886495518194401280000000

e

perl -nE 'no strict; no warnings; use Math::Combinatorics; say factorial($_)'
16
20922789888000

3
"Garanto-lhe que é uma sílaba" :)
cormullion

1
Pena que você não pode lançar um erro Coy lá.

Esta é a única resposta até agora que tem qualquer qualidade lírica :)
Sebastianh

1
@SebastianH, obrigado :), apesar de eu ter trapaceado enquanto outros tentavam jogar pelas regras
user2846289

2

Pitão

lambda n: reduce(
    lambda a, b: a * b,
    range(1, n), n)

Do jeito que eu li:

lambda n: reduce
lambda a b: a times b
range 1 to n, n

`


Produz uma saída de buggy para 0 !.
200_success 17/02/2014

2

C

#include <std\
io.h> 
#include \
<stdlib.h>

int main(int argc
 , char** argv)
{   // iteratively
    // compute factorial here
long int n = \
0, i \
= 0, r = \
1 /*
product starts at one*/;

if (argc 
> 1) { n = 
strtol(argv[\
1], NULL, 10)
; if (n 
< 0) {
       printf("Arg must\
       be >= 0\n");
       exit(-
    1);}
} i = 
n;
while (i) { r 
= r * i;
    i
--;
} /* print
the result*/ printf(
"%d factorial\
equals %d\
\n", n
, r);
/*done*/}

Pronunciação:

libra incluem padrão
ponto de E / S padrão h libra inclui
lib ponto padrão h

int main int arg c
vírgula estrela de caractere arg v
abra chave comentário

iterativamente
calcular fatorial aqui
longo int n é igual a

vírgula zero i
é igual a vírgula zero r
é igual a um comentário

o produto inicia em um
ponto - e - vírgula se arg c
for maior que um

chave aberta n é
str-to-l de arg v sub-
uma vírgula NULL vírgula dez

ponto e vírgula se
n menor que zero começar
printf arg deve

ser maior ou
igual a zero barra invertida
n ponto e vírgula

saída negativa
um ponto-e-vírgula cinta
final cinta final é igual a

n ponto
e vírgula enquanto eu abro a chave r
é igual a r vezes i

ponto e vírgula
decremento ponto e vírgula
fechar chave comentário imprimir

o resultado printf
por cento d fatorial
é igual a por cento d

whack n vírgula n
vírgula
comentário de ponto e vírgula


O #caractere é tipicamente pronunciado sharp ou octothorpe no código C.
FUZxxl 03/03

1

C # - 3 haikus

Eu removi o C # usual usando, espaço para nome e desordem de definição de classe, que seria um quarto haiku.

public static void
Main(){int num = Convert.
ToInt32

(Console.ReadLine());
 Console.WriteLine(num ==
 0 ? 1 :

Enumerable.
Range(1, num).Aggregate
((i, j) => i * j));}

que eu li como

public static void 
Main int num equals Convert
To int thirty-two

Console dot Read line
Console Write line num equals
zero? then one, else

Enumerable
Range 1 to num aggregate
i j i times j

1

Haskell

module Haiku where          -- read literally.
fac x = let in do           -- = is read as 'equals'
product [1..x]              -- product one to x

note que o módulo .. onde é adicionado automaticamente a qualquer código Haskell sem ele na compilação, portanto, não escrever é praticamente trapaça.


Até hoje, eu não fazia ideia de que você poderia digitar uma única declaração doe não precisava Monad a => a.
Onyxite

1

JAVA:

Em resposta à pergunta e ao Dwaiku (Double-Haiku ou o que você quiser chamar) publicado por Quincunx em Java, aqui está o Haiku correto:

public static int factorial(int n) {
   return (n==0) ? (n+1) : (factorial(n-1) * n);
}

1

Javascript - Dois Haikus

function factor (a) {          // function factor a
  if(!a){ return 1 ||          // if not a return 1 or
    a & 17}                    // a and seventeen

  else if (a + 1){             // else if a plus one 
    return a * factor          // return a into factor
    (a + ( - 1) )  }}          // a plus minus one 

Eu não sou um falante nativo. Então, eu usei um dicionário para contar as sílabas. Felizmente, é bom o suficiente. Qualquer feedback é bem-vindo :)


1

Powershell, 2 Haikus

function facto ($num){    # function facto num
$i = 1; 1..$num|          # i equals one; i to num
foreach { $i =            # for each i equals

$i * $_}; write $i}       # i times this write i
$answer = facto $args[    # answer equals facto args
0]; write $answer         # zero write answer

1

É permitido o uso de preenchimento?

Python 2 haikus:

number = num + 1
a = 13 + 4
b = 14

nuum = len([1])
for i in range(1, number):
    nuum *= i

nuum equals length one?
Pierre Arlaud 17/02

comprimento da lista
Maltysen 17/02

Estou pedindo sua pronúncia da primeira linha. num equals length of the listfaz 7 sílabas em vez de 5.
Pierre Arlaud

1
Você poderia substituir nuumcom foo(porque eu estou lendo se como nu-um, o que o coloca acima do limite.)
ASCIIThenANSI

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.