1. Java / Говнокод #8033

    +78

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    for (int count = 1; allWord == ""; count++) {
    	    if (num.length() == 4) { 
    		allWord += arrayToTen[Integer.parseInt(num.substring(0,1))-1] + "Thousand"; /
    		if (Integer.parseInt(num.substring(1,2)) > 0) {
    		    allWord += arrayToTen[Integer.parseInt(num.substring(1,2))-1] + "Hundred";
    		}
    		if (Integer.parseInt(num.substring(2,3)) == 0) { 
    		    allWord += "And"; // добавдяем просто "And"
    		}
    	    }
           }

    часть реализации задачи:
    http://projecteuler.net/problem=17

    Запостил: s3t0fu, 29 Сентября 2011

    Комментарии (39) RSS

    • добавдяем
      Ответить
    • Если я правильно понял условия задачи, то решается так:
      String someString = "one hundred and fifteen";
      Pattern p = Pattern.compile("\\w");
      Matcher m = p.matcher(someString);
      int count = 0;
      while(m.find()) {
          count++;
      }
      Ответить
      • Посчитать буквы - это херня (тут без regexp'ов будет проще и быстрее), идея в том, чтобы сгенерить буквенное представление чисел с 1 до 1000
        Ответить
        • Тогда да... проблематично. Тут есть решение
          http://stackoverflow.com/questions/3911966/how-to-convert-number-to-words-in-java
          Ответить
          • Стены кода. Может, вечерком попробую набросать на Haskell, наверняка получиться раз в 10 короче.
            Ответить
            • а какой главный инструмент?
              может кто подскажет, java умеет обрезать String cконца, вот как питон (2,-4) etc
              Ответить
        • Если не ошибаюсь, то генерить буквенное представление для решения задачи не нужно. Нужно формализовать кусочек английской грамматики.
          Ответить
          • а как же подсчитать количество букв в представлении?
            Ответить
            • К примеру. "Fifty" появится 10*10 раз и каждый раз принесет 5 букв. "One" появится (10*(10 - 1) + 100 + 1) раз : первое слагаемое - запись единиц с учетом того, что 11 - это "eleven"; второе - сотен; третье - в записи тысяч и каждый раз принесет 3 буквы...
              Ответить
              • Да, думаю, именно такое решение и подразумевалось. Но ради интереса я всё же набросал брутфорсик на Scala:
                class VerboseNumbers extends Application {
                  val ones = Array("", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
                  val teens = Array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
                  val tens = Array("", "", "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety")
                
                  def plural(n: Int, word: String) = if (n > 1) word + "s" else word
                
                  def hundreds(n: Int, lst: List[String]) = {
                    val rest = if (!lst.isEmpty) "and" :: lst else lst
                    ones(n) :: plural(n, "hundred") ::	rest
                  }
                
                  def verboseNum(n: Int, lst: List[String]): List[String] = {
                    if (n == 0)        lst
                    else if (n <= 9)   ones(n) :: lst
                    else if (n < 20)   teens(n - 10) :: lst
                    else if (n < 100)  tens(n / 10) :: ones(n % 10) :: lst
                    else if (n < 1000) hundreds(n / 100, verboseNum(n % 100, lst))
                    else throw new IllegalArgumentException
                  }
                
                  var len = "one thousand".length - 1
                  Range(1,1000).foreach( len += verboseNum(_, Nil).flatten.length )
                  println ("The answer is: " + len)
                }
                Ответить
                • Интересно, а если переписать на java, то насколько больше кода будет?
                  Ответить
                  • Если использовать тот же алгоритм, то примерно в два-три раза больше кода (если следовать всем соглашениям о форматировании кода).

                    P.S. чтобы результат был более красивым, нужно заменить
                    if (n < 100)  tens(n / 10) :: ones(n % 10) :: lst
                    на
                    if (n < 100)  tens(n / 10) :: verboseNum(n % 10, lst)
                    Можно ввести более удобное для работы определение
                    def verboseNumber(n: Int) = verboseNum(n, Nil)
                    Ответить
                • Если не ошибаюсь, первый исходник scala на ГК. Оформить чтоли отдельным номером...
                  Ответить
                  • А где здесь говно? Все понятно, всё читается.
                    Ответить
                    • любой исходник, опубликованный на ГК есть ГК.
                      p.s. пока не заминусован
                      Ответить
                      • минусуешь? правильно, значит не говно :))
                        Ответить
                • результат то какой?
                  Ответить
                  • Моя прога выдаёт 22024 (т.е. примерно 22 символа на число). Выглядит правдоподобно, ручками я не считал.
                    Ответить
                  • Зарегился на сервисе, проверил условия, подучил английскую грамматику. Правильный ответ 21124, его даёт программа
                    class VerboseNumbers extends Application {
                      val ones = Array("", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
                      val teens = Array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
                      val tens = Array("", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
                    
                      def hundreds(n: Int, lst: List[String]) = {
                        val rest = if (!lst.isEmpty) "and" :: lst else lst
                        ones(n) :: "hundred" :: rest
                      }
                    
                      def verboseNum(n: Int, lst: List[String]): List[String] = {
                        if (n == 0)        lst
                        else if (n < 10)   ones(n) :: lst
                        else if (n < 20)   teens(n - 10) :: lst
                        else if (n < 100)  tens(n / 10) :: verboseNum(n % 10, lst)
                        else if (n < 1000) hundreds(n / 100, verboseNum(n % 100, lst))
                        else throw new IllegalArgumentException
                      }
                    
                      def verboseNumber(n: Int) = verboseNum(n, Nil)
                      
                      var len = "one thousand".length - 1
                      Range(1,1000).foreach( len += verboseNumber(_).flatten.length )
                      println ("The answer is: " + len)
                    }
                    Ответить
                    • Забыли скобки у конструктора =(
                      Ответить
                      • Всё работает, я весь исходник залил. Один ворнинг - Application is deprecated, его нужно заменить на App.
                        Ответить
                        • Простите, код-то я понял, а вот язык, на котором он написан, почему-то не стал определять.
                          Раз программирую в основном на Java и С++, то это первое, что попалось на глаза :D
                          Ответить
                          • То есть def и двойные двоеточия вас не смутили, а вот отсутствие скобочек у конструктора сломало парсер? =)
                            Ответить
                            • Ну как-то так. Все было просто и понятно, вот почему-то и пропустил. Ну, как пропустил - прочитал. Понял что написано и пошел дальше :D Опасная штука получилась.
                              Ответить
                              • Всё-таки scala - годный язык. Всё понятно без единого комментария даже людям, не пишущим на нём.
                                Ответить
                    • Минусуют... неужто и правда не говно?...
                      Ответить

    Добавить комментарий