Репозиторий с задачами на Ruby

    Недавно начал изучать Ruby. Несмотря на большое количество туториалов и мануалов, отсутствие официальной документации несколько замедляет процесс обучения.(Официальная документация все-таки существует — спасибо Kane). Но тем не менее, идея от этого не теряет ценности.

    Чтобы получше освоить синтаксис языка, многие советуют решать задачи из спортивного программирования. Это позволяет набить руку в максимально кратчайший срок.
    Нашелся отличный сайт с ejudge — acm.mipt.ru с интерпретатором Ruby. Но при решении задач(особенно на незнакомом языке), постоянно присутствует ощущение, что может быть это можно было сделать как-то иначе — легче, быстрее, удобнее.


    Я предлагаю следующее — объединиться и собирать решения в одном месте. Это позволит начинающим приобрести полезные навыки, а более опытным рубистам попрактиковаться и поделиться опытом.

    На github.com я создал репозиторий, где будут храниться решения задач. С git-ом я тоже столкнулся впервые, поэтому все замечания, критика, предложения о том, как это может сделать лучше, очень приветствуются.

    Как я себе это представляю. Человек находит задачу, и пытается ее решить. Если он ее решает и находит свое решение интересным, он заливает его на github. Если он не может решить, то пытается снова. Затем еще и еще. Когда он совсем отчаивается, то он идет на репозиторий в поисках уже существующего решения. Затем на него опускается прозрение и он переходит на новый уровень.

    На мой взгляд, это будет удобным и полезным для всех. Главное, чтобы нашлись желающие этим заняться.

    UPD: репозиторий изменен на групповой. Каждый может стать участником группы — достаточно оставить email.
    UPD2: была создана Организация Хабраруби. Если вы хотите сразу коммитить решения без пулл-реквестов, то оставьте свой email, и вы будете добавлены. Чем больше будет людей, тем лучше.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 29

      0
      А в каком виде заливать свое решение? Создавать новый файл со своим ником, править существующий? И как вы намерены обрабатывать конфликтующие pull-request'ы?
        0
        нет, создавать новый файл со своим решением. а по поводу второго вопроса — насколько я понял, там есть такая штука, как Organizations — где можно настраивать права.
          0
          И тогда может получиться свалка… Я вот например хотел бы поправить ваше решение, так как в нем есть явные «оплошности».
            0
            свалка вряд ли получится, потому что недостаточно людей.
            а что вы предлагаете? как это можно лучше организовать? я просто до этого не сталкивался с гитом, поэтому не очень осведомлен
              0
              :) Мне на самом деле и было интересно, как же вы хотите все это организовать. Git тут по-моему не причем кстати.
              p.s. ваш стиль кодирования на Ruby далек от идеала… Постараюсь пофиксать, ждите pull-request'ы.
                0
                в принципе, если решения нет, то можно просто добавлять новое, если есть, то либо править, если видны ошибки, либо создавать рядом новый файл
        0
        Можете еще посмотреть на github.com/nashby/ruby_kick_prologs_ass
        Там частично решены вот эти задачи — sites.google.com/site/prologsite/prolog-problems
        Думаю, они поинтересней будут.
          0
          В третьей задаче вместо проверки больше размер массива нуля использовать .empty?.
            +1
            … отсутствие официальной документации несколько замедляет процесс обучения.

            Не могу понять о чём вы говорите. Официальная документация есть www.ruby-doc.org/
            А ешё есть книга, вышедшая недавно на русском языке Язык программирования Ruby/.
            И ещё есть вот прекрасная книга на английском языке: Metaprogramming Ruby: Program Like the Ruby Pros.
            Ну и раз уж речь идёт о лучших решениях, то стоит упомянуть и это издание: Ruby Best Practices.
              0
              отличные ссылки, спасибо
                0
                А ещё есть давно вышедшая на русском языке «The Ruby Way», которая в переводе называется почему-то «Программирование на языке Ruby» (Хэл Фултон).
                0
                #001 можно короче: p $<.read.split.map{|x| x.to_i}.max
                  0
                  Из условия задачи: «Количество чисел меньше 10000». Я конечно понимаю, что на современных мощностях преобразовать строку, размером порядка 25 кб, в массив — это фигня. Но в рамках спортивного программирования так не делается. Уж слишком бросается в глаза неоптимальность использования массива для решения данной задачи.

                  А если уж гнаться за минимальностью кода, то можно ж ещё на 7 символов сократить:
                  p gets.split.map(&:to_i).max
                    0
                    Оба решения по времени проходят более чем нормально. Не думал, что proc2lambda будут работать в 1.8
                  0
                  задача 000 красивее:
                  puts gets.split.inject { |memo, num| num.to_i + memo.to_i }
                    0
                    Тогда уж хотя бы так:

                    puts gets.split.inject(0) { |memo, num| num.to_i + memo }

                    Ну это в рамках исправления неправильного использования inject…
                    А вообще все подобные решения неправильны, где запросы типа «Введите первое число: », «Введите второе число: »? Валидация входных данных напрочь отсутствует. А решения с inject вообще решают какую-то другую задачу, ведь они легко могут просуммировать и больше, чем 2 числа.
                      0
                      Integer#to_i возвращает самого себя. inject без параметра по дефолту берёт в качестве первого результата первое число, а первого аргумента — второе число. не могу понять, почему вы говорите, что inject использован неверно.
                        –1
                        Причём тут Integer#to_i? Ваш вариант эквивалентен вызову:
                        puts gets.split.inject("") { |memo, num| num.to_i + memo.to_i }

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

                        Если сомневаетесь, что аккумулятор в вашем примере строка, можете попробовать:
                        puts gets.split.inject { |memo, num| num.to_i + memo }
                          –1
                          аккумулятор в моём примере строка только на первой итерации. inject без параметра берёт на первой итерации в кач-ве аккумулятора 1ый член, в качестве итератора второй, на остальных строкой будет только итератор. кое-кому надо перечитать справочник ;)
                            0
                            на всякий случай, чтобы вы больше не спорили:
                            ruby-1.9.2-p180 :006 > puts gets.split.inject { |memo, num| puts memo.inspect; puts num.inspect; num.to_i + memo.to_i }
                            123 234
                            "123"
                            "234"
                            357
                            => nil
                            ruby-1.9.2-p180 :007 > puts gets.split.inject { |memo, num| puts memo.inspect; puts num.inspect; num.to_i + memo.to_i }
                            123 234 345 456
                            "123"
                            "234"
                            357
                            "345"
                            702
                            "456"
                            1158
                            => nil
                              –1
                              > аккумулятор в моём примере строка только на первой итерации.

                              Ну и в чём сакральный смысл этой путаницы? Понтануться как круто Вы знаете справочник по Ruby? Даже если я его перечитаю, я всё равно буду утверждать, что это пример крайне плохого, нечитабельного кода с лишними приведениями типов, т.к. даже Integer#to_i вызывать глупо. Так программировать не надо, а учить других так программировать вообще злодеяние.
                                0
                                ололо.

                                считаете, что решение с лишним аргументом и лишней итерацией лучше — ваши проблемы. только сами первые по поводу простоты и «неверного учения новичков» не начинайте.
                                  0
                                  Если Вы забыли, повторюсь, что решение с использованием inject для данной задачи является абсолютно неверным.
                                  В корректном решении обязательно должна быть проверка на кол-во (не более двух) и тип (только целые числа) полученных от пользователя значений.
                                    0
                                    в таких задачах практически всегда суть заключается в том, чтобы удовлетворить функциональные требования. если при этом решение может складывать и другие количества чисел, и не падает от неверного вода, то на это не смотрят. потому что в реальном мире такое поведение пошло бы только на пользу.
                                    в доказательство формулировка задачи:
                                    > Требуется найти сумму целых чисел A и B.
                                    > Оба числа не превосходят 1 000 000 000 по модулю.
                                    здесь не сказано, что программа должна умирать, если чисел не два, или если они превосходят 1000000000, или если они не целые.
                      0
                      я там гольфил :) в нескольких задачах я в топе коротких решений :)
                        0
                        Только я на перле, а на руби со мной боролся Nakilon :)
                        0
                        «Нашелся отличный сайт с ejudge — acm.mipt.ru с интерпретатором Ruby. Но при решении задач(особенно на незнакомом языке), постоянно присутствует ощущение, что может быть это можно было сделать как-то иначе — легче, быстрее, удобнее.»
                        Можно еще сюда посмотреть rubyquiz.com/ и не париться с репозиторием и прочим. Есть задание, решаете, при этом в каждом задании слева есть список вариантов решения, также можно прислать свое.
                          0
                          На codeforces.ru (типа русского TopCoder'а) можно решать задачки на Ruby, что очень порадовало ) И вообще там куча разных языков (в т.ч. С++, Delphi, Pascal, Java, PHP, Python, C#, C, Haskell)
                            +1
                            А я смотрю кто-то все же не забросил до конца спортивное программирование, и это очень радует.
                            Идея очень хорошая, а с документацией могут быть проблемы только из-за того что Ruby долгое время была исконно японским «продуктом», хотя сейчас ситуация изменилась и можно легко найти доки на английском языке.

                            Only users with full accounts can post comments. Log in, please.