11 и 61 ГОУ МГИУ Понедельник, 21.07.2025, 11:37
Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Проекты [программирование]
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
Программа работает правильно biggrin
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. После чего можно проверить работоспособность графических программ. Удачи happy
 
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
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2025