Факторський у хайку!


60

Завдання

Створіть програму, яка обчислює факторіал числа, не використовуючи вбудованих факторіальних функцій. Легко? Проблема полягає в тому, що ви повинні написати всю свою програму (включаючи її тестування) у формі хайку .

Не вистачає роботи
Ви можете використовувати стільки гайків, скільки вам потрібно, але, коли вони вимовляються, вони повинні відповідати формату 5-7-5 складів.

Оцінка балів

Це , тож ви повинні отримати найбільшу суму, щоб виграти. Ваша програма повинна складатися щонайменше з одного повного хайку, і всі хайкуси повинні бути повноцінними.

Під час читання коду перший рядок кожного хайку матиме 5 складів, другий - 7, а третій - 5.


5
Здається, що ідеально підходить для чогось написаного в Шекспірі: shakespearelang.sourceforge.net/report/shakespeare/…
Денис де Бернарді

2
Здається, більшість відповідей ігнорує " включаючи тестування ".
Анко

5
Мені подобається, як ви посилаєтесь на сайт, який правильно говорить, що важливим для Хайку є (а) кіру та (б) сезонна довідка, а потім просити лише більш-менш необов'язкові частини підрахунку мора (або складів мовою, яка не відповідає) "У мене справді немає мора" .
Крістофер Кройціг

1
Я погоджуюся з @ChristopherCreutzig - це було б набагато цікавіше, якби ми мали забезпечити сезонну довідку та скорочення. На жаль, ми часто не помічаємо цих основ хайку. Мені здається, що thenабо пунктуація може допомогти у вирізанні. Що стосується кіго , не дуже впевнений ...
Даррен Стоун,

Я не знаю Хайкуса, але, безумовно, очікується якась лірична якість. Поки я бачу лише одну відповідь, яка має будь-яку.
СебастьянH

Відповіді:


54

Невеличка розмова

(оцінюємо в робочій області; відкриває діалогове вікно, запитує номер і друкує результат у 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".

Я спробував залучити до роздумів («у цій поемі») і кіго. Також включені деякі елементи рима західного стилю (будь ласка-> ці, час-> рима); проте, не будучи ні носієм японської, ні англійської, пробачте будь-які стилістичні деталі ;-)


BTW: Щоб спробувати Squeak / Pharo, замініть "Діалог" на "FillInTheBlankMorph" і "Друк" на "Перевірити".
blabla999

40

Хаскелл

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:

  • range xФункція створює список цілих чисел від 1 до значення x.
  • fact xФункція примножує все значення в списку range xразом , щоб обчислити результат.
  • Перший рядок говорить про те, що factфункція приймає ціле число і повертає ціле число.

3
дещо не вистачає точки @JanDvorak?
jwg

2
Форма над функцією. Якби це було справжнє програмування, я б неодмінно
пояснював

7
range x is 1 to xце 6 складів, хоча
David Z

9
@David Я читав це як "діапазон x - це одна [драматична пауза] x".
Анко

3
Я настійно рекомендую Learn You a Haskell, якщо ви хочете навчитися вам Haskell.
danmcardle

40

Ява - 2 хайкуси

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

Навіть коли питання не є , я часто ловлю себе в . У цьому випадку я полював числу хайкусів.

Я вимовляю це так:

захищений статичний
int факториальний int n,
якщо n дорівнює нулю

повернення n плюс один
коефіцієнт повернення n
мінус один раз n


Тестова програма:

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

Зауважте, що ця програма починає виводити 0s швидко; це результат переповнення. Ви можете легко отримати більші правильні числа, змінивши кожен intнаlong .

Стандартні вимови для System.out.printlnта public static void main(String[] args)відображаються в програмі.


2
Вибачте за скасування подання; Я хочу підсилити рішення Haskell
Джон Дворак

26

APL

factorial←{×/⍳⍵}

Факторний
- продукт натуралів
аж до омеги


1
+1 для <- функціонування як kireji, незалежно від того, знаєте ви, що ви робите, чи ні.
Джонатан Ван Матре

@JonathanVanMatre LOL навіть не поняття! Я використовував словник для підрахунку складів, хоча (не є носієм мови). Я додав тире, щоб показати kireji.
Тобія

2
+1 за те, що англійською мовою є простою та чудовою.
imallett

Простий, але красивий.
FUZxxl

1
Збережіть три байти: factorial←×/⍳"до вводу".
Адам

17

Шекспір

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]

(Уявний) тестовий випадок:

Незважаючи на свою тривалість, ця програма просто приймає одне ціле число як вхідне і надає єдине ціле число як вихід. Тому:

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

("Шість, сім-двадцять. / Сім, п'ять тисяч сорок. Нуль, один. Один, один.")


5
Я не впевнений, як я ставлюсь до того, що можу сказати, що це законний код.
випадкова

12

Пітон 2, 4 Хайкус

Повна програма Python 2 haifac.py. Виконати як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))

Вимова:

запустити цього повного
оператора імпорту програми як
систему імпорту

будь ласка, надайте аргумент
n дорівнює sys arg v 1
визначте hai fac n

якщо n менше 1
повернення 1 мені відразу,
ще щось робити

повернути op dot mul
n hai fac n мінус 1
друк hai fac int n


1
Мені подобається використання роботи #to me at onceлічильника ...
Флоріс

2
І мені спочатку подобається втіклий новий рядок :)
Йоханнес Х.

2
Я думаю, що використання коментарів - це щось на зразок обману.
Ypnypn

9

GolfScript, 2 хайкуси

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

Прочитайте як хайку, перераховуючи кожен натискання клавіші:

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

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

З тестовим кейсом (5 хайкусів):

[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

Читати як хайку:

#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

Четвертий

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

Фугу - це функція, і моя спроба кіго : міт - це зимовий орієнтир. Я маю намір ?doстати кіреджі , переломною точкою, до переліченої петлі.


7

PHP, 4 гайки

Хайкус у всьому стині!

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
Я читав третій рядок return plus plus stun.
corsiKa

Мені дуже подобається цей.
BenjiWiebe

7

Пробіл

Це використовує один з найвідоміших хайку , і про нього було написано багато.

Не маю уявлення, чому ніхто раніше цього не робив, це навіть не вимагає жодних зусиль!

Перш за все, перш ніж прочитати вірш, я хочу, щоб ти відкинувся, розслабився та насолодився спокоєм, створеним великою порожнечею навколо поеми. Він підкреслює ставок, оточений величезним пейзажем.

古 池 や    
蛙 飛 び こ む               
水 の 音             






































































































































вихідний код на filebin

Якщо ви не володієте японською мовою, це вимовляється так:

фу ру я ке я

ка ва зу до бі ко му

mi zu no o to

Природно, це рахується муренами. Kireji єや( я ) , то Дещо (сезонним рекомендованим)蛙( Kawazu , жаба, -> весни) .

Використовуючи інтерпретатор linux з офіційної сторінки, ви можете використовувати його так:

$ відлуння 5 | ./wspace .ws


6

Математика

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

Педанти можуть прочитати останній рядок як "f of 1 is 1", але я не міг протистояти крику Башо.

Тестування:

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

Повернення:

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

графік значень журналу

Бонус за мовну відмінність Хайку (натхненний @cormullion)

Rewrite any term
High-level functions abound —
Mathematica

5

Партія

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

Вимова ; ігнорує математичні вирази, а також наступні символи @ / % ^ , ( ):

встановити на 1, а
для L a в 2 1 1
зробити множину ата

Примітка; це обчислює факторіал, він не виводить його - змінна tмістить факториал.

Наступний Haiku / код може бути доданий до того ж пакетного файлу для виведення факторіалу ( |'s' вимовляються як труба):

@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

нехай факт n буде
від одного до n, застосуйте
послідовно кратну зірку Seq


вкрав міну ...;)
Jwosty

5

новийLISP

Дужки не вимовляються:

(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

Код Лісп складається з

численні дужки

і кілька функцій


Любіть коментар хайку. Взявши це як натхнення і додавши його до моєї відповіді.
Джонатан Ван Матре

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

Киньте це у файл з назвою f.pl

І вихід:

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

Що читається як:

perl fpl три
perl fpl один менший
perl fpl ten

1
Як ви вимовляєте тестування в 7-5-7?
Крістофер Кройцгіг

@ChristopherCreutzig Я можу отримати 5 і 6 туди для тестування ("perl fpl three" (5) та "perl fpl ze-ro" (6)) ... Я не можу точно зрозуміти чистий 7, який показує необхідні тести.

@ChristopherCreutzig Вигадав трюк для цього. Дякую, що нагадали мені про цю вимогу. (Хоча, якщо чесно, 1-1 насправді не тестує "0", він дає лише той самий результат - він працює і за нуль)

5

LiveScript

Цей середньовічний:

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

Друкує 3628800, що є 10!. Це трохи кругленьке: функція storyповертає функцію ones-misery, яка завжди повертає відповідь. Це штучніше.

Без коментарів щодо наповнення або зайвих рядків!


Історія бонусної налагодження:

Я засміявся,
коли повідомив, що помилка
" deathє undefined"


3
Ха-ха, ти б не потрапив у цю помилку, якби ти мав "смерть =! Гордий". songfoundation.org/poem/173363
Джонатан Ван Матре

5

Хаскелл

Цей буде хайку, що римується !

факт 0 = 1 --факт нуль - це один
факт тона = тонна * (факт оглушення) --факторна тонна - це тонна кратна кількість факту оглушення
        де stun = pred ton - де оглушення pred ton

Так!

Примітка: Pred означає попереднє число. Також у haskell ви можете мати кілька визначень функції, і використовується перше, що має сенс.


Елегантний! (наповнювач)
кіт

4

Рубі - один хайку

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

Читайте (ігноруючи розділові знаки, але включаючи один смайлик) так:

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

Не дає виводу за 0 !.
200_успіх

@ 200_success: Дякую Можливо, мені доведеться з цим жити, це не суворо в вимогах, тому я подумаю
Ніл Слейтер

Тест також повинен бути хайку. Я пропустив це на своєму першому прочитанні сам.
Джонатан Ван Матре

@Jonathan Van Matre: Так, я теж її пропустив. Здається, навіть найкращі відповіді це не турбують. Оскільки моя є в командному рядку, складно отримати багаторядкові рядки, я думаю, я повинен зараз видалити тест, щоб зробити це канонічно нормальною відповіддю. . .
Ніл Слейтер

4

У SML:

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

читати як:

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

3

Perl

Я знаю, що проти правил використовувати готові функції, але ось що я отримую.

Уявіть, що ваше завдання - навчити гризуна надмірного розміру:

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

Я можу лише здогадуватися, що означає останнє слово і як воно вимовляється, але запевняю вас, що це один склад. Мабуть, він не розуміє, чого ви хочете від нього, тому вам доведеться детальніше (полегшуючи стандарти якості, коли ви втрачаєте терпіння):

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

все-таки безрезультатно. Тоді ви повинні пояснити це простою англійською мовою:

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

Що було далі, я не знаю, але код дійсний:

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

і

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

і

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

3
"Запевняю вас, що це один склад" :)
cormullion

1
Шкода, що ви не можете підкинути помилку Coy .

Це єдина відповідь на даний момент, яка має будь-яку ліричну якість :)
SebastianH

1
@SebastianH, дякую :), хоч я обдурив, поки інші намагалися грати за правилами
user2846289

2

Пітон

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

Те, як я це прочитав:

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

`


Випускає помилку на 0 !.
200_успіх

2

С

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

Вимова:

фунт включають стандартні
введення / виведення точки фунт включають
стандартну точку hb h

int main int arg c
кома char star star arg v
відкритий коментар дужки

тут ітераційно
обчислюють факторіал, який
довгий int n дорівнює

нуль кома i
дорівнює нулю кома r
дорівнює одному коментарю

продукт починається з одного
крапки з комою, якщо арг c
більший одиниці

відкрита дужка n -
str-to-l від arg v sub
одна кома NULL, коска десять

крапка з комою, якщо
n менше нуля, починається
printf arg

бути більшим або
рівним нульовому зворотному косу
n крапкою з комою

вихід негативний
один кінець крапки з крапкою з комою
і рівний

n крапка з комою,
тоді як я відкриваю дужку r
дорівнює r разів i

крапка з комою i
скороченням крапка з комою
закрити дужкою коментар друку

результат printf
відсотків d факторіал
дорівнює відсотку d

ударити n кома n
кома г крапкою з комою коментовано
зроблено кінцевою дужкою


#Характер , як правило , виражений гострий або знак числа в коді C.
FUZxxl

1

C # - 3 хайкуси

Я видалив звичайний C # за допомогою, простору імен та визначення класу, що було б 4-м хайку.

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

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

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

яку я читав як

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

Хаскелл

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

зауважте, що модуль .. де додається автоматично до будь-якого коду Haskell без його при компіляції, тому не записуючи його, це практично обман.


До сьогодні я не здогадувався, що можна вводити одну заяву, doі цього не повинно бути Monad a => a.
Оніксит

1

JAVA:

У відповідь на запитання і на Dwaiku (подвійний хайку або все, що ви хочете його назвати), опублікований Quincunx на Java, ось правильний хайку:

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

1

Javascript - Два хайкуси

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 

Я не носій мови. Отже, я використав словник для підрахунку складів. Сподіваємось, це досить добре. Будь-який відгук вітається :)


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

Чи дозволяється нам використовувати наповнювач?

Хайкус Python 2:

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

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

nuum equals length one?
П'єр Арло

тривалість списку
Мальтісен

Я прошу вашої вимови першого рядка. num equals length of the listскладає 7 програм замість 5.
П’єр Арло

1
Ви можете замінити nuumна foo(тому що я читаю, як як ну-гм, що ставить вас за межу.)
ASCIIThenANSI

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.