Ruby/Идеология: различия между версиями

Содержимое удалено Содержимое добавлено
Метка: possible spambot (testing)
Метка: possible spambot (testing)
Строка 466:
 
Сейчас пока некогда рассказывать как это получилось, но чуть позже опишу свои действия по шагам. [[Участник:Rubynovich|Rubynovich]]
 
Еще один вариант решения:
 
<source lang=ruby>#!/usr/bin/ruby
# Программа для написания чисел на русском языке из цифрового представления
# Версия 0.3
#
# История изменений
# 0.3
# * Проведен глубокий рефакторинг кода. Немного изменена концепция программы. Основной процесс записи названия чисел в массив (result) выполнен с помощью внутреннего итератора (each_with_index) и занимает всего одну строчку. Процесс добавления названия чисел от 1 до 999 в массив также выполнен другим образом.
# 0.2
# * Проведен глубокий рефакторинг кода. Теперь решение в "одну строчку"
# 0.1.1
# * Убраны лишние пробелы в числах с 00000
#
# Email, JabberID: ru.ruslan@gmail.com
# Email, JabberID: rubynovich@gmail.com
# Email, JabberID: dimak33@yandex.com
#
# Названия больших чисел взяты из статьи http://archive.is/20121225033145/mirozdanie.narod.ru/Knowleg.html и могут отличаться от иных источников
#
# Пример использования:
# $ruby bignums.rb 54308428790203478762340052723346983453487023489987231275412390872348475
# => пятьдесят четыре дуовигинтиллиона ......... тысяч четыреста семьдесят пять
 
nums = %w{один два три четыре пять шесть семь восемь девять}
nums_for_10_19 = %w{десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать}
nums_for_20_90 = %w{двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто}
nums_for_100_900 = %w{сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот}
 
nums+=nums_for_10_19
 
[nums_for_20_90,nums_for_100_900].each_with_index do |n,index|
n.each do |x|
nums<<x
(90*index+9).times {|i| nums<<x+' '+nums[i]}
end
end
 
nums.push('')
 
ok = { 1 => ["", "а", "и", "и", "и", "", "", "", "", ""] }
ok.default = ["ов", "", "а", "а", "а", "ов", "ов", "ов", "ов", "ов"]
 
threes_names = %w{тысяч миллион миллиард триллион квадриллион квинтиллион секстиллион септиллион
октиллион нониллион дециллион андециллион дуодециллион тредециллион кваттордециллион квиндециллион сексдециллион септемдециллион
октодециллион новемдециллион вигинтиллион анвигинтиллион дуовигинтиллион тревигинтиллион кватторвигинтиллион квинвигинтиллион
сексвигинтиллион септемвигинтиллион октовигинтиллион новемвигинтиллион тригинтиллион антригинтиллион}.unshift('')
 
threes = ARGV[0].gsub(/(\d)(?=(\d{3})+$)/, '\1 ').split.reverse rescue raise("Usage: ./#{$0} NUMBER")
 
result=[]
threes.each_with_index {|x,i| x.to_i>0 ? result<<[nums[x.to_i-1],threes_names[i]+ok[i][(11...20).include?(x.to_i%100) ? 0 : x.to_i%10]] : result<<[nums[x.to_i-1]]}
 
p result.reverse.join(' ').sub(/одна тысяча/, 'одна тысяча').sub(/два тысячи/, 'две тысячи').gsub(/\s+/,' ').chop</source>
 
== См. также ==