Ruby/Практикум/Строки: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
/* Дана строка в которой записаны слова через пробел. Необходимо перемешать в каждом слове все символы в случайном порядке кроме первого и…
обновление данных
Строка 627: Строка 627:


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

===Найти в тексте даты формата «день.месяц.год».
Найдите дату, где день ограничен числом 31, а месяц 12. Год ограничивайте четырёхзначными числами.===
'''Возможное решение:'''
<source lang=ruby>
puts <<END
8. Найти в тексте даты формата «день.месяц.год».
Найдите дату, где день ограничен числом 31, а месяц 12. Год ограничивайте четырёхзначными числами.
Распознавайте месяц в виде «31.марта.2001».
END

str="Five miles out 03.06.1983 Just hold your heading 14.11.1012 true Got to get your finest out"

p str.scan(/([0-2]\d|3[0-1]\d).(0[1-9]|1[0-2]).(\d{4})/).map{|e| e.join('.')}.join(" ")
</source>



[[Категория:Ruby|Практикум/Строки]]
[[Категория:Ruby|Практикум/Строки]]

Версия от 02:11, 11 ноября 2012

Строки

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

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

s = "123 123 3254 2345 13"
p( s.split(" ").map{ |m| m.to_i }.max )

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


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

a = "5 6 42 31 93 4"
m = a.split(" ")
p( m.map{ |i| i.to_i }.max )

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


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

cTpoka = "134 2134 1234 1234 123422 2342"
a = cTpoka.split(" ")
p( a.map{ |i| i.to_i }.max )

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


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

s="1 2 8 4"
p s.split(/ /).max

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

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

s="1 12 41 8"
p s.split.map(&:to_i).max

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


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

s = "123 123 3254 2345 13"
s.split.max

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

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

s = "123 123 3254 2345 13"
p s.split.map{|i| i.to_i}.max

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

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

str = "ывfgфеф"
p( str.split("").select{ |n| ( n>="а" || n>="А" )&&( n<= "я" || n<="Я" ) }.size )

Замечания по решению: Нижеследующее проще.

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

str = "ывfgфеф"
p str.scan(/[А-я]/).size

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

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

str = "ывЛgфmю"
p str.count "А-я"

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

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

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

str = "lol"
a = str.split("")
b = a.select{ |i| ("a".."z").include?(i) }
p( b == b.sort )

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


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

cTpoka = "acBdeFg"
bb = ("A".."Z").to_a
sbb = cTpoka.split("") - bb
p( sbb == sbb.sort )

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

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

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

Замечания по решению:Решение правильно частично. Правильное решение

str = "acBdeFg"
a=str.scan(/\w/)
p a==a.sort

Замечания по решению: Нифига подобного. Решение правильное. "\w" кроме строчных латинских букв еще включает прописные, а они отбрасываются по условию.

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

a = "dfbxvsferwr"
a.split(//) == a.split(//).sort

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

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

st = 'abCDefDHijklmo Mp' 
res = true
st.scan(/[a-z]/).each_index{|i| i == 0 ? next : (res = false and exit if st[i] < st[i-1])}
res

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

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

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

str="Point Line Triangle Square Pentagon"
puts str.split(" ").sort_by{ rand }.join(" ")

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

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

str="Point Line Triangle Square Pentagon"
puts str.split.shuffle.join(' ')

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

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

str="Point Line Triangle Square Pentagon"
puts str.split.shuffle*' '

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

Дана строка. Необходимо проверить, является ли она палиндромом.

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

cTpoka = "бред"
p( cTpoka.reverse.eql?( cTpoka ) )

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



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

a = "geg"
p( a.reverse == a )

Замечания по решению: я не сторонник == по мне лучше a.eql? a.reverse или a.reverse.eql? a Возможное решение:

str="Are we not drawn onward, we few, drawn onward to new era?"
str2 =  str.downcase.scan(/\w+/).join
p str2.reverse == str2

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

Работает только для латиницы.



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

str="а роза упала на лапу азора"
p str.delete(" ").reverse == str.delete(" ")

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

Работает для палиндромов, не содержащих символы в разных регистрах и знаки препинания.

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

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

a = "privet poka"
p a.split("").sort_by{rand}.to_s

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


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

s = "134saddfs a123"
puts s.split("").sort_by{rand}.join

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


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

cTpoka="всякий бред"
maccuB=cTpoka.split("")
maccuB=maccuB.sort_by{rand}
puts maccuB.to_s

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

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

p "Realistic schedules are the key to creating good software".split(//).shuffle.join

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

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

a = "start checking"
v = a.split(" ")
n = v.map{ |t| c = t[1..-2].split('').sort_by{ rand }.to_s; t[0..0] + c + t[-1..-1] }
p n.join(" ")

Замечания по решению: Если слово состоит из одной буквы (например, артикль 'a'), то на выходе получится 'aa' из-за такого присвоения: t[0..0] + c + t[-1..-1]. Здесь будет c = , а t[0..0] и t[-1..-1] дадут одинаковые результаты.

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

p "Realistic schedules are the key to creating good software".scan(/\w+/).collect{|w| [w[0..0], w.length > 2 ? w[1..-2].split(//).shuffle.join : nil, w.length >= 2 ? w[-1..-1]: nil].join}.join(" ")

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

inpt= "Another solution"
outp= inpt.scan(/\w+/).map{|w| if w.length<4; w else w[0,1]+ w[1..-2].split('').shuffle.join<< w[-1] end}.join(' ')
p outp

Замечания по решению: странно почему во втором решении первые две буквы не перемешиваются?
Кроме того код работает только с англ текстом. И кто вас учил всё в одну строку лепить?

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

string = 'Дана строка в которой записаны слова через пробел. Необходимо перемешать в каждом слове все символы в случайном порядке кроме первого и последнего.'
p string.split.map{|word|
   if word.size > 2
      word[0] + word[1...-1].split('').shuffle.join + word[-1]
   else word
   end
}*' '

Замечания по решению: тут также, как и в предыдущих решениях, не реализована работа со знаками пунктуации. Можно было бы сделать проверку последнего символа в слове, но мне кажется должно быть более элегантное решение. Жду вариантов.

BlindMan (обсуждение) 09:03, 30 сентября 2012 (UTC)

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

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

a = "123f"
b = a.reverse
p a == b

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


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

str = "PAS11asdsadsaHSAP"
a = str.split("").select{ |elem| (elem>="A")&&(elem<="Z") }.join
p( a == a.reverse )

Замечания по решению: Решение слишком громоздкое. Нет нужды преобразовывать строку в массив, а потом назад.


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

str = "PAS11asdsadsaHSAP"
a = str.scan(/[A-Z]/)
p a == a.reverse

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


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

str = "ABCDsdipmDCBA"
p str.gsub(/[a-zа-я]/,"") == str.gsub(/[a-zа-я]/,"").reverse

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

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

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

str = "bla blah blah"
p str.split.count{|i| i.size.even?}

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


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

str = "bla blah blah"
a = str.split
p a.select{ |n| n.size%2 == 0 }.size

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


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

stroka = "abc cbur cbo64"
a = stroka.split(" ").select{ |i| i.size % 2 == 0}
p( a.size )

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


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

m = "a aa aa a aa".split(" ")
p( m.select{ |i| i.size % 2 == 0 }.size )

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


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

string = "oguH gBa Tpu"
a = string.split(' ')
c = a.find_all{ |elem| elem.size%2 == 0 }
d = c.size
p d

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

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

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

a = "Abbabb123"
b = ('A'..'Z').to_a + ('0'..'9').to_a + "!@\"$%^&*()_+-=`~{}[](),.;:|\//".split("")
p( ( a.split("") - b ).join("") == (a.split("") - b ).join("").reverse )

Замечания по решению: Просто жуть какая-то.

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

str = "Abbabb123"
a = str.scan /[a-z]/
p a == a.reverse

Дана строка. Необходимо подсчитать количество букв "А" в этой строке.

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

cTpoka = "тестовая строка"
p( cTpoka.split("").select{ |i| i=="А" || i=="а" }.size )

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

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

str = "Abbabb123"
p str.scan(/[Aa]/).size

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

str = "Abbabb123"
p str.count 'Aa'

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

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

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

m = "pa3 gBa Tpu"
p m.split(" ").size

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

народ, зачем эти лишние скобки кавычки и пробел

split(" "), split по умолчанию разбивает по пробелу


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

cTpoka = "поезд ехал быстро"
p cTpoka.split.size

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

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

's sdk dkd'.count(' ').succ
's sdk dkd'.scan(' ').size + 1
ну и там можно долго продолжать

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

Дана строка в которой содержатся цифры и буквы. Необходимо расположить все цифры в начале строки, а буквы -- в конце.

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

s = "абв1где25жзи"
mac = s.split("")
a,b = mac.partition{ |e| ("0".."9").include?(e) }
s_1 = a+b
puts( s_1.to_s )

Замечания по решению: зачем сначала разбивать массив в 2 переменные, а потом их клеить?

.to_s, как можно было заметить, не собирает массив в одну строку, кроме того puts уже содержит в себе .to_s


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

cTpoka = "12а3буква"
puts cTpoka.split('').partition{ |elem| (elem >= "0")&&(elem <= "9") }.flatten.join("")

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

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

s = "абв1где25жзи"
print s.split('').sort.join

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


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

str="fghfg567fhf35fghf!*6111фыва8"
print str.split("").partition{|e| e=~/\d/}.flatten.join

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

Дана строка в которой записаны слова через пробел. Необходимо перемешать все слова в случайном порядке (спонсор задачи Мастер Йода).

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

m = "pa3 gBa Tpu"
m.split(" ").sort_by{ rand }.join(" ")

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



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

cTpoka = "МИР ТРУД МАЙ"
puts cTpoka.split.sort_by{ rand }.join(" ")

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



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

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

s="aa daaaa qaaa"
p s.split(/ /).sort_by{|i| i.size}.join(" ")

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


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

m = "i got co"
p m.split.sort_by(&:size).join(' ')

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


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

str = "slo va"
a = str.split(" ").sort_by{ |i| i.size }
p( a.to_s )

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


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

m = "Tpu gBa pa3"
m.split(" ").sort_by{ |str| str.size }

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

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

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

a = 123415
b = a.to_s( 10 ).split("")
c = b.uniq
p c.size

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



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

a = 1234
p a.to_s(10).split('').uniq.size

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



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

x = 12344721
p( x.to_s.split('').uniq.size )

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



Дан массив в котором находятся строки "белый", "синий" и "красный" в случайном порядке. Необходимо упорядочить массив так, чтобы получился российский флаг.

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

s = ["синий","белый","красный"]
puts s.sort.sort_by{ |i| i.size }

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



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

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

a = "i/input/jnd/file.ext"
puts( a.split("/")[-1].split('.')[0] )

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

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

a = "i/input/jnd/file.ext"
puts a.split(/\W/)[-2]

Замечания по решению: Ошибка, если в имени файла присутствует точка.

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

str='C:\\Program.Files\\Admin 1\\file.name.txt'
a=str.scan(/(.+)\./)[0].join
b=str.scan(/.+\\/).join
p a.sub(b,"")

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

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

s = 'c:\\some path\\this is a file.name.ext'
s.match(/.*\\(.*)\./)
puts $1

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

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

str = 'C:\\Program.Files\\Admin 1\\file.name.txt'
p str.split('\\').last.sub(/\.\w+$/,'')

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

===Найти в тексте даты формата «день.месяц.год». Найдите дату, где день ограничен числом 31, а месяц 12. Год ограничивайте четырёхзначными числами.=== Возможное решение:

puts <<END
8. Найти в тексте даты формата «день.месяц.год».
Найдите дату, где день ограничен числом 31, а месяц 12. Год ограничивайте четырёхзначными числами.
Распознавайте месяц в виде «31.марта.2001».
END

str="Five miles out 03.06.1983 Just hold your heading 14.11.1012 true Got to get your finest out"

p str.scan(/([0-2]\d|3[0-1]\d).(0[1-9]|1[0-2]).(\d{4})/).map{|e| e.join('.')}.join(" ")