Проекты [программирование]
| |
mortereinar | Дата: Суббота, 17.11.2007, 10:34 | Сообщение # 1 |
Группа: Удаленные
| У кого задание с римскими цифрами вот два модуля которые помогут их переводить в нормальные арабские числа: Code def lat(str) str=str.reverse a=[] for i in 0...str.size #p str[i].chr case str[i].chr when "I" a << 1 when "V" a << 5 when "X" a << 10 when "L" a << 50 when "C" a << 100 when "D" a << 500 when "M" a << 1000 end end return a end
def sum(a) s=a[0] for i in 0...a.size-1 if a[i+1] < a[i] s-=a[i+1] else s+=a[i+1] end end return s end p sum(lat("MMMCMXCIX"))
|
|
| |
kmeaw | Дата: Суббота, 17.11.2007, 12:38 | Сообщение # 2 |
 Рядовой
Группа: Проверенные
Сообщений: 35
Статус: Offline
| http://kmeaw.com/rim.cpp - писал вместе со знакомым, а он затем очень подробно прокомментировал этот код. Хотя программа и на C с libstdc++, она может пригодится, как источник алгоритмов преобразования. Если я правильно помню, там применялись довольно хитрые оптимизации.
-- kmeaw aka bdd1
|
|
| |
Evkingen | Дата: Суббота, 17.11.2007, 14:13 | Сообщение # 3 |
 Рядовой
Группа: 11
Сообщений: 46
Статус: Offline
| Конвертор Arabic -> Roman Code int=gets.to_i k=int b=[] arb=[1,4,5,9,10,40,50,90,100,400,500,900,1000,4000] Roman = { 1 => "I", 4 => "IV", 5 => "V", 9 => "IX", 10 => "X", 40 => "XL", 50 => "L", 90 => "XC", 100 => "C", 400 => "CD", 500 => "D", 900 => "CM", 1000 => "M"} while int>0 for i in 0...arb.size-1 if arb[i]>int b<<Roman[arb[i-1]] break end end int=int-arb[i-1] end puts "#{k} -> #{b.join}" Добавлено (17.11.2007, 14:13) --------------------------------------------- поправка... Code for i in 0...arb.size-1 на Code for i in 0...arb.size
|
|
| |
vorl | Дата: Суббота, 17.11.2007, 19:03 | Сообщение # 4 |
 Рядовой
Группа: 11
Сообщений: 16
Статус: Offline
| http://www3.msiu.ru/~van11/project1/original/stack/ Добавлено (17.11.2007, 19:03) --------------------------------------------- [code][/code] Quote у когонить первоисходник задачи 3. 12 а то на почту забыла кинуть(у кого есть киньте пожалуйста)))))
skype: vorl13 (\(\ (>'.') (~(")(")
|
|
| |
ldo2 | Дата: Суббота, 17.11.2007, 19:14 | Сообщение # 5 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Проект Для того и лежит. Токо там из RunTest.rb надо удалить тесты что после #add {} идут, они под 3.14 сделаны
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
vorl | Дата: Суббота, 17.11.2007, 20:17 | Сообщение # 6 |
 Рядовой
Группа: 11
Сообщений: 16
Статус: Offline
| Quote Конвертор Arabic -> Roman он работает неправильно: ghb 3888 (максимальное возможное) выдает CCLXXXVIII (а это 288), должен выдать MMMDCCCLXXXVIII вот модуль для конвертирования в обе стороны дотошно не тестил, но вроде работает Code module RomanNumerus def roman(n) raise "#{n} > 3888" if n > 3888 n = n.to_s; ans = "" h = {1 => 'I', 5 => 'V', 10 => 'X', 50 => 'L', 100 => 'C', 500 => 'D', 1000 => 'M'} for i in 0...n.size p = n.size-1-i char = n[i].chr.to_i case p when 3 ans += h[1000]*char else j = 10**p if char <= 3 ans += h[j]*char elsif char <= 8 ans += h[5*j] if char-5 >= 0 ans += h[j]*(char-5) else ans = ans[0...-1]+h[j]+ans[-1].chr end else ans += (h[j]+h[10*j]) end end end return ans end
def arab(roman) ans = 0 for i in 0...roman.size ans += sign(i,roman) end ans end def sign(i,s) raise 'bad Roman num' if s !~ /^[I,X,C,D,L,M,V]{1,}$/ h = {'I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000} return h[s[i].chr] if i == s.size-1 return h[s[i].chr] < h[s[i+1].chr] ? (-h[s[i].chr]) : (h[s[i].chr]) end module_function :roman, :arab , :sign end puts RomanNumerus.roman(3888) puts RomanNumerus.arab('CCLXXXVIII')
skype: vorl13 (\(\ (>'.') (~(")(")
|
|
| |
Evkingen | Дата: Суббота, 17.11.2007, 20:30 | Сообщение # 7 |
 Рядовой
Группа: 11
Сообщений: 46
Статус: Offline
| vorl Программа работает правильно P.S Quote (Evkingen) Code for i in 0...arb.size Добавлено (17.11.2007, 20:30) --------------------------------------------- ну и P.S.S самое большое число 3999)))
|
|
| |
sma39 | Дата: Воскресенье, 18.11.2007, 01:45 | Сообщение # 8 |
 Лейтенант
Группа: 61
Сообщений: 114
Статус: Offline
| Quote (ldo2) А что нам Радыгин на 19-11-2007 задавал? Там чего-то про те фиговины что в классе делали... Типа определяли Московские номера, не московские... Помню что необязательное, т.е присылать ненадо.
|
|
| |
Xaron1 | Дата: Воскресенье, 18.11.2007, 02:03 | Сообщение # 9 |
Группа: Удаленные
| Мой вариант кода перевода десятичных в римские: Code def decToRome(c) dec=c raise "Число #{c} больше 3999" if dec.to_i > 3999 raise "Не существует представления 0 в римской системе счисления" if dec.to_i == 0 numerals={1=>"I",5=>"V",10=>"X",50=>"L",100=>"C",500=>"D",1000=>"M"} rome="" pose=dec.size-1 until dec.empty? n=dec.slice!(0..0).to_i if n<=3 and rome+=numerals[10**pose]*n elsif n>3 and n<=5 rome+=numerals[10**pose]*(5-n)+numerals[5*10**pose] elsif n>5 and n<=8 rome+=numerals[5*10**pose]+numerals[10**pose]*(n-5) else rome+=numerals[10**pose]+numerals[10**(pose+1)] end pose-=1 end return rome end end
|
|
| |
Xaron1 | Дата: Понедельник, 19.11.2007, 02:10 | Сообщение # 10 |
Группа: Удаленные
| Написла таки на скорую руку генератов тестов. Так как тесты он генерирует на основе имеющейся же программы, толк от него один: намутить побольше тестов, чтоб мозолили глаза. Ну и всетаки он проверяет вашу программу на тот факт, что она хоть какой-то ответ сможет выдать, так что польза от этого тоже есть. Писал я генератор под свое задание: исправить компилятор формул, чтоб получал на вход шестнадцатиричные цифры, а на выход выдавал программу с римскими, но, думаю, не должно составить труда почти каждому подогнать генератор под свое задание. Итак, мой генератор; сгенеренный файл.
|
|
| |
ldo2 | Дата: Вторник, 20.11.2007, 20:42 | Сообщение # 11 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Простые деревья вывода. Тексты программ и тесты здесь. Warning: тесты написаны не очень хорошо, поэтому медленные и в не везде работают. Добавлено (20.11.2007, 19:05) --------------------------------------------- новые смайлы рулят *бухой* Добавлено (20.11.2007, 20:42) --------------------------------------------- Модные деревья вывода: деревья.
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
kmeaw | Дата: Среда, 21.11.2007, 15:41 | Сообщение # 12 |
 Рядовой
Группа: Проверенные
Сообщений: 35
Статус: Offline
| Задача с добавлением поддержки неодносимвольных чисел решается заменой кода, который разбивает входную строку на лексемы. В исходном варианте, компилятор использует each_byte, поэтому неодносимвольные числа не работают: Code irb(main):002:0> "2+34".each_byte { |x| puts x.chr } 2 + 3 4 Нужно разбивать строку на лексемы более "умным" способом, например таким: Code irb(main):004:0> "2+34".scan(/[0-9]+|./).each { |x| puts x } 2 + 34 => ["2", "+", "34"] Для изменения основания с/с следует использовать необязательный аргумент методов to_i и to_s: Code irb(main):005:0> "100101".to_i(2) => 37 irb(main):006:0> 37.to_s(2) => "100101"
-- kmeaw aka bdd1
|
|
| |
ldo2 | Дата: Четверг, 22.11.2007, 08:46 | Сообщение # 13 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Все версии деревьев вывода с тестами Деревья
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
Xaron1 | Дата: Пятница, 23.11.2007, 09:09 | Сообщение # 14 |
Группа: Удаленные
| Сначала хотел создать отдельно тему по второму проекту, но потом все же решил написать сюда. Сообщение не про проект, но имеет к нему непосредственное отношение. Наверно, далеко не у всех хорошо обстоят дела с наличием необходимых библиотек tk для работы с графикой на ruby. Если раньше для этого советовалось переставлять ruby, сначала старую версию, потом более новую, то, я думаю, перед столь радикальными мерами можно попробовать более простую вещь, которая была проверяна на ruby времен МЦКТ и, наоборот, на свежепоставленном ruby. Здесь можно скачать архив (любезно предоставленный Антоном Хомяковым), который надо распоковать, по умолчанию, в C:/Ruby. После чего можно проверить работоспособность графических программ. Удачи
|
|
| |
Twilight_Summoner | Дата: Суббота, 24.11.2007, 16:21 | Сообщение # 15 |
 Рядовой
Группа: Заблокированные
Сообщений: 37
Статус: Offline
| Специально для Викули, Мортерейнара и СНЕГУРОЧКИ выкладываю код Compf после модификации. Код разрабатывался совместно с Chuvaver'ом. Code require 'Stack'
# лМБУУ Compf ЧЩЧЕДЕО ЙЪ ЛМБУУБ Stack Й ЙНЕЕФ НЕФПДЩ # ЧУЕИ ФТЈИ ФЙРПЧ ДПУФХРБ: public, protected Й private. # # лПНРЙМСФПТ ДПРХУЛБЕФ ФПМШЛП ПДОПВХЛЧЕООЩЕ ЙНЕОБ РЕТЕНЕООЩИ! # class Compf < Stack # рПУМЕДПЧБФЕМШОЩК ЧЩЪПЧ ДМС ЧУЕИ УЙНЧПМПЧ УФТПЛЙ str # НЕФПДБ processSymbol. def compile(str) @ans = "" str=str.split("**").map{|i| str[i]+="^"} str=str.join.chop "(#{str})".each_byte { |c| processSymbol(c.chr) } return @ans end
private
def symType(c) case c when '(' SYM_LEFT when ')' SYM_RIGHT when '+', '-', '*', '/', '^' SYM_OPER else symOther(c) end end
def processSymbol(c) case symType(c) when SYM_LEFT push(c) when SYM_RIGHT processSuspendedSymbol(c) pop when SYM_OPER processSuspendedSymbol(c) push(c) when SYM_OTHER nextOther(c) end end
def processSuspendedSymbol(c) while precedes(top, c) nextOper(pop) end end
def priority(c) (c == '+' || c == '-') ? 1 : 2 end def precedes(a, b) return false if symType(a) == SYM_LEFT return true if symType(b) == SYM_RIGHT priority(a) >= priority(b) end # лЧБМЙЖЙЛБФПТ ДПУФХРБ protected Й НЕФПД nextOther # ОХЦОЩ ДМС УПЪДБОЙС ОБ ВБЪЕ ЛМБУУБ Compf ОПЧПЗП ЛМБУУБ # Calc, ТЕБМЙЪХАЭЕЗП ЛБМШЛХМСФПТ ЖПТНХМ (ИПФС Ч СЪЩЛЕ # Ruby Ч ДБООПН УМХЮБЕ НПЦОП ХВТБФШ "protected", ФЕН # УБНЩН ТБЪНЕЭБС ЧУЕ ОЙЦЕПРЙУЩЧБЕНЩЕ ЛПОУФБОФЩ Й НЕФПДЩ # Ч ЪПОЕ ДЕКУФЧЙС ЛЧБМЙЖЙЛБФПТБ private, Ч СЪЩЛБИ Java # Й C++ ЪДЕУШ ОХЦЕО ЙНЕООП ЛЧБМЙЖЙЛБФПТ protected). protected
SYM_LEFT = 0; SYM_RIGHT = 1; SYM_OPER = 2; SYM_OTHER = 3 def symOther(c) # уТБЧОЕОЙЕ УЙНЧПМБ У ПВТБЪГПН (ТЕЗХМСТОЩН ЧЩТБЦЕОЙЕН). raise "Illegal symbol #{c}" if c !~ /[a-z]/ SYM_OTHER end def nextOper(c) # print "#{c} " if c == '^' @ans += "** " else @ans += "#{c} " end end def nextOther(c) nextOper(c) end end
Разгильдяй, пофигист по жизни, весельчак)
|
|
| |
ldo2 | Дата: Суббота, 24.11.2007, 23:30 | Сообщение # 16 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| За правильность не отвечаю 3-14bДобавлено (24.11.2007, 23:30) --------------------------------------------- 3-12f
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
Xaron1 | Дата: Воскресенье, 25.11.2007, 00:52 | Сообщение # 17 |
Группа: Удаленные
| Не, у меня стековый, если ты про компелятор, и итеративные, если ты про методы... 3.9g вроде
|
|
| |
Paravinci | Дата: Понедельник, 03.12.2007, 14:41 | Сообщение # 18 |
Группа: Удаленные
| Викуля, вот текст Compf.rb для первого проекта, вариант 3.10D, если ещё нужен: Code ## Compf.rb require 'Stack'
# Класс Compf выведен из класса Stack и имеет методы # всех трёх типов доступа: public, protected и private. # # Компилятор допускает только однобуквенные имена переменных! class Compf < Stack # Последовательный вызов для всех символов строки str # метода processSymbol. def compile(str) @ans = Array.new @last_op = nil @index_op1 = 0 @index_op2 = 0
"(#{str})".each_byte { |c| processSymbol(c.chr) } sort_ans(@index_op1, @index_op2)
return @ans.join(" ") end
private
def symType(c) case c when '(' SYM_LEFT when ')' SYM_RIGHT when '+', '-', '*', '/' SYM_OPER else symOther(c) end end
def processSymbol(c) case symType(c) when SYM_LEFT push(c) when SYM_RIGHT processSuspendedSymbol(c) pop when SYM_OPER processSuspendedSymbol(c) push(c) when SYM_OTHER nextOther(c) end end
def processSuspendedSymbol(c) while precedes(top, c) nextOper(pop) end end
def priority(c) (c == '+' or c == '-') ? 1 : 2 end def precedes(a, b) return false if symType(a) == SYM_LEFT return true if symType(b) == SYM_RIGHT priority(a) >= priority(b) end # Квалификатор доступа protected и метод nextOther # нужны для создания на базе класса Compf нового класса # Calc, реализующего калькулятор формул (хотя в языке # Ruby в данном случае можно убрать "protected", тем # самым размещая все нижеописываемые константы и методы # в зоне действия квалификатора private, в языках Java # и C++ здесь нужен именно квалификатор protected). protected
SYM_LEFT = 0; SYM_RIGHT = 1; SYM_OPER = 2; SYM_OTHER = 3 def symOther(c) # Сравнение символа с образцом (регулярным выражением). raise "Недопустимый символ #{c}" if c !~ /[a-z]/ SYM_OTHER end def nextOper(c) if symType(c) == SYM_OPER # c == '+' || c == '*' if @last_op.nil? @index_op1 = (c == '+' || c == '*') ? @ans.length - 2 : @ans.length - 1
elsif @last_op == c if symType(@ans[-1]) == SYM_OTHER && symType(@ans[-2]) == SYM_OTHER sort_ans(@index_op1, @index_op2) @index_op1 = (c == '+' || c == '*') ? @ans.length - 2 : @ans.length - 1 end
else sort_ans(@index_op1, @index_op2)
if symType(@ans[-1]) == SYM_OTHER && symType(@ans[-2]) == SYM_OTHER @index_op1 = (c == '+' || c == '*') ? @ans.length - 2 : @ans.length - 1 else @index_op1 = @ans.length - 1 end end
@last_op = c @index_op2 = @ans.length end
@ans << c end def nextOther(c) nextOper(c) end
def sort_ans(f, t) for i in (f+1)...t for j in f...i if symType(@ans[i]) == SYM_OTHER && symType(@ans[j]) == SYM_OTHER && @ans[i] < @ans[j] @ans[i], @ans[j] = @ans[j], @ans[i] end end end end
end
|
|
| |
|