Ruby/Практикум/Правила

Материал из Викиучебника — открытых книг для открытого мира

Правила[править]

Дана строка. Необходимо найти все даты, которые описаны в виде "31 февраля 2007".[править]

Возможное решение:

str = "Сегодня 3 декабря 2007... или 2 декабря 2007... хз, короче"
p str.scan(/([1-9]|[12][\d]|[3][01]) (декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября) ([1-9]{1}\d{3})/)

Замечания по решению:

   1) Не распознаёт даты вида "29 июня 987 года город Коимбра взята войсками аль-Мансура"

Исправляем:

str = "Сегодня 3 декабря 2007... или 29 июня 987 года... хз, короче"
p str.scan(/([1-9]|[12][\d]|[3][01]) (декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября) ([1-9]{1}\d*)/)
   2) Возвращаем массив массивов строк, а не просто массив строк (это может даже хорошо, так проще будет обрабатывать число/месяц/год)

Есть 2 варианта исправления: либо для всех подмассивов сделать .join(" "), либо указать во всех группировках (?:...) - группировка без сохранения результата:

str = "Сегодня 3 декабря 2007... или 29 июня 987 года... хз, короче"
p str.scan(/(?:[1-9]|[12][\d]|[3][01]) (?:декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября) (?:[1-9]{1}\d*)/)
   3) Лишний пробел между частями даты - и всё ломается. Решение: вместо " " писать \s+:
str = "Сегодня 3 декабря 2007... или 29  июня    987 года... хз, короче"
p str.scan(/(?:[1-9]|[12][\d]|[3][01])\s+(?:декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября)\s+(?:[1-9]{1}\d*)/)
   4) По моему так будет проще. Коментарии в коде.
puts str.scan(/
    \s+        # Пробелы перед числом
    (          # Начало групы возврата
    \d\d?      # Число одна или две цифры. Зачем проверять на неграмотность? 
               # Тогда нужно проверять и на соответствие дней в месяце. 
               # Например 30 Февраля или 31 Апреля.
    \s+        # Пробелы перед месяцем
    (?:декабря|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября)
    \s+        # Пробелы перед годом
    \d{1,4}    # Любые цифры от одной до четырёх если кто захочет 
               # в древнейшей истории покапаться. Ну или в будущее заглянуть
    )          # Закрываем группу возврата
               # Здесь проверки на пробел или знак препинания нет. 
               # Зачем проверять опечатку типа 2017год или 2017...
    /ixu)      # Месяц может быть написан как заглавными так и прописными
               # Многострочное регулярное выражение
               # Юникод

Дана строка. Необходимо найти максимальное из имеющихся в ней вещественных чисел.[править]

Возможное решение:

str = "2.2 1.34 1.11 -11.11"
p( str.scan(/\-\d+\.\d+|\d+\.\d+/).map{ |n| n.to_f }.max )

Замечания по решению:



Возможное решение:

a = "1.2zm139.256"
p( a.scan(/[-+]?\d+\.\d+/).map{ |e| e.to_f }.max )

Замечания по решению:


Возможное решение:

str = "1 21 -1 1.5 -10.51 1.21e+33 100e-21 1.020e-6"
p str.scan(/[-+]?\d+((\.\d+)?e[-+]\d+|\.\d+)?/).map{ |elem| elem.to_f }.max

Замечания по решению:

Возможное решение:

str = "1 21 1.5 -10.51 -1 1.21e+33 100e-21 1.020e-6"
p str.scan(/[e+\d\.-]+/).map{|i| i if i.to_s.scan("e").empty?}.compact.max

--82.207.35.230 14:01, 13 ноября 2012 (UTC)Kuznec

Дана строка. Необходимо найти все строчные символы латиницы, которые в ней используются.[править]

Возможное решение:

cTpoka = "Hello! I'am string!"
p( cTpoka.scan(/[a-z]/) )

Замечания по решению:

Возможное решение:

str = "Hello! I'am string!"
p str.scan(/[\w]/).uniq

Дана строка. Необходимо найти общее количество русских символов.[править]

Возможное решение:

cTpoka = "ПРАВИЛО"
p( cTpoka.scan(/[а-яА-Я]/).size )

Замечания по решению:



Возможное решение:

string = "первый нах"
a = string.scan(/[А-Яа-я]+?/)
b = a.size
p( b )

Замечания по решению:

Дана строка. Необходимо подсчитать количество чисел в этой строке, значение которых меньше 5.[править]

Возможное решение:

p( "строка5211397ABCDGD".scan(/[0-4]/).size )

Замечания по решению: Не увидит отрицательные и нецелые числа.

Возможное решение:

puts "1.5 Дана строка. Необходимо подсчитать количество чисел в этой строке, значение которых меньше 5."

str = "1.5 Дана строка. 123 -765 0 656 33 1 4 2.4 5 4.9 0"

 p str.scan(/-?\d+(?:\.\d+)?/).map{|e| e.to_f}.find_all{|e| e<5}.size

Дана строка. Необходимо найти наибольшее количество идущих подряд символов кириллицы.[править]

Возможное решение:

str = "АБВГ джз ИКЛМНО"
p( str.scan(/[а-яА-Я]+/).sort_by{ |str| str.size }.pop.size )

Замечания по решению:


Возможное решение:

$KCODE='u'
s="строка2134567stringстрочечкаfgh"
p s.scan(/[А-я]+/).sort_by{|e| e.size}[-1].size/2

Замечания по решению:

Решение с учетом юникода.

Дана строка. Необходимо подсчитать количество чисел в этой строке, значение которых больше 5.[править]

Возможное решение:

s = "21341234213412342189989678"
p( s.scan(/[6-9]/).size )

Замечания по решению: Не увидит дробных чисел.

Возможное решение:

puts "1.7 Дана строка. Необходимо подсчитать количество цифр в этой строке, значение которых больше 5. "

str = "1.5 Дана строка. -765 0 656 33 5 5.1 5.9 0"

 p str.scan(/-?\d+(?:\.\d+)?/).map{|e| e.to_f}.find_all{|e| e>5}.size

Дана строка. Необходимо найти минимальное из имеющихся в ней натуральных чисел.[править]

Возможное решение:

a = "ab23ca3"
p( ( a.scan(/\d*/) - [""] ).map{ |i| i.to_i }.min )

Замечания по решению:



Возможное решение:

cTpoka = "abc98cg1107"
p cTpoka.scan(/\d+/).map{ |s| s.to_i }.min

Замечания по решению:

Дана строка. Необходимо найти все используемые в ней строчные символы латиницы.[править]

Возможное решение:

str = "test1234"
p( str.scan(/[a-z]/) )

Замечания по решению:



Дана строка. Необходимо найти минимальное из имеющихся в ней рациональных чисел.[править]

Возможное решение:

s = "1/2+4/3-2.5/7.8=0.0"
puts( s.scan(/[-+]?\d+\/(?:\d{2,}|[1-9])/).map{ |i| i.split("/").map{ |j| j.to_i } }.map{ |i| Rational(i[0], i[1]) }.min )

Замечания по решению:

Возможное решение:

s = "1/2+4/3-2.5/7.8=0.0"
puts s.scan(/[-+]?\d+\/\d+|[-+]?\d+\.\d+/).map{|e| e.to_f}.min

Замечания по решению:

Дана строка. Необходимо найти количество задействованных символов латиницы в этой строке (без дубликатов).[править]

Возможное решение:

a = "I'm string"
p( a.scan(/[a-zA-Z]/).uniq.size )

Замечания по решению:


Возможное решение: А теперь уберём верхний регистр:

str="I’m a high school lover, and you’re my favorite flavor Love is all, all my soul You’re my playground love"

p str.scan(/[A-z]/).map{|e| e.downcase}.uniq.size

Дана строка. Необходимо найти все незадействованные символы латиницы в этой строке.[править]

Возможное решение:

a = "AczqhF321L5I"
m = a.scan(/[a-zA-Z]/)
b = ("a".."z").to_a + ("A".."Z").to_a
p( b - m )

Замечания по решению:

Возможное решение:

a = "AczqhF321L5I"
p a.scan(/[A-z]/).size

Замечания по решению:

Дана строка. Необходимо найти те символы кириллицы, которые не задействованы в данной строке.[править]

Возможное решение:

s = "абВГдеЖ"
a = ("а".."я").to_a + ("А".."Я").to_a
puts(( a - s.scan(/[а-яА-Я]/) ).to_s )

Замечания по решению:



Дана строка. Необходимо найти максимальное из имеющихся в ней натуральных чисел.[править]

Возможное решение:

a = "asdas100j459jj3492"
p( a.scan(/\d+/).map{ |i| i.to_i }.max )

Замечания по решению:



Возможное решение:

cTpoka = "213 2314n 234 2134 4kj234"
p( cTpoka.scan(/\d+/).map{ |i| i.to_i }.max )

Замечания по решению:



Возможное решение:

cTpoka = "слово24слово1слово21"
p cTpoka.split(/\D+/).map{ |x| x.to_i }.max

Замечания по решению:



Дана строка. Необходимо найти наибольшее количество идущих подряд цифр.[править]

Возможное решение:

a = "0000000b09786"
p( a.scan(/\d+/).map{ |i| i.size }.max )

Замечания по решению:

Дана строка. Необходимо подсчитать количество цифр в этой строке, значение которых больше 5.[править]

Возможное решение:

cTpoka = "1234567890"
p( cTpoka.scan(/[6-9]/).size )

Замечания по решению:



Возможное решение:

cTpoka = "1234567890"
p( cTpoka.scan(/\d/).select{ |i| i.to_i > 5 }.size )

Замечания по решению:



Дана строка. Необходимо найти минимальное из имеющихся в ней целых чисел.[править]

Возможное решение:

a = "jhfg jhg578df-12"
p( a.scan(/-{0,1}\d+/).map{ |i| i.to_i }.min )

Замечания по решению:



Возможное решение:

str = "5 3 6 -11"
p( str.scan(/\-\d+|\d+/).map{ |elem| elem.to_i }.min )

Замечания по решению:



Возможное решение:

str = "1.2sdaf3.21223sd-12.12"
p( str.scan(/(?:[-+]?\d+\.\d+)/).map{ |i| i.to_f }.min )

Замечания по решению:



Возможное решение:

cTpoka = "бред -1,2,3,-123"
p( cTpoka.scan(/\d+|-\d+/).map{ |i| i.to_i }.min )

Замечания по решению:



Дана строка в которой записан путь к файлу. Необходимо найти имя файла без расширения.[править]

Возможное решение:

m = "d:\\games.exe"
a = m.split(/\\/)
b = a[-1].to_s
d = b.split(/\./)
p d[0]

Замечания по решению:



Возможное решение:

cTpoka = "/home/lbn/practice_05.rb"
a = cTpoka.split(".").shift
puts( a.split("/").pop )

Замечания по решению:

неправильный ответ, если путь содержит `.`


Возможное решение:

s = "/home/.lbn/practice_05.rb"
p s[(s.rindex('/') || -1)+1..-1].split('.')[0]

Замечания по решению:


Возможное решение:

s = "/home/.lbn/practice_05.rb"
# s = "/home/.lbn/.5practice"
s=~%r{^/?(?:[^/]+/)*(?:([^/]+)\.[^./]+|\.([^./]+))$}
p $1 || $2

Замечания по решению:


Возможное решение:

s = "/home/.lbn/practice_05.rb"
s.split('/')[-1]=~%r{^(?:([^/]+)\.[^./]+|\.([^./]+))$}
p $1 || $2

Замечания по решению:

Возможное решение:

str = '\\server\c$\xerfpp\hdffrocs\microsoft\test.bat'
p str.reverse[(/[.]/=~str.reverse)+1..(/[\\]/=~str.reverse)-1].reverse

Дана строка. Необходимо найти наибольшее количество идущих подряд цифр.[править]

Возможное решение:

stroka="1234ab1 12345bc de"
p( stroka.scan(/\d{0,}/).sort_by{ |i| i.size }[-1].size )

Замечания по решению:



Возможное решение:

cTpoka = "12ab34 abc 123"
a = cTpoka.scan(/\d{1,}/)
b = a.sort_by{ |i| i.size }
c = b[-1]
d = c.size
p d

Замечания по решению:



Возможное решение:

cTpoka = "213 234поп2134"
p( cTpoka.scan(/\d+/).sort_by{ |str| str.size }.pop.size )

Замечания по решению:



Возможное решение:

cTpoka = "123-123123*12312312+12312-312312=31"
p( cTpoka.scan(/\d+/).map{ |i| i.size }.max )

Замечания по решению:



Возможное решение:

a = "12a8976b"
p a.split(/\D+/).map{ |x| x.size }.max

Замечания по решению: