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

    +65

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    /*
     * 
     * 
     */
    
    public class Chapter1 {
    	private String text[] = { "Returns a  new string that is a ",
    			"substring of this string" };
    	private String splitted[];
    
    	private int k = 2; // 
    	private char c = '<'; 
    
    	public void run() {
    		for (int i = 0; i < text.length; i++) {
    			text[i] = makeString(text[i], change(i)); 
    														
    			System.out.println(text[i]);
    			
    		}
    	}
    
    	/*
    	 * 
    	 */
    	private String makeString(String textLine, String[] changed) {
    		StringBuilder sBui = new StringBuilder(textLine);
    
    		int i = 0; // changed index
    		int beginIndex = 0; 
    		
    
    		for (int j = 0; j < splitted.length; j++) {
    			beginIndex = sBui.indexOf(splitted[j], beginIndex); // word begin		
    			int endIndex = beginIndex + splitted[j].length(); // word end
    			
    			if(splitted[j].length() > k){			
    				sBui.delete(beginIndex, endIndex);
    				sBui.insert(beginIndex, changed[i++]);
    			} 
    			
    			beginIndex = endIndex;
    		}
    						
    		return sBui.toString();
    	}
    
    	/*
    	 * 
    	 * 
    	 */
    	public String[] change(int i) {
    
    		splitted = text[i].split("\t|\n| "); 
    
    		for (int indx = 0; indx < splitted.length; indx++) {
    			if (splitted[indx].length() > k) {
    				StringBuilder sBuild = new StringBuilder(splitted[indx]);
    				sBuild.setCharAt(k, c);
    				splitted[indx] = sBuild.toString(); // irasomas pakeistas zodis				
    			}
    		}
    
    		return splitted;
    	}
    
    } // end

    help, задание - вкаждом слове текста к-тую буквы заменить с символом, если длина слова меньше к, замену не выполнять.

    Exception in thread "main" java.lang.StringIndexOutOfBoundsExceptio n: String index out of range: -1 (проблема)

    Запостил: spivti, 24 Августа 2013

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

    • (defparameter *lab-1-text*
        "Returns a  new string that is a 
         substring of this string")
      
      (defun lab-1 (k replacement)
        (format nil "~{~A~^ ~}"
          (loop :for word :in
             (split-sequence:split-sequence
                #\Space *lab-1-text* :remove-empty-subseqs t)
             :when (> (length word) k)
             :do (setf (aref word k) replacement)
             :collect word)))
      
      (lab-1 2 #\X)
      
      ;; "ReXurns a neX stXing thXt is a 
      ;;  suXstring of thXs stXing"

      День прожит незря.
      Ответить
    • let lab_1 s k replacement =
        let rec loop i j =
          if i < String.length s then
            (if j = k then s.[i] <- replacement;
             let j = if s.[i] = ' ' then 0 else j + 1 in
             loop (i + 1) j) in
        loop 0 0; s;;
      
      lab_1 "Returns a  new string that is a substring of this string" 2 'X';;
      (* "ReXurns a  neX stXing thXt isXa suXstring ofXthis stXing" *)

      Ну, или еще вариант.
      Ответить
      • let lab_1 s k replacement =
          let rec loop i j =
            if i < String.length s then
              (if j = k && s.[i] != ' ' then s.[i] <- replacement;
               let j = if s.[i] = ' ' then 0 else j + 1 in
               loop (i + 1) j) in
          loop 0 0; s;;
        
        lab_1 "Returns a  new string that is a substring of this string" 2 'X';;
        (* "ReXurns a  neX stXing thXt is a suXstring of thXs stXing" *)
        ooops
        Ответить
        • А вот и Хаскель с кошерной декомпозицией на обработку одного слова (replaceAt) и пословную обработку текста некой функцией (mapWords) :)
          replaceAt k r s = let (b, e) = splitAt (k-1) s in
              if null e then s else b ++ r : tail e
          
          mapWords f = unlines . map (unwords . map f . words) . lines
          
          main = do
              text <- getContents
              putStrLn $ mapWords (replaceAt 2 '<') text
          http://ideone.com/4GBTm7
          Ответить
          • : lab-1
                ( replacement k string-ptr string-len -- string )
                tuck 0 2swap 2rot rot 2rot 0 2swap rot
                do
                    dup i chars + c@ bl =
                    if nip 0 swap
                    else swap 1+ swap
                    then -rot 2dup =
                    if 2swap 2dup i chars + c! 2swap then rot
                loop
                2nip nip swap type
            ;
            88 3 s" Returns a  new string that is a substring of this string" lab-1
            88 3 s" Returns a  new string that is a substring of this string" lab-1
            ReXurns a  neX stXing thXt is a suXstring of thXs stXing ok


            голосом Дуку: Something sinister!
            Ответить
            • Хотел ответить на брейнфаке, но что-то лениво ;( Сделаю ход конем:
              while (<>) {
                  s/(\S)\S(\S*)/$1<$2/g;
                  print;
              }
              Шах!
              Ответить
              • Еще из языков замечательно работающих со строками остались Сиквел и XSLT, но лучше я пойду подышу свежим воздухом.
                Ответить
                • > но лучше я пойду подышу свежим воздухом.
                  Отличная мысль ;)
                  Ответить
              • function lab1(s, k, r, i) {
                    return s.split("").reduce(
                        function (a, b) {
                            return a.concat([(i = b == " " ? 0 : (i | 0) + 1) == k ? r : b]); }, []).join("");
                }
                lab1("Returns a  new string that is a substring of this string", 3, "X");
                // "ReXurns a  neX stXing thXt is a suXstring of thXs stXing"

                Но напоследок.
                Ответить
                • Фаталити напоследок:
                  sed 's/\b\(\S\)\S/\1</g'
                  Ответить
                  • @bormand wins!
                    Ответить
                  • Program Replacements;
                    
                    const input : String = 'Returns a new string that is a substring of this string';
                          replace : Char = 'X';
                          k = 3;
                    
                    var s : String;
                        i, j : Byte;
                    
                    begin
                      s := input;
                      j := 0;
                      for i := 1 to ord(s[0]) do begin
                        if (s[i] = #32) OR (i = ord(s[0])) then begin
                          if i - j > k then
                            s[j + k] := replace;
                          j := i;
                        end;  
                      end;
                      writeLn(s);
                    end.
                    { ReXurns a neX stXing thXt is a suXstring of thXs stXing }
                    http://ideone.com/Duy3uG
                    Мутабельные строки решают.
                    Ответить
                  • Зачем \) ?
                    Ответить
                    • Потому что у седа режим по умолчанию дебильный, собственно как и у баша - часть спецсимволов надо экранировать, чтобы они получили свой спецсмысл, а часть наоборот. С extended-regex (-r) экранировка более привычная, и скобки без экранов пишутся.
                      Ответить
    • Радует как стрингБилдер используется для замены одной буквы - это так мило.
      И логика постороения методов радует - даешь одному методу строку, а он тебе выдает массив слов с замененной буквой (такое ощущение, что не доработал), а второй принимает исходную строку и массив слов из этой строки с нужными изменениями. Бред же.
      Ответить
      • если вы так умны, чего же не написали на йаве, а на си шарпе наваяли. в яве замена символа доступна в стринг билдере. Следовательно нужно в каждом слове заменить символ. Это делает один метод.

        Другой выбирает из строки индекс слова и заменяет его изменненым словом из массива. Что неясного.
        Предложите свой вариан на ЯВЕ. другим тоже это относиться.
        Ответить
        • Это не сайт помощи студентам. Обратитесь на stackoverflow или его русскоязычный аналог.
          Ответить
          • Ну почему, баксов за 30-40, я думаю, даже тут найдутся желающие допилить лабу до ума ;)
            Ответить
            • > допилить лабу до ума ;)
              > Хотел ответить на брейнфаке, но что-то лениво ;(
              Вижу, почти допилили уже...
              Ответить
              • Вы полагаете, что ОП запилит по скорому интерпретатор брейнфака на джавах, впилит код борманда строковой константой в код и в таком виде сдаст лабу?
                Ответить
                • Нет, я думаю, он воспользуется интерпретатором JS и возьмёт код wvxvw.

                  javax.script.ScriptEngineManager manager = new javax.script.ScriptEngineManager();
                  javax.script.ScriptEngine engine = manager.getEngineByName("javascript");
                  
                  String source = "put wvxvw code here";
                  String result = null;
                  try {
                    result = (String) engine.eval(source);
                  } catch (javax.script.ScriptException e) {}


                  А вообще это был неявный зелёный цвет.
                  Ответить
              • > Вижу, почти допилили уже...
                +++>,+[-[>+>+<<-]>>>[-]+<---------[-[---[------------------
                -[>-<[-]]]]]+>[<-<.<<[-]+++>>>>[-]]<[-<<<-[>+>>+<<<-]>[<+>-
                ]>>>+<[<.>>-<[-]]>[+++++++++[<++++++>-]<.[-]>][-]<]<[-]<,+]
                (Код юзает -1 в качестве EOF, идет например в линушном bf).
                Ответить
                • *воспринимая происходящее как магию* Хм, это даже короче, чем код на более традиционных языках, где синтаксического сахара чуть больше. А ведь тут были как минимум "32" и "60".
                  Ответить
                  • 9, 10, 13, 32 в детекторе пробелов (группа скобок и миусов вверху), 60 (записанное как 6 на 10) в выводе.
                    Ответить
            • >баксов за 30-40
              Губа до Москвы докатится.
              Ответить
              • Не, ну я понимаю, что толпы заедушников-решателей сейчас просадили цены почти в ноль... Но мне то что с того?)
                Ответить
              • P.S. А за сколько ты сам согласился бы решать лабу? :)
                Ответить
                • я решу эту лабу за 5 девственец!
                  Ответить
                  • А я за 3, но не страшных!
                    Ответить
                    • Давай вместе - по 2,5 заберем)
                      Ответить
                      • И как же ее резать пополам? Вдоль али поперек?
                        Ответить
                        • Мне только голову
                          Ответить
                        • Поездом у чукчи жену разрезало пополам. Он поднимает с путей нижнюю половину и забирает. На вопрос о том, почему не берёт верхнюю половину, отвечает, что с ней они только всё время ругались, однако, а с нижней жили в гармонии. (q) из старого бойана
                          Ответить
          • > студентам
            >> относиться
            Ой, студентам ли...
            Ответить
          • Ответы мэйл.ру? :D
            Ответить
            • На самом деле этот пост содержит много разнообразных и грамотных решений проблемы. Это гораздо больше, чем дали бы на форуме.
              Ответить
        • > чего же не написали на йаве
          > Предложите свой вариан на ЯВЕ. другим тоже это относиться.
          Процитирую Мистера Хэнки: Это говнокод, а не сайт помощи немощным студентам.

          ГК это развлекательный сайт, на котором мы отдыхаем от работы/учебы и читаем/пишем код just for fun. А для помощи студентам/школоте есть куча платных и бесплатных сайтов, где тебе будут рады помочь.

          А вообще - иди думай сам. Лабы студентам дают не ради оценок, а ради того, чтобы они думать научились. И если ты сделаешь все сам - пользы будет на порядок больше, чем если тебе подскажут.
          Ответить
          • Тс, мне еще на работу устраиваться. Кто меня возмет, если все сами лабы будут писать)
            Ответить
            • Зато коллеги потом будут нормальные, а не распиздяи, которые тянут до последнего, а тимлид за них дописывает. Во всем надо видеть хорошее ;)
              Ответить
              • Что я узнал из командной работы

                1 Как все сделать самому
                2 Я ненавижу людей
                )))
                Ответить
          • Ну я так и понял.
            Ответить
        • Прости, мой пернатый друг, у меня того, Eclipse не стоит, как я дебажить то буду, без IDE то?
          Ответить
      • > и массив слов из этой строки с нужными изменениями
        Причем аргументы этот change получает через анус, неужели так сложно было передать ему text[i], а не i, а splitted описать внутри функции? ;)

        P.S. А потом в makeString один и тот же массив юзатся как changed и как splitted ;)
        Ответить
        • >неужели так сложно было передать ему text[i], а не i

          Ну зачем то же мы поле создавали, что бы оно без дело не стояло пусть используется в как можно большем числе функций

          > splitted описать внутри функции

          пусчай повесит в куче - он нам еще пригодиться)
          Ответить
          • > он нам еще пригодиться
            А он и пригодился в makeString.
            Ответить
            • Причем 2 раза...
              Это полиморфизм наоборот)
              Ответить
              • Причем тут полиморфизм? Инкапсуляция наоборот же :)
                Ответить
    • решение навскидку (может тоже хрень)
      class Program
          {
              private static string[] _inputStrings = { "Returns a  new string that is a ",
      			"substring of this string" };
              private static char[] _splitterChars = {'\t', '\n', ' '};
              private static int _indexOfReplace = 2;
              private static char _charForReplace = '<'; 
      
              static void Main(string[] args)
              {
                  foreach (var inputString in _inputStrings)
                  {
                      Console.WriteLine(Do(inputString));
               
                  }
                  Console.ReadKey();
      
              }
      
              private static string Do(string inputString)
              {
                  var stringBilder = new StringBuilder(inputString);
                  var index = 1;
                  for (var i = 0; i < stringBilder.Length; i++)
                  {                
                      if (_splitterChars.Contains(stringBilder[i])) index = 0;
                      if (index++ == _indexOfReplace)
                      {
                          stringBilder[i] = _charForReplace;
                      }
                  }
                  return stringBilder.ToString();
              }
      
          }
      Ответить
      • Ща минусовать будем. Ты пошто на яве решение написал, как и просил ОП? :)
        Ответить
        • Це не ява, це шарп)
          Ответить
          • Ааа, сорри :)
            Ответить
            • Есть мнение, что автор статьи не смог конвертнуть из шарпа в жабу LOL

              В итоге мой код оказался толстым троллингом)
              Ответить
              • шарп я воспринимаю, но там свои тонкости, пардон.
                Ответить
      • это говнокод, а не сайт помощи немощным студентам
        Ответить
        • Да я такой же немощный студент)

          Я только щас понял, что автор поста просил помощи, если бы понял раньше - не помог бы)
          Ответить
        • немощный мозгом.
          Ответить
      • Пайтон:
        import string
        
        text = "Returns a  new string that is\na substring of this string"
        
        def replaceAt(k, r, s):
            if k > len(s):
                return s
            else:
                return s[:k-1] + r + s[k:]
        
        def mapWords(f, s):
            return string.join(
                [string.join([f(w) for w in l.split()]) for l in s.split('\n')],
                '\n'
            )
        
        print mapWords(lambda s: replaceAt(2, '<', s), text)
        http://ideone.com/Le1rFB
        Ответить
        • ну и куда мне этот твой пайтон прикрутить, корове к хвосту может.
          Ответить
          • Как куда - возьми, под скрип оформи и запусти из жабы - делов то
            Ответить
            • jython или как там его.
              Ответить
              • Он, родимый. Не думаю, что много придется перепиливать. Возможно даже ничего
                Ответить
        • def lab1(s, k, r):
              def f(i):
                  for c in s:
                      i = (i + 1) * (c not in [' ', '\n'])
                      yield i, c
              return ''.join([r if x == k else y for x, y in f(0)])
          
          lab1('''Returns a  new string that is
          a substring of this string''', 3, 'X')

          Альтернативное решение на Питоне.
          Ответить
          • Заточено под конкретную задачу, а мой mapWords еще для какой-нибудь обработки слов можно поюзать ;)
            Ответить
    • Qbasic

      10 inputString$ = "Returns a new string that is a substring of this string"
      20 replaceChar$ = "<"
      30 replaceIndex = 2
      40 d = LEN(inputString$)
      50 DIM s$(d)
      60 index = 0
      70 FOR i = 1 TO d
      80 index = index + 1
      90 a$ = MID$(inputString$, i, 1)
      100 IF a$ = " " THEN
      110 index = 0
      120 END IF
      130 IF index = replaceIndex THEN
      140 s$ = s$ + replaceChar$
      150 ELSE
      160 s$ = s$ + a$
      170 END IF
      180 NEXT i
      190 PRINT s$
      Ответить
    • Поможем всем миром!

      print replaceEx("Returns a new string that is a substring of this string", 5,  "€");
      
      sub replaceEx {
      my ($text, $k, $replace) = @_;
      my $result = "";
      for my $token (split /\s/, $text) {
          substr ($token, $k, 1, $rep) if length $token >= $k;
          $result .= $token + ' ';
      }
      return $result;
      }
      Ответить
    • Вы бы хоть языки подписывали, а то парень теряется)
      Ответить
    • теряются люди в лесу, вот слегка подправил, еще чутка допилить и все.

      public class Chapter1 {
      private String text[] = { "Returns a new string that is a ",
      "substring of this string" };

      private String splitted[];

      private int k = 2;
      private char c = '<';

      public void run() {
      for (int textLine = 0; textLine < text.length; textLine++) {
      splitted = text[textLine].split("\t|\n| ");
      text[textLine] = makeString(textLine);

      System.out.println(text[textLine]);

      }
      }


      private String makeString(int lineIndex) {
      StringBuilder sBui = new StringBuilder(text[lineIndex]);

      int splittedIndex = 0;
      for (int j = 0; j < splitted.length; j++) {
      int begin = sBui.indexOf(splitted[splittedIndex]);
      if(splitted[splittedIndex].length() > k){
      sBui.setCharAt(begin + k, c);
      }

      splittedIndex++;
      }

      return sBui.toString();
      }
      }
      Ответить
      • >private String splitted[];

        завязывай, у меня от этого брат умер)))
        Ответить
        • не понял юмора. Массив для доступа всеми методами класса.
          Ответить
      • Ну вот это намного лучше, и вроде должно работать. Только все-таки стоит описать splitted прямо внутри for'а, и передать его в makeString аргументом.

        UPD: А нет, не будет работать.
        Ответить
      • Беда тут в чем - ты пытаешься найти слово в строке, и потом править в нем символ. Но в слове substring есть слово string, поэтому получится su>st>ing, а сам string останется незамененным. Поэтому метод с поиском отсплитанных слов в исходной строке через indexOf он изначально фейловый.

        Самый банальный вариант, который будет работать - загрузи всю строку полностью в стрингбилдер (ты один хрен это делаешь), и тупо пробегись по нему посимвольно циклом, заменяя в нем каждую k-ю букву от начала слова на нужный символ, без всяких split и indexOf. Как определить, что текущий символ k-й от начала - подумай сам :)
        Ответить
    • C помощью регулярок

      \b(\w{2})\w

      $1<

      В любом языке. менять < и 2 опционально
      Ответить
      • регулярки я пропустил, еще не освоил. буду копать, спасибо всем.
        Ответить
        • Как то так
          class Program
              {
                  private static string[] _inputStrings = { "Returns a  new string that is a ",
          			"substring of this string" };
                  private static int _indexOfReplace = 2;
                  private static char _charForReplace = '<';
          
                  static void Main(string[] args)
                  {
                      var regex = new Regex(@"\b(\w{" + (_indexOfReplace - 1) + @"})\w");
          
          
                      foreach (var inputString in _inputStrings)
                      {
                          Console.WriteLine(regex.Replace(inputString, @"$1" + _charForReplace));
          
                      }
                      Console.ReadKey();
          
                  }
              }
          Ответить
    • Ну ладно, так и быть, расскажу почему код фейлится. Но раз говорить "пожалуйста" наш юный друг не научился, советов по исправлению кода он не дождется.

      У тебя change в строке 60 испортило массив splitted - в нем вместо "Returns" лежит "R<turns" и т.п. Когда мы зайдем в makeString, splitted и changed будут указывать на один и тот же массив (почему? читай любую книгу по яве, раздел про ссылки), а он уже испорченный. Поэтому indexOf в строке 34 не найдет этот "R<turns" в исходной строке, и вернет -1. Ну а дальше delete в строке 38 сфейлится с исключением.
      Ответить
      • с этим я розобрался, предложил новый вариант.
        Ответить
        • Тут нужно все перепиливать по хорошему
          Ответить
    • import java.util.ArrayList;
      import java.util.Scanner;
      public class Main {
          public static void main(String []args) throws Exception{
              Scanner sc = new Scanner(System.in);
              int number_of_symbol = 3;
              char symbol = '<';
              ArrayList<StringBuilder> text = new ArrayList<StringBuilder>();
              while(sc.hasNextLine()){
                  String[] tmp = sc.nextLine().split(" ");
                  for(int i = 0; i < tmp.length; i++)
                      text.add(new StringBuilder(tmp[i]));
              }
              for(int i = 0; i < text.size(); i++){
                  if(text.get(i).length() > number_of_symbol)
                      text.get(i).setCharAt(number_of_symbol,symbol);
                  System.out.println(text.get(i));
              }
          }
      }

      без классов и всякой фигни, но вроде пашет
      Ответить
      • Не стыдно, а? Не даешь студенту мозги размять ;)

        Ну хотя с другой стороны выводит оно все равно не так, как нужно, а студент почерпнет отсюда знания о Scanner и ArrayList.
        Ответить
        • сорри, тред не прочитал, не думал, что просят лабу запилить
          Ответить
          • Кстати, имхо, лучше форич поюзать. Примерно так:
            for (StringBuilder b : text) {
                if (b.length() > number_of_symbol)
                ...
            }
            Ответить
            • Тред все больше напоминает бассейн с троллями)
              Ответить
        • В таком случае можно замены проводить прямо в вайле, если я конечно правильно понял, что значит "неправильно выводит".
          Ответить
          • Да тут, имхо, лучше даже без сплита, ибо сплит херит форматирование. Просто загнать всю строку в стрингбилдер и бежать по нему, проверяя текущий символ на Character.isLetter, и ведя счетчик (позиция от начала слова).

            > неправильно выводит
            Ну как я понял задачу - надо сохранить исходное форматирование.
            Ответить
            • Да, это самый разумный вариант. Студенту остается лишь реализовать вышесказанное.
              Ответить
              • Еще лучше - просто мой код с шарпа на java перевести.
                Ответить
                • ИМХО, для лабы лучше написать вручную(без использования регекспов).
                  Ответить
    • Внимание, некрофилия!

      F#
      let NChangeFunc (str: string) n char =
          String.concat " " ((str.Split ' ')|> Array.map (fun x -> x|> String.mapi (fun i c -> if i <> n-1 then c else char))) 
       
      let a = NChangeFunc "sdas asfa asfaf asdafa sfasf h hh h" 2 '<'
      Ответить
      • многословненько... На хуяскиле покороче бы было
        Ответить
        • может и на F# можно покороче - я позавчера изучать начал
          Ответить

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