Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Факториальные алгоритмы на разных языках
Я хочу увидеть все различные способы, которые вы можете придумать для факторной подпрограммы или программы. Есть надежда, что любой желающий может прийти сюда и посмотреть, не захочет ли он выучить новый язык.
Помыслы:
- Процессуальный
- Функциональная
- Объектно-Ориентированный
- Один лайнер
- Затемненный
- Чудак
- плохой код
- Полиглот
В основном я хочу увидеть пример различных способов написания алгоритма и то, как они будут выглядеть на разных языках.
Пожалуйста, ограничьте его одним примером для каждой записи. Я позволю вам иметь более одного примера на ответ, если вы пытаетесь выделить определенный стиль, язык или просто хорошо продуманную идею, которая подходит для того, чтобы быть в одном посте.
Единственное реальное требование состоит в том, что он должен найти факториал данного аргумента во всех представленных языках.
Будьте Изобретательны!
Рекомендуемых Руководящих Принципов:
# Language Name: Optional Style type
- Optional bullet points
Code Goes Here
Other informational text goes here
Я буду периодически идти вперед и редактировать любой ответ, который не имеет приличного форматирования.
Полиглот: 5 языков, все через работу со сверхбольшими числами
Итак, я написал полиглот, который работает на трех языках, на которых я часто пишу, а также на одном из моих других ответов на этот вопрос, который я только сегодня узнал. Это автономная программа, которая считывает одну строку, содержащую неотрицательное целое число, и печатает одну строку, содержащую его факториал. Бигны используются во всех языках, поэтому максимальный вычисляемый факториал зависит только от ресурсов Вашего компьютера.
- Perl: использует встроенный пакет bignum. Работать с
perl FILENAME. - Haskell : использует встроенные работу со сверхбольшими числами. Запуск с
runhugs FILENAMEили эквивалентом вашего любимого компилятора. - C++: требуется GMP для поддержки bignum. Для компиляции с помощью g++ используйте
g++ -lgmpxx -lgmp -x c++ FILENAMEдля связи с нужными библиотеками. После компиляции запустите./a.out. Или используйте эквивалент вашего любимого компилятора. - brainf*ck : я написал некоторую поддержку bignum в этом посте . Используя классическое распределение Мюллера, компилируйте с
bf < FILENAME > EXECUTABLE. Сделайте вывод исполняемым и запустите его. Или используйте свой любимый дистрибутив. - Whitespace: использует встроенную поддержку bignum. Работать с
wspace FILENAME.
Edit: добавлен Whitespace в качестве пятого языка. Кстати, не обертывайте код тегами <code> ; он нарушает Whitespace. Кроме того, код выглядит гораздо лучше в фиксированной ширине.
char //# b=0+0{- |0*/; #>>>>,----------[>>>>,--------
#define a/*#--]>>>>++<<<<<<<<[>++++++[<------>-]<-<<<
#Perl ><><><> <> <> <<]>>>>[[>>+<<-]>>[<<+>+>-]<->
#C++ --><><> <><><>< > < > < +<[>>>>+<<<-<[-]]>[-]
#Haskell >>]>[-<<<<<[<<<<]>>>>[[>>+<<-]>>[<<+>+>-]>>]
#Whitespace >>>>[-[>+<-]+>>>>]<<<<[<<<<]<<<<[<<<<
#brainf*ck > < ]>>>>>[>>>[>>>>]>>>>[>>>>]<<<<[[>>>>*/
exp; ;//;#+<<<<-]<<<<]>>>>+<<<<<<<[<<<<][.POLYGLOT^5.
#include <gmpxx.h>//]>>>>-[>>>[>>>>]>>>>[>>>>]<<<<[>>
#define eval int main()//>+<<<-]>>>[<<<+>>+>->
#include <iostream>//<]<-[>>+<<[-]]<<[<<<<]>>>>[>[>>>
#define print std::cout << // > <+<-]>[<<+>+>-]<<[>>>
#define z std::cin>>//<< +<<<-]>>>[<<<+>>+>-]<->+++++
#define c/*++++[-<[-[>>>>+<<<<-]]>>>>[<<<<+>>>>-]<<*/
#define abs int $n //>< <]<[>>+<<<<[-]>>[<<+>>-]]>>]<
#define uc mpz_class fact(int $n){/*<<<[<<<<]<<<[<<
use bignum;sub#<<]>>>>-]>>>>]>>>[>[-]>>>]<<<<[>>+<<-]
z{$_[0+0]=readline(*STDIN);}sub fact{my($n)=shift;#>>
#[<<+>+>-]<->+<[>-<[-]]>[-<<-<<<<[>>+<<-]>>[<<+>+>+*/
uc;if($n==0){return 1;}return $n*fact($n-1); }//;#
eval{abs;z($n);print fact($n);print("\n")/*2;};#-]<->
'+<[>-<[-]]>]<<[<<<<]<<<<-[>>+<<-]>>[<<+>+>-]+<[>-+++
-}-- <[-]]>[-<<++++++++++<<<<-[>>+<<-]>>[<<+>+>-++
fact 0 = 1 -- ><><><>< > <><>< ]+<[>-<[-]]>]<<[<<+ +
fact n=n*fact(n-1){-<<]>>>>[[>>+<<-]>>[<<+>+++>+-}
main=do{n<-readLn;print(fact n)}-- +>-]<->+<[>>>>+<<+
{-x<-<[-]]>[-]>>]>]>>>[>>>>]<<<<[>+++++++[<+++++++>-]
<--.<<<<]+written+by+++A+Rex+++2009+.';#+++x-}--x*/;}
Это один из самых быстрых алгоритмов, до 170! . Он необъяснимо терпит неудачу за пределами 170!, и это относительно медленно для небольших факториалов, но для факториалов между 80 и 170 это невероятно быстро по сравнению со многими алгоритмами.
curl http://www.google.com/search?q=170!
Есть также онлайн-интерфейс, попробуйте его прямо сейчас!
Дайте мне знать, если вы обнаружите ошибку или более быструю реализацию для больших факториалов.
EDIT:
Этот алгоритм немного медленнее, но дает результаты выше 170:
curl http://www58.wolframalpha.com/input/?i=171!
Это также упрощает их в различные другие представления.
C++: Метапрограммирование Шаблонов
Использует классический Хак перечисления.
template<unsigned int n>
struct factorial {
enum { result = n * factorial<n - 1>::result };
};
template<>
struct factorial<0> {
enum { result = 1 };
};
Использование.
const unsigned int x = factorial<4>::result;
Факториал полностью вычисляется во время компиляции на основе параметра шаблона n. таким образом, factorial<4>::result является константой после выполнения компилятором своей работы.
C# Поиск:
На самом деле ничего не нужно вычислять, просто посмотрите его. Чтобы расширить его, добавьте еще 8 чисел в таблицу, и 64-битные целые числа будут на пределе. Кроме того, вызывается класс BigNum.
public static int Factorial(int f)
{
if (f<0 || f>12)
{
throw new ArgumentException("Out of range for integer factorial");
}
int [] fact={1,1,2,6,24,120,720,5040,40320,362880,3628800,
39916800,479001600};
return fact[f];
}
Ленивый К
Ваши чисто функциональные кошмары программирования сбываются!
Единственный эзотерический Тьюринг-полный язык программирования , который имеет:
- Чисто функциональная основа, ядро и библиотеки-на самом деле, вот полный API: S K I
- Даже лямбды нет!
- Никакие номера или списки не нужны и не разрешены
- Нет явной рекурсии, но все же, позволяет рекурсию
- Простой бесконечный ленивый потоковый механизм ввода-вывода
Вот Факториальный код во всей его парентетической красе:
K(SII(S(K(S(S(KS)(S(K(S(KS)))(S(K(S(KK)))(S(K(S(K(S(K(S(K(S(SI(K(S(K(S(S(KS)K)I))
(S(S(KS)K)(SII(S(S(KS)K)I))))))))K))))))(S(K(S(K(S(SI(K(S(K(S(SI(K(S(K(S(S(KS)K)I))
(S(S(KS)K)(SII(S(S(KS)K)I))(S(S(KS)K))(S(SII)I(S(S(KS)K)I))))))))K)))))))
(S(S(KS)K)(K(S(S(KS)K)))))))))(K(S(K(S(S(KS)K)))K))))(SII))II)
Особенности:
- Нет вычитания или условных выражений
- Печатает все факториалы (если вы ждете достаточно долго)
- Использует второй слой церковных цифр для преобразования N-го факториала в N! звездочки следуют за новой строкой
- Использует комбинатор Y для рекурсии
В случае, если вы заинтересованы в попытке понять его, вот схема исходного кода для запуска через более ленивый компилятор:
(lazy-def '(fac input)
'((Y (lambda (f n a) ((lambda (b) ((cons 10) ((b (cons 42)) (f (1+ n) b))))
(* a n)))) 1 1))
(для подходящих определений Y, минусы, 1, 10, 42, 1+, и *).
EDIT:
Ленивый K Факториал в десятичной системе счисления
( 10 КБ тарабарщины , иначе я бы ее вставил). Например, в строке Unix:
$ echo "4" | ./lazy facdec.lazy
24
$ echo "5" | ./lazy facdec.lazy
120
Довольно медленно для чисел выше, скажем, 5.
Код немного раздут, потому что мы должны включить библиотечный код для всех наших собственных примитивов (код , написанный на языке Hazy, интерпретатор исчисления lambda и компилятор LC-to-Lazy K, написанный на языке Haskell).
XSLT 1.0
Входной файл, factorial.xml :
<?xml version="1.0"?>
<?xml-stylesheet href="factorial.xsl" type="text/xsl" ?>
<n>
20
</n>
Файл XSLT, factorial.xsl :
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" >
<xsl:output method="text"/>
<!-- 0! = 1 -->
<xsl:template match="text()[. = 0]">
1
</xsl:template>
<!-- n! = (n-1)! * n-->
<xsl:template match="text()[. > 0]">
<xsl:variable name="x">
<xsl:apply-templates select="msxsl:node-set( . - 1 )/text()"/>
</xsl:variable>
<xsl:value-of select="$x * ."/>
</xsl:template>
<!-- Calculate n! -->
<xsl:template match="/n">
<xsl:apply-templates select="text()"/>
</xsl:template>
</xsl:stylesheet>
Сохраните оба файла в одном каталоге и откройте factorial.xml в IE.
Python: функциональный, ОДН-вкладыш
factorial = lambda n: reduce(lambda x,y: x*y, range(1, n+1), 1)
factorial = lambda n: reduce(lambda x,y: x*y, range(1, n+1), 1)
NOTE:
- Он поддерживает большие целые числа. Пример:
print factorial(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915\
608941463976156518286253697920827223758251185210916864000000000000000000000000
- Он не работает для n < 0 .