Take the 2-minute tour ×
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Problem:

Create a program that calculates the factorial of a number (using no built-in factorial functions). Easy? The catch is that you must write your entire program (including testing it) in haiku form

xkcd haiku webpages!

You can use as many haikus as you need, but when pronounced, they must follow the 5-7-5 syllable format. haiku info

Scoring

This is a , so you must get the most upvotes to win. Your program must consist of at least one full haiku, and all haikus must be complete.

When reading code, the first line of each haiku will have 5 syllables, the second will have 7, and the third will have 5.

share|improve this question
1  
Sounds like a perfect fit for something written in Shakespeare: shakespearelang.sourceforge.net/report/shakespeare/… –  Denis Feb 17 at 15:31
1  
It seems most answers are ignoring "including testing it". –  Anko Feb 17 at 18:16
5  
I like how you link to a site that correctly says the important thing for Haiku are (a) kiru and (b) a seasonal reference and then only ask for the more or less optional part of counting mora (or syllables in a language that doesn’t really have mora. 😸 –  Christopher Creutzig Feb 17 at 20:40
1  
I agree with @ChristopherCreutzig -- it would be much more interesting if we had to ensure a seasonal reference and cutting. Sadly, we often overlook these fundamentals of haiku. Seems to me that then or punctuation could aid in cutting. For kigo, not so sure... –  Darren Stone Feb 18 at 1:42
    
I am no expert to Haikus, but there is certainly some lyrical quality expected. So far I only see one answer that has any. –  SebastianH Feb 18 at 13:45

30 Answers 30

up vote 46 down vote accepted

Smalltalk

(evaluate in a workspace; opens a dialog, asks for a number and prints the result on 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".

I tried to bring in some reflection ("in this poem") and kigo as well. Also, some western style rhyme elements are included (please->these, time->rhyme); however, being neither native speaker of Japanese, nor of English, forgive any stylistic details ;-)

share|improve this answer
    
BTW: To try in Squeak/Pharo, replace "Dialog" by "FillInTheBlankMorph" and "print" by "inspect". –  blabla999 Feb 19 at 21:05

Java - 2 haikus

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

Even when the question isn't , I often catch myself golfing the answer. In this case, I golfed the number of haikus.

I pronounce it so:

protected static
int factorial int n
if n is zero

return n plus one
return factorial n
minus one times n


Test program:

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;}}

Note that this program starts outputting 0s fast; that is a result of overflow. You could easily get larger correct numbers by changing each int to long.

Standard pronunciations for System.out.println and public static void main(String[] args) are reflected in the program.

share|improve this answer
2  
Sorry for the unupvote; I want to boost the Haskell solution –  Jan Dvorak Feb 17 at 7:53

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

Haskell education time:

  • The range x function creates a list of integers from 1 up to the value of x.
  • The fact x function multiplies all the values of the list range x together to compute the result.
  • The first line says that the fact function takes an integer and returns an integer.
share|improve this answer
3  
missing the point somewhat @JanDvorak? –  jwg Feb 17 at 12:03
2  
Form over function. If this were real programming I would certainly account for the overflow case :) –  crazedgremlin Feb 17 at 13:37
7  
range x is 1 to x is 6 syllables though –  David Z Feb 17 at 16:21
7  
@David I read it as "range x is one [dramatic pause] x". –  Anko Feb 17 at 17:18
2  
I highly recommend Learn You a Haskell if you'd like to learn you a Haskell. –  crazedgremlin Feb 19 at 23:40

APL

factorial←{×/⍳⍵}

Factorial is—
the product of naturals
up to omega

share|improve this answer
    
+1 for the <- functioning as a kireji, whether you knew that was what you were doing or not. –  Jonathan Van Matre Feb 17 at 21:32
    
@JonathanVanMatre LOL not even a clue! I did use a dictionary to count the syllables though (not a native speaker.) I added a dash to show the kireji. –  Tobia Feb 17 at 22:08
1  
+1 for also being both simple and euphonious in English. –  Ian Mallett Feb 20 at 17:11

Python 2, 4 Haikus

A complete Python 2 program haifac.py. Run as python 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))

Pronounciation:

run this full program
import operator as
op import system

please provide an arg
n equals sys arg v 1
define hai fac n

if n less than 1
return 1 to me at once
else do something else

return op dot mul
n hai fac n minus 1
print hai fac int n

share|improve this answer
1  
I like the use of #to me at once to make the meter work... –  Floris Feb 17 at 16:18
2  
And me likes the escaped newline in the beginning :) –  Johannes H. Feb 18 at 12:02
    
I think using comments is kind of like cheating. –  Ypnypn Feb 20 at 21:27

GolfScript, 2 Haikus

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

Read as haiku, enumerating each keystroke:

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

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

With test case (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

Read as 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
share|improve this answer

PHP, 4 haikus

All-in-rhyme haikus!

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)
share|improve this answer
1  
I read line three return plus plus stun. –  corsiKa Feb 18 at 20:48
    
I really like this one. –  BenjiWiebe Feb 18 at 20:56

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

Toss this into a file named f.pl

And the output:

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

Which is read as:

perl f p l three
perl f p l one less one
perl f p l ten
share|improve this answer
1  
How do you pronounce the testing in 7-5-7? –  Christopher Creutzig Feb 17 at 21:43
    
@ChristopherCreutzig I can get 5 and 6 in there nicely for testing ('perl f p l three' (5) and 'perl f p l ze-ro' (6))... I can't quite figure out a clean 7 one that shows the necessary tests. –  MichaelT Feb 17 at 21:47
    
@ChristopherCreutzig Figured out a trick for it. Thank you for reminding me of that requirement. (Though, to be fair, 1-1 doesn't actually test '0', just gives the same result - it works for zero too though) –  MichaelT Feb 17 at 22:04

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
share|improve this answer

F#

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

let fact of n be
from one up to n, apply
Seq dot fold star one

share|improve this answer
    
stole mine... ;) –  Jwosty Feb 18 at 4:31

newLISP

The parentheses are not pronounced:

(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

Lisp code consists of

numerous parentheses

and a few functions

share|improve this answer
    
Love the commentary haiku. Taking it as inspiration and adding one to my answer. –  Jonathan Van Matre Feb 17 at 21:47

Mathematica

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

Pedants may read the last line as "f of 1 is 1", but I couldn't resist the shout-out to Basho.

Testing:

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

Returning:

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

log plot of values

Linguistic Distinctiveness Bonus Haiku (inspired by @cormullion)

Rewrite any term
High-level functions abound —
Mathematica
share|improve this answer

LiveScript

This one's 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

Prints 3628800, which is 10!. It's a little roundabout: The function story returns a function ones-misery, which always returns the answer. It's artsier that way.

No filler comments or unnecessary strings!


Bonus debugging story:

I burst out laughing
when informed that a bug was
"death is undefined"

share|improve this answer
3  
Haha, you wouldn't have hit that bug if you had "death = !proud". poetryfoundation.org/poem/173363 –  Jonathan Van Matre Feb 17 at 21:37

In SML:

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

read as:

"fun fact 0 is one,
bar that, fact n is n times
fact of n less one"
share|improve this answer
6  
+1 for "funfact: zero is one" :) –  Florian Feb 18 at 11:08

Forth

: 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 is the function and my attempt at kigo: blowfish is a winter reference. I intend ?do to be kireji, the turning point, before the counted loop.

share|improve this answer

Batch

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

Pronunciation; ignores mathematical expressions as well as these symbols @ / % ^ , ( ):

set a t 1 and
for L a in 2 1 1
do set a t a

Note; this calculates the factorial, it doesn't output it - the variable t contains the factorial.

The following Haiku / code can be appended to the same batch file to output the factorial (the |'s are pronounced as pipe):

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

Perl

I know it's against the rules to use ready-made functions, but here's what I get.

Imagine your task is to instruct an over-sized rodent:

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

I can only guess what the last word means and how it's pronounced, but I assure you it is one syllable. Apparently he doesn't understand what you want from him, so you have to elaborate (easing on quality standards as you loose patience):

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

still to no avail. Then you have to explain it in plain English:

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

What happened next I don't know, but code is valid:

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

and

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

and

perl -nE 'no strict; no warnings; use Math::Combinatorics; say factorial($_)'
16
20922789888000
share|improve this answer
3  
"I assure you it is one syllable" :) –  cormullion Feb 17 at 18:37
1  
Too bad you can't toss a Coy error in there. –  MichaelT Feb 17 at 19:03
    
This is the only answer so far that has any lyrical quality :) –  SebastianH Feb 18 at 13:43
1  
@SebastianH, thanks :), though I cheated while others tried to play by the rules –  VadimR Feb 18 at 14:29

Ruby - One Haiku

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

Read (ignoring punctuation, but including one emoticon) like this:

 arg vee first to i
   tap do please puts one up to
 please inject smile end
share|improve this answer
    
Produces no output for 0!. –  200_success Feb 17 at 11:33
    
@200_success: Thanks. I may have to live with that, it's not strictly in the requirements, so I will have a think –  Neil Slater Feb 17 at 11:59
    
Also the test is meant to be haiku. I missed that on my first read myself. –  Jonathan Van Matre Feb 17 at 21:34
    
@Jonathan Van Matre: Yes I missed it too. Seems even the top answers are not bothering with this. As mine is on the command line, it is tricky to get multi-lines, I guess I should remove the test for now to make it a canonically ok answer though . . . –  Neil Slater Feb 17 at 21:40

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*/}

Pronounciation:

pound include standard
I/O dot h pound include
standard lib dot h

int main int arg c
comma char star star arg v
open brace comment

iteratively
compute factorial here
long int n equals

zero comma i
equals zero comma r
equals one comment

product starts at one
semicolon if arg c
is greater than one

open brace n is
str-to-l of arg v sub
one comma NULL comma ten

semicolon if
n less than zero begin
printf arg must

be greater than or
equal to zero backslash
n semicolon

exit negative
one semicolon end brace
end brace i equals

n semicolon
while i open brace r
equals r times i

semicolon i
decrement semicolon
close brace comment print

the result printf
percent d factorial
equals percent d

whack n comma n
comma r semicolon
comment done end brace

share|improve this answer

Haskell

This one will be a rhyming haiku!

fact 0=1                     --fact zero is one
fact ton=ton * (fact stun)   --fact ton is ton times fact stun
        where stun=pred ton  --where stun is pred ton

Yeah!

Note: Pred means the previous number. Also in haskell, you can have multiple definitions of a function, and the first one that makes sense is used.

share|improve this answer

C# - 3 haikus

I removed the usual C# using, namespace and class definition clutter, which would be a 4th 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));}

which I read as

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
share|improve this answer

Haskell

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

note that the module .. where is added automatically to any Haskell code without it at compilation, so not writing it is practically cheating.

share|improve this answer
    
Until today I had no idea you could enter a single statement under do and it didn't have to be Monad a => a. –  Onyxite Feb 19 at 15:18

JAVA:

In response to the question and to the Dwaiku (Double-Haiku or whatever you wanna call it) posted by Quincunx in Java, here's the correct Haiku:

public static int factorial(int n) {
   return (n==0) ? (n+1) : (factorial(n-1) * n);
}
share|improve this answer

Javascript - Two 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 

I am not a native speaker. So, I used a dictionary to count the syllables. Hopefully, it's good enough. Any feedback is welcome :)

share|improve this answer

Are we allowed to use filler?

Python 2 haikus:

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

nuum = len([1])
for i in range(1, number):
    nuum *= i
share|improve this answer
    
nuum equals length one? –  Pierre Arlaud Feb 17 at 8:40
    
length of the list –  Maltysen Feb 17 at 22:20
    
I'm asking for your pronunciation of the first line. num equals length of the list makes 7 syllabes instead of 5. –  Pierre Arlaud Feb 18 at 10:03

Python

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

The way I read it:

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

`

share|improve this answer
    
Produces buggy output for 0!. –  200_success Feb 17 at 11:22

Clojure

(defn fact [n] (if                  # def-fun fact n if
  (zero? n) 1                       # zero question mark n 1
  (* n (fact (dec n)))))            # times n fact dec n
share|improve this answer

C

Least beautiful haiku ever.

int main(int argc,           
char *argv[]){int in,out;
sscanf(argv

[1],"%d",
&in);out=1;while 
(in > 

1){out*=
in--;}
printf("%d",out);}//done

/*
Int main, int argc,
char star argv. Int in out.
Sscanf argv 

sub one percent d 
and in. Out equals one. While 
in is greater than

one, out times equals
in minus minus. Printf
percent d out. Done
*/
share|improve this answer
    
How do you pronounce char *argv[]){int in,out; to have it 7 syllables? I count 5-6, depending on pronounciation of argv... –  Johannes H. Feb 18 at 12:14
    
as in the comments: 'char star arg-v. int in out' –  AShelly Feb 18 at 14:41
    
Erm... totally missed the comments, was used to have them right to the code by the other answers :D Nevermind. –  Johannes H. Feb 18 at 14:42

Python 2

print(reduce(lambda              # print reduce lambda
    a,b: a * b, range(1,         # a b a times b range one
        1 + input()), 1))        # one plus input, one
share|improve this answer
    
When input is 0, TypeError: reduce() of empty sequence with no initial value –  200_success Feb 17 at 11:27
    
@200_success: 0! = 1 is just a convention ;) –  Blender Feb 17 at 11:27
    
Now it works, but the last line has six syllables. –  200_success Feb 17 at 12:32

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
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.