Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Smalltalk
Перезагрузить страницу Io - язык программирования
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию Io - язык программирования - 27.09.2016, 02:12

Io создан на основе:
1. Smalltalk (всё есть объекты)
2. Self (наследование на основе прототипов)
3. LISP (код_как_данные)
4. Lua (компактность и встраиваемость)
Несколько исходников:
из римской в арабскую
JS Код:
Sequence replace := method( b, c, ((self .. c) split(b) map(x, x .. c) join exSlice(0, - 2 * c size)))
r_a   := Map clone
r_a atPut( "I", "1"); r_a atPut( "V", "5"); r_a atPut( "X", "10"); r_a atPut( "L", "50")
r_a atPut( "C", "100"); r_a atPut( "D", "500"); r_a atPut( "M", "1000")
input := method( File standardInput readLine)
line  := "------------------------------------------\n"
writeln("Press n for exit"); w := 0
loop( "rim = " print; rim := input; if( rim == "n", break)
p     := method( rim replace("IV", "IIII") replace("IX", "VIIII") replace("XL", "XXXX") replace("XC", "LXXXX") replace("CD", "CCCC")  replace("CM", "DCCCC") asList)
arab  := method( p foreach( v, w := w + r_a at( v) asNumber))
//arab  := method( for(i, 0, p size - 1, w := w + r_a at( p at( i)) asNumber))
write( line, " rim = ", rim, " ===> arab = ", arab, "\n", line)
    )
из арабской в римскую
JS Код:
rim   :=    list( "I", "V", "X", "L", "C", "D", "M" )
rs    :=  method( a asList reverse map( asNumber) map( i, v,
                  w := ""; w2 := ""; i2 := 2*i; i1 := 2*i+1
              if( v == 4, w := rim at(i2) .. rim at(i1),
              if( v == 9, w := rim at(i2) .. rim at(2*i+2),
              if((v1 := v - 5) < 0, for( j, 1, v, w := w .. rim at(i2)),
                  w1 := rim at(i1); for( j, 1, v1, w2 := w2 .. rim at(i2)); w := w1 .. w2)))) reverse)
                  t := ""; rez := method( rs foreach( v, t := t .. v))
input :=  method( File standardInput readLine)
line  := "--------------------------------------\n"
writeln("Press n for exit")
loop(" arab = " print; a := input; if(a == "n",  break )
     write( line, " arab = ", a, " ===> rim = ", rez, "\n", line)
    )
реализация zipWith - "грубая"
JS Код:
s := Map clone
s atPut( "+", "x + y"); s atPut( "-", "x - y")
s atPut( "*", "x * y"); s atPut( "/", "x / y")
input_r := method( File standardInput readLine)
input_x := method( File standardInput readLine)
input_y := method( File standardInput readLine)
input_z := method( File standardInput readLine)
loop(
" Vvedite r        := " print; r := input_r; if( r == "n", break)
" Vvedite 1 spisok := " print; x := input_x split(" ") map( asNumber)
" Vvedite 2 spisok := " print; y := input_y split(" ") map( asNumber)
" Vvedite operator := " print; z := input_z
d := method( x, y, doString( s at( z)))
zipWith := method( x, y, x map( i, v, d( v, y at(i))))
zipWith( x, y, z) println
   )
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,248
Сказал(а) спасибо: 26
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 27.09.2016, 05:49

Как-то Вы своими примерами без единого поясения скорее антирекламу делаете..
Ответить с цитированием
  (#3 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 27.09.2016, 18:09

Java Код:
Sequence replace := method( b, c, ((self .. c) split(b) map(x, x .. c) join exSlice(0, - 2 * c size)))

r_a   := Map clone

r_a atPut( "I", "1"); r_a atPut( "V", "5"); r_a atPut( "X", "10"); r_a atPut( "L", "50")

r_a atPut( "C", "100"); r_a atPut( "D", "500"); r_a atPut( "M", "1000")

input := method( File standardInput readLine)

line  := "------------------------------------------\n"

writeln("Press n for exit"); w := 0

loop( "rim = " print; rim := input; if( rim == "n", break)

p     := method( rim replace("IV", "IIII") replace("IX", "VIIII") replace("XL", "XXXX") replace("XC", "LXXXX") replace("CD", "CCCC")  replace("CM", "DCCCC") asList)

arab  := method( p foreach( v, w := w + r_a at( v) asNumber))

//arab  := method( for(i, 0, p size - 1, w := w + r_a at( p at( i)) asNumber))

write( line, " rim = ", rim, " ===> arab = ", arab, "\n", line)

    )
Ответить с цитированием
  (#4 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 27.09.2016, 18:54

В первой строке определяется функция замены одной строки другой.
Далее клонируется объект Map и присваивается переменной r_a, потом происходит "наполнение" хеша.
Далее идёт ввод (излишне многословный)
Зачем нужно p := method( rim replace("IV", "IIII") replace(... ?
Дело в том, что IV и VI состоят из одних и тех же символов, и без replace("IV", "IIII") могут иметь одинаковое значение (6)...
Далее идёт перебор foreach полученного списка - символы переводятся в цифры(asNumber), результат суммируется, получается список из чисел, берётся последнее значение и присваевается arab. Далее - вывод.
Ответить с цитированием
  (#5 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,889
Сказал(а) спасибо: 2
Поблагодарили 293 раз(а) в 293 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 27.09.2016, 20:46

Не впечатлило. На Прологе будет значительно короче, проще, понятней.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
chaetal chaetal вне форума
Member
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.04.2005
По умолчанию 28.09.2016, 09:33

И меня, как Smalltalk-ера, тоже не очень впечатляет…
Ответить с цитированием
  (#7 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 30.09.2016, 22:32

Не впечатлило. На Прологе будет значительно короче, проще, понятней.
Пожалуйста, реализацию на ПРОЛОГе (или Mercury) в студию...
Ответить с цитированием
  (#8 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,889
Сказал(а) спасибо: 2
Поблагодарили 293 раз(а) в 293 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 01.10.2016, 14:28

Первые две задачи в одном флаконе (выбран swi-prolog):
prolog Код:
замена(1000, 'M', 1).
   замена(900, 'CM', 2).
   замена(500, 'D', 1).
   замена(400, 'CD', 2).
   замена(100, 'C', 1).
   замена(90, 'XC', 2).
   замена(50, 'L', 1).
   замена(40, 'XL', 2).
   замена(10, 'X', 1).
   замена(9, 'IX', 2).
   замена(5, 'V', 1).
   замена(4, 'IV', 2).
   замена(1, 'I', 1).

   араб_рим(0,''):-!.
   араб_рим(A,R):- замена(A1,R1,_), A2 is A-A1, A2>=0,
           араб_рим(A2,R2), string_concat(R1,R2,R).
   
   рим_араб(R,0):- string_to_atom(R,''),!.
   рим_араб(R,A):- (замена(A1,R1,2),string_concat(R1,R2,R);
                    замена(A1,R1,1),string_concat(R1,R2,R)),!,
                    рим_араб(R2,A2), A is A1+A2.

Вот так работает:
Цитата:
1 ?- араб_рим(1996,R).
R = "MCMXCVI" .

2 ?- рим_араб('MCMXCVI',A).
A = 1996.
Ответить с цитированием
  (#9 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 01.10.2016, 16:06

А вот так:
Java Код:
arab := list( 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 )
rim  := list( "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" )
myw1 := method( while( arab at(i) <= n, s = s .. rim at(i); n = n - arab at(i)) return(s))
myw  := method( while( n > 0, myw1; i = i + 1) return(s))
input := method( File standardInput readLine)
line  := "---------------------------\n"
writeln("Press Enter for exit")
loop( i := 0; s := ""
    inp := input; if(inp isNil, break)
    n   := inp asNumber; if(n isNan,  break )
    write(line, " ", n, "  ===>  ", myw, "\n", line)
    )
Ответить с цитированием
  (#10 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,889
Сказал(а) спасибо: 2
Поблагодарили 293 раз(а) в 293 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 01.10.2016, 20:38

А вот так уже читабельней и понятней.
Но Вы привели решение первой задачи и достаточно многословное. А я привёл решение первой и второй. На мой взгляд, на Прологе решения понятнее и исходник значительно меньше.

Ради спортивного интереса, вот короткое, но не очень то и понятное незнакомому с прологом человеку решение первой задачи на Visual Prolog7.5 (только цель):
Visual Prolog Код:
run():- L1=[1000,900,500,400,100,90,50,40,10,9,5,4,1],
        L2=["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"],
        L3=zip(L1,L2),
        write(concatList(unfold(1996,{(I)=tuple(R1,I-I1):-tuple(I1,R1) in L3,I1<=I,!}))).
Ответить с цитированием
  (#11 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,169
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 02.10.2016, 11:46

Вспомнилась старая тема:
Задача на рефале

десять лет прошло, с ума сойти...
Ответить с цитированием
  (#12 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 03.10.2016, 00:32

Уважаемый Винитарх, конечно всё это так, но!
Структура данных у Вас достаточно многословная.
В решении первой задачи у меня - только синтаксис Io "виноват".
В решении второй - короткий список.
Есть намерение наваять вторую на Mercury, но не знаю...
"Критической массы" знаний у меня нет
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
gromozeka gromozeka вне форума
Флудер
 
Аватар для gromozeka
 
Сообщений: 3,169
Сказал(а) спасибо: 6
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 28.02.2005
Адрес: Израиль
По умолчанию 03.10.2016, 09:15

первая задачка на Питоне
python Код:
def arab2rome(num):
    if num==0: return ""
    for r,n in [("M",1000),("CM",900),("D",500),("CD",400),("C",100),("XC",90),
                ("L",50),("XL",40),("X",10),("IX",9),("V",5),("IV",4),("I",1)]:
        if n<=num: return r+arab2rome(num-n)
Ответить с цитированием
  (#14 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,889
Сказал(а) спасибо: 2
Поблагодарили 293 раз(а) в 293 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.10.2016, 21:15

Цитата:
Сообщение от ayax Посмотреть сообщение
Структура данных у Вас достаточно многословная
Поясните пожалуйста поподробнее, где и какая именно структура данных у меня многословней, чем у вас. Приведите примеры.
Цитата:
Сообщение от ayax Посмотреть сообщение
В решении первой задачи у меня - только синтаксис Io "виноват"
Он не в чём не "виноват". Он таким многословным и задумывался.
Цитата:
Сообщение от ayax Посмотреть сообщение
В решении второй - короткий список.
Да все Ваши решения пока многословны. Быть может в этом "виноват" не язык Io?
Ответить с цитированием
  (#15 (permalink)) Старый
ayax ayax вне форума
Member
 
Сообщений: 45
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.08.2016
По умолчанию 04.10.2016, 22:18

Ваша структура данных:
prolog Код:
замена(1000, 'M', 1).
   замена(900, 'CM', 2).
   замена(500, 'D', 1).
   замена(400, 'CD', 2).
   замена(100, 'C', 1).
   замена(90, 'XC', 2).
   замена(50, 'L', 1).
   замена(40, 'XL', 2).
   замена(10, 'X', 1).
   замена(9, 'IX', 2).
   замена(5, 'V', 1).
   замена(4, 'IV', 2).
   замена(1, 'I', 1).
Две моих:
Java Код:
rim   :=    list( "I", "V", "X", "L", "C", "D", "M" )
и структура на JavaScript
JS Код:
r_a = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
Да, да "многословие..."
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самый крутой язык программирования Garik Мысли вслух 7103 08.08.2016 13:00
Язык программирования Gwai Prolog 8 17.05.2011 13:42
Помогите выбрать язык программирования? Джо++ Вопросы начинающих программистов 4 14.05.2011 19:03
Какой язык программирования выбрать St.Ark Вопросы начинающих программистов 30 16.03.2011 18:58
Какой выбрать язык программирования rGradeStd Вопросы начинающих программистов 7 16.01.2011 17:12
Какой выбрать язык для программирования Integrale2 Вопросы начинающих программистов 3 07.01.2011 01:56
Язык программирования Barsic Blan Форум программистов 1 22.03.2008 10:26
язык программирования Матрикс Форум программистов 1 07.06.2007 19:16
Скрипт или язык программирования GEV_256 Мысли вслух 24 09.01.2006 01:54
Язык программирования Loid Мысли вслух 17 29.05.2005 23:20
Скриптовый язык vs Язык программирования relonar Мысли вслух 4 24.09.2004 02:14



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов