Комментарии 89
И нулевое место: 1C Бухгалтерия 8! )
а что ужасного в реализации этого алгоритма на встроенном языке 1с?
Встроенный язык 1C ужасен.
русскими буковками? Используйте английские
отключите ему хабр кто-нибудь!
забавно. Никогда не думал, что единственным ответом мой вопрос может быть такая сентенция.
Можно все-таки услышать внятные аргументы?
Можно все-таки услышать внятные аргументы?
Как видите, многие пользователи Хабра используют условные рефлексы и эмоции вместо аргументов. Лично я бы привел в качестве номера одни ru.wikipedia.org/wiki/Malbolge или похожие на него, однако 1С Бухгалтерия, видимо, принесла горе и проклятие в многие семьи, и эта ненависть передается из поколения в поколение.
Процедура ЧислаФибоначчи()
Ф0 = 0;
Ф1 = 1;
для й = 1 по 16 цикл
Ф = Ф0 + Ф1;
Сообщить (Ф0);
Ф0 = Ф1;
Ф1 = Ф;
конецЦикла;
КонецПроцедуры
Испугались?:)
Ф0 = 0;
Ф1 = 1;
для й = 1 по 16 цикл
Ф = Ф0 + Ф1;
Сообщить (Ф0);
Ф0 = Ф1;
Ф1 = Ф;
конецЦикла;
КонецПроцедуры
Испугались?:)
Кто писал под 1С — тот в цирке не смеется…
Нет там ничего ужасно.
Поставившие плюсики просто не знают встроенный язык 1с, и это незнание приводит их в ужас :)
Поставившие плюсики просто не знают встроенный язык 1с, и это незнание приводит их в ужас :)
govnokod.ru/1c
познайте великую тайну!
познайте великую тайну!
Приведите код на 1с который будет страшнее хотя бы брейнфака =)
Это, скорее, в Ненормальное программирование надо.
Впечатляет
Статья просто супер :) порадовали языки типа Brainfuck и Brainloller.
Когда-то Brainfuck меня тоже очень впечатлил: bf.kzn.ru/
я ещё делал так:
нам понадобятся следующие операции:
положить число на вершину стека
file: [.bat
снять число с вершины стека
file: ].bat
положить число на вершину стека из аккумулятора
file: [a.bat
снять число с вершины стека в аккумулятор
file: ]a.bat
сложить два числа на вершине стека
file: +.bat
вычесть два числа на вершине стека
file: -.bat
положить в аккумулятор число из стека, которое находится на смещении, которое лежит на вершине стека
file: load_av.bat
распечатать число на вершине стека
file: print.bat
теперь можно сделать что-то полезное, например посчитать числа Фибоначчи
пишем рекурсивную функцию:
file: --fib.bat
ну и обёртку для неё
file: ---formula.bat
и вызываем:
55 — правильный ответ :)
нам понадобятся следующие операции:
положить число на вершину стека
file: [.bat
set /a sp+=1 call set /a s%sp%=%1
снять число с вершины стека
file: ].bat
set /a sp-=1
положить число на вершину стека из аккумулятора
file: [a.bat
set /a sp+=1 call set /a s%sp%=%%accum%%
снять число с вершины стека в аккумулятор
file: ]a.bat
call set scc=%%s%sp%%% call set accum=%%scc%% set /a sp-=1
сложить два числа на вершине стека
file: +.bat
set /a sp1=sp-1 call set /a s%sp1%+=s%sp% set sp=%sp1%
вычесть два числа на вершине стека
file: -.bat
set /a sp1=sp-1 call set /a s%sp1%-=s%sp% set sp=%sp1%
положить в аккумулятор число из стека, которое находится на смещении, которое лежит на вершине стека
file: load_av.bat
call ]a set /a spp=sp-%accum% call set scc=%%s%spp%%% call set accum=%%scc%%
распечатать число на вершине стека
file: print.bat
@echo off call set /a scc=%%s%sp%%% call echo.%%scc%%
теперь можно сделать что-то полезное, например посчитать числа Фибоначчи
пишем рекурсивную функцию:
file: --fib.bat
call ]a if %accum%==0 ( call [ 0 exit /b ) if %accum%==1 ( call [ 1 exit /b ) call [a call [a call [ 1 call - call --fib call [ 1 call load_av call [a call [ 2 call - call --fib call + call ]a call ] call [a
ну и обёртку для неё
file: ---formula.bat
( call [ %1 call --fib call print>con )>nul
и вызываем:
D:\temp\bat>---formula.bat 10 D:\temp\bat>( call [ 10 call --fib call print 1>con ) 1>nul 55
55 — правильный ответ :)
Аплодирую даме стоя! Статья просто на отлично, спасибо.
Haskell FTW! (-:
> Brainloller
Мне понравилось! А оно умеет делать драйверы ядра? Работать с TCP/IP? =)
Мне понравилось! А оно умеет делать драйверы ядра? Работать с TCP/IP? =)
Поскольку язык Тьюринг-полный, то умеет делать все. А поскольку эзотерический — то ценой невероятных лишений, на которые не пойдет ни один здравомыслящий человек :-)
Зато как круто будет писать программы на нем художникам! ;)
Для художников другой — esolangs.org/wiki/Piet. До него у меня тоже еще руки не дошли :-)
Числа фибоначчи на Thue ( esoteric.voxelperfect.net/wiki/Thue )
#::= print Fibonacci numbers
#::= Laurent Vogel, 2002-11-08
#::= Unary-Coded Decimal (UCD) numbers:
#::= each digit is as many '*' chars;
#::= Digits are separated with ','.
#::= Hence ',' is 0 and '*,,' is 10.
#::= digits are reversed (digit := 9 — digit) before and
#::= after addition, to detect overflow when trying to
#::= remove a '*' from ','.
()::=_
#::= reverse and print UCD numbers
_*********,::=,_.0
_********,::=,*_.1
_*******,::=,**_.2
_******,::=,***_.3
_*****,::=,****_.4
_****,::=,*****_.5
_***,::=,******_.6
_**,::=,*******_.7
_*,::=,********_.8
_,::=,*********_.9
.0::=~0
.1::=~1
.2::=~2
.3::=~3
.4::=~4
.5::=~5
.6::=~6
.7::=~7
.8::=~8
.9::=~9
#::= messages
,,::=,0>
1>,::=,1>
2>,::=,2>
0>*::=*0>
1>*::=*1>
2>*::=*2>
0>|::=|0>
1>|::=|1>
2>|::=|2>
#::= redundant, but for speed — These provoke bugs in the
#::= original implementation.
#::= ****
#::= 1>****::=****1>
#::= 2>****::=****2>
#::= *******
#::= 1>*******::=*******1>
#::= 2>*******::=*******2>
#::= swap left and right numbers
,a::=b1>
*a::=b2>
1>c::=c::=c::=f|d
#::= reverse right number
d::=*********e
*e*::=e
e,::=,d
e]::=g::=1>g*
,1>g::=g::=|g::=ig
*i::=<
,i::=i,*********
|i::=g::=
#::= when printed, activate a again to swap
_]::=.\
#::= print Fibonacci numbers
#::= Laurent Vogel, 2002-11-08
#::= Unary-Coded Decimal (UCD) numbers:
#::= each digit is as many '*' chars;
#::= Digits are separated with ','.
#::= Hence ',' is 0 and '*,,' is 10.
#::= digits are reversed (digit := 9 — digit) before and
#::= after addition, to detect overflow when trying to
#::= remove a '*' from ','.
()::=_
#::= reverse and print UCD numbers
_*********,::=,_.0
_********,::=,*_.1
_*******,::=,**_.2
_******,::=,***_.3
_*****,::=,****_.4
_****,::=,*****_.5
_***,::=,******_.6
_**,::=,*******_.7
_*,::=,********_.8
_,::=,*********_.9
.0::=~0
.1::=~1
.2::=~2
.3::=~3
.4::=~4
.5::=~5
.6::=~6
.7::=~7
.8::=~8
.9::=~9
#::= messages
,,::=,0>
1>,::=,1>
2>,::=,2>
0>*::=*0>
1>*::=*1>
2>*::=*2>
0>|::=|0>
1>|::=|1>
2>|::=|2>
#::= redundant, but for speed — These provoke bugs in the
#::= original implementation.
#::= ****
#::= 1>****::=****1>
#::= 2>****::=****2>
#::= *******
#::= 1>*******::=*******1>
#::= 2>*******::=*******2>
#::= swap left and right numbers
,a::=b1>
*a::=b2>
1>c::=c::=c::=f|d
#::= reverse right number
d::=*********e
*e*::=e
e,::=,d
e]::=g::=1>g*
,1>g::=g::=|g::=ig
*i::=<
,i::=i,*********
|i::=g::=
#::= when printed, activate a again to swap
_]::=.\
#::= when printed, activate a again to swap
_]::=.\
_]::=.\
#::= when printed, activate a again to swap
_]::=.<c]
.\::=~\n
#::= the comma was left behind after printing
j<,::=a
::=
[j,*(.0)]
Источник: lvogel.free.fr/thue.htm
(P.S… Ох уж этот парсер… )
_]::=.<c]
.\::=~\n
#::= the comma was left behind after printing
j<,::=a
::=
[j,*(.0)]
Источник: lvogel.free.fr/thue.htm
(P.S… Ох уж этот парсер… )
А про Whitespace опять забыли :(
нашел для себя интересное — язык sanscript
может кто то еще что то такое подскажет — программирование в виде функциональных визуальных блоков
может кто то еще что то такое подскажет — программирование в виде функциональных визуальных блоков
Мне Hanoi Love понравился )))
Забавно. Спасибо (8
Надо ещё добавить скрипт для машины Тьюринга :)
мама, роди меня назад!
чего только не придумают…
чего только не придумают…
Да что уж там, сразу:
sudo echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
sudo echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
О!
Много лет назад у Novell был продукт AppWare (http://en.wikipedia.org/wiki/AppWare) с аналогичной идеей. У меня даже лицензионная коробка валяется :)))
Много лет назад у Novell был продукт AppWare (http://en.wikipedia.org/wiki/AppWare) с аналогичной идеей. У меня даже лицензионная коробка валяется :)))
Про Sanscript не знал… интерфейсом очень похож на программы имитационного моделирования…
Реализация на 7.4. Microsoft SQL Server прокатит только начиная с версии 2005.
$ENTRY Go { = <Prout <Symb <FN <Numb <Card>>>>; } FN { s.Number = <FN s.Number 0 1>; } DoFN { 0 s.Current s.Next = s.Current; s.Counter s.Current s.Next = <DoFN <Sub s.Counter 1> s.Next <Add s.Current s.Next>>; }
Рефал
Не флейма ради, но есть впечатление, что вы сделали упор на «запутанность» и «противоестественность» вычисления, а не на… хм, скажем так, неожиданность.
Например, ваш код на Haskell
можно было бы написать как
, и вы знаете, я не поручусь, что этот вариант менее понятен, чем «классические» императивные варианты. Даже смысл доллара можно интуитивно осознать (ну, если знать, строка какого вида получится в результате).
А тот же J интересен не тем, что «практически любое выражение на нем можно записать несколькими способами» (сложно найти язык, на котором нельзя), и не тем, что в нём используется некая «парадигма программирования на уровне функций» (я бы использовал в переводе термины «функциональный подход», «функции высшего порядка» и «комбинаторы» — но опять же, с этой точки зрения он не особо отличается от того же Haskell-а), — не тем, что на нём можно писать странные и запутанные программы, что для нормальных людей и нормальных языков обычно минус, а тем, что он — векторный на уровне языка. Что есть очень интересный и редкий плюс.
Например, ваш код на Haskell
module Main where import Text.Printf fibs :: [Int] fibs = 0 : 1 : zipWith (+) fibs (tail fibs) line n = printf "%d, " $ fibs !! n main = do sequence_ $ map line [1..16] putStrLn "..."
можно было бы написать как
main = putStrLn $ withDots $ join $ take 16 fibs where fibs = 1 : 1 : zipWith (+) fibs (tail fibs) join = foldl (\a b -> a ++ show b ++ ", " ) "" withDots = (++ "...")
, и вы знаете, я не поручусь, что этот вариант менее понятен, чем «классические» императивные варианты. Даже смысл доллара можно интуитивно осознать (ну, если знать, строка какого вида получится в результате).
А тот же J интересен не тем, что «практически любое выражение на нем можно записать несколькими способами» (сложно найти язык, на котором нельзя), и не тем, что в нём используется некая «парадигма программирования на уровне функций» (я бы использовал в переводе термины «функциональный подход», «функции высшего порядка» и «комбинаторы» — но опять же, с этой точки зрения он не особо отличается от того же Haskell-а), — не тем, что на нём можно писать странные и запутанные программы, что для нормальных людей и нормальных языков обычно минус, а тем, что он — векторный на уровне языка. Что есть очень интересный и редкий плюс.
Упор сделан в полном соответствии с заголовком статьи :-)
Если серьезно, мне вообще Haskell и J дались с трудом, FP и Hanoi Love и то проще, и пишу я на них достаточно криво, так что что вышло — то вышло. Векторных языков не так мало, тот же FP, просто до большинства из них я еще не добралась.
Если серьезно, мне вообще Haskell и J дались с трудом, FP и Hanoi Love и то проще, и пишу я на них достаточно криво, так что что вышло — то вышло. Векторных языков не так мало, тот же FP, просто до большинства из них я еще не добралась.
А можно было взять и написать просто и ясно:
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib x = fib (x — 1) + fib (x — 2)
И трапнуться из-за отсутствия хвостовой рекурсии — посчитайте-ка им 50-е значение. Или 100-е.
Не говоря уже про то, что в данной задаче речь не только о написании алгоритма (которого в моём коде ровно одна строчка,
Не говоря уже про то, что в данной задаче речь не только о написании алгоритма (которого в моём коде ровно одна строчка,
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)), но и подгонке к требуемому формату вывода (которым занимаются все остальные строчки).
Причем тут хвостовая рекурсия? :)
Проблемы с производительностью из-за отсутствия запоминания ответов, получается что fib 1 вызывается fib n раз
Проблемы с производительностью из-за отсутствия запоминания ответов, получается что fib 1 вызывается fib n раз
Это да. Но при возникновении хвостовой рекурсии потребность в запоминании ответов даже не возникла бы.
Можно объяснить как? Хвостовая рекурсия к функции sylvio вообще неприменима. Или вы предлагаете записать функцию так?:
В такой реализации хвостовая рекурсия применима, но на производительность тоже не особо влияет.
fib :: Integer -> Integer
fib n = f 0 1 n
where
f a b 0 = a
f a b n = f b (a+b) (n-1)
В такой реализации хвостовая рекурсия применима, но на производительность тоже не особо влияет.
Oracle 11g:
with t (n, c2, c3) as ( select 1, 0, 1 from dual union all select n + rownum, c3, c2+c3 from t where n <= 16 ) -- -- select n, c2 fibonacci from t
Как указали выше, Malbolge даст фору первому номеру в списке, т.к. программу на нем придется писать на суперкомпьютере методом случайного перебора.
wget «www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html#series»
Вот, противоестественно для программиста =)
ЗЫ grep надо добавить, лень
Вот, противоестественно для программиста =)
ЗЫ grep надо добавить, лень
A bit of python…
print '\n'.join(map(str,reduce(lambda a,b:a+[a[-1]+a[-2]],range(10),[0,1])))
Всегда нравились ваши интересные и веселые заметки. А это особенно удалась. Кстати Unary на Rosseta Code не нашел :)
: fib ( n -- f ) 0 1 rot 0 ?do over + swap loop drop ;
10 fib . 55 ok
По поводу Brainloller: вы бы ещё на перфокартах написали!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
10 противоестественных способов вычисления чисел Фибоначчи