1. Python / Говнокод #12920

    −105

    1. 1
    2. 2
    3. 3
    Дана строка. Разрежьте ее на две равные части (если длина строки — четная, а если длина строки нечетная, то длина первой части должна быть на один символ больше). Переставьте эти две части местами, результат запишите в новую строку и выведите на экран.
    
    При решении этой задачи не стоит пользоваться инструкцией if.

    Вообще не разбираюсь в строках. Помогите пожалуйста.

    Запостил: alexsid13, 19 Апреля 2013

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

    • ++++++++++[>+++++++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
           .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
           ------.--------.>+.>.++>++++++++++>+++>+<<<<-]>++
           .>+.+++++++..+++.>++.<<+++++++++++++++.>.++
      +.     ------.------++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
           .>+.+++++++..+++.>++.<<++++ 
      +++++++++++.>.+++.
           ------.--------.>+.>.--.>+.>.
      ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
           .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
           ------.--------.>+.>.
      Ответить
    • >Python
      Эххх. Без LINQ это будет трудно.
      "не стоит пользоваться инструкцией if" сразу не заметил, потому звучит не так саркастично как хотелось бы
      Ответить
      • Без единого ифа: https://ideone.com/NMr4yf
        def perverse(s):
            for i in range((len(s) + 1) // 2):
                s = s[1:] + s[0]
            return s
        Ответить
        • И зачем тут это? Прикармливать не надо http://govnokod.ru/user/5120/codes
          Ответить
          • > И зачем тут это?
            Ну оно же совсем не оптимально и вообще говно...

            Ок, чтобы загладить свою вину добавлю плюсцов: https://ideone.com/rMmRTo
            std::string f(std::string s) {
                std::rotate(s.begin(), s.begin() + (s.size() + 1)/2, s.end());
                return s;
            }
            Ответить
            • >совсем не оптимально
              То понятно:)
              Но язык для демонстрации алгоритма выбран был неправильно.
              > и вообще говно
              В лабах, будь там хоть там O(n³) всем глубоко похер.
              Ответить
              • > Но язык для демонстрации алгоритма выбран был неправильно.
                Вину полностью признаю.
                Ответить
              • Кстати. А вдруг он случайно (или с умыслом) поставил раздел питон, а на самом деле ему нужно было написать на хаскеле, плюсцах или брейнфаке?
                Ответить
                • Еще скажи на SQLе.
                  http://informatics.mccme.ru/moodle/mod/statements/print3.php?id=3863
                  Программирование на python (8 класс, школа 179 г.Москвы)

                  Глядишь, скоро и с младшей школы будут сюда ходить.
                  Ответить
                  • > Глядишь, скоро и с младшей школы будут сюда ходить.
                    http://cdsmith.wordpress.com/2011/08/16/haskell-for-kids-week-1/
                    Ответить
            • За что решение с rotate минусуете? Можно услышать объективный комментарий?
              Ответить
              • Конечно нет. Минусаторы всегда прячутся за минусы. Они настолько тупы, что по делу им сказать нечего, а как-то выразить свою зависть им хочется.
                Ответить
    • let f s = (uncurry . flip) (++) $ splitAt ((length s + 1) `div` 2) s
      main = do
        s <- getLine
        putStrLn $ f s
      P.S. Но победа однозначно за guest'ом из первого коммента.
      Ответить
      • select right(str,(len/2)+len%2)+left(str,len/2) from (
           select str,'len'=len(str) from(select 'str'="12345")y
        )x
        Не. Ну надоела ваша функциональщина.
        Ответить
      • Ну мало point-free же
        (=<<) Data.List.HT.rotate ((`div` 2) . succ . length) "12345"
        Правда нужен instance из Control.Applicative, вместо rotate по вкусу ваш: (uncurry . flip) (++) . splitAt
        зы. let вкупе с main немного сбивает)
        Ответить
        • > зы. let вкупе с main немного сбивает)
          Есть такое. Одну строку из терминала скопипастил, вторую так дописал.
          Ответить
    • Режь вдоль
      #include <iostream>
      #include <string>
       
      int main(int, char **)
      {
          std::string input;
          std::cin >> input;
          for(char & symbol : input)
          {
              symbol = (symbol << 4 | symbol >> 4);
          }
          std::cout << input;
          return 0;
      }
      Ответить
      • Здесь бага - не выполнено условие "при нечетной длине строки первая половина должна быть на 1 символ длиннее второй". Придется вспоминать алгоритм брезенхейма и аккуратно раскидывать лишние 8 бит по символам...
        Ответить
        • >при нечетной длине строки первая половина
          Только чётные, от кратности 8 не уйдешь.
          А так да, на компьютере с 5-тритным чаром не будет работать.
          Ответить
          • Строка нечетной длины (побитово): abcdefgh ijklmnop qrstuvwx
            Разбиваем на половинки вдоль так чтобы первая строка получилась на 1 символ (8 бит) длиннее:
            abcd ghij mnop stuv
            ef kl qr wx
            Склеиваем вдоль: efabcdklghijqrmnopwxstuv
            Ответить
            • а.понял.достаточно было привести крайний случай в 3 символа.
              но вообще очень остроумный говноспособ .
              Ответить
              • Я неправильно порезал, кстати. Надо было резать отступив на 4/n бит вправо от центра байта. Тогда левая группа бит составит 4*n+4 бита, а правая 4*n-4 бита, и условие будет выполнено. А разрез будет красивым и неровным.
                Ответить
              • Случаи с 1 и 3 придется обработать специально:
                1) 8+0
                3) 5+3, 6+2, 5+3

                А для больших чисел подойдет аналог алгоритма Брезенхейма:
                size_t d = 0;
                for (size_t i = 0; i < len; ++i) {
                    d += 4;
                    if (d >= len) {
                        d -= len;
                        symbol = (symbol << 5 | symbol >> 3);
                    } else {
                        symbol = (symbol << 4 | symbol >> 4);
                    }
                }
                В результате получаем аккуратный разрез вдоль, причем такой, что первая половина на 1 символ (8 бит) больше второй.
                Ответить
    • показать все, что скрыто
      s = 'ololotest'
      print s [(len (s) + 1) / 2:] + s [:(len (s) + 1) / 2]


      Или это был тест на выпендрёжность решения? Тогда да, сливаюсь.
      Ответить
      • В бан.
        Ответить
        • А чего в бан? Вроде же правильно?
          Ответить
          • > Вроде же правильно?
            Вот за это и в бан. Дабы не поважать студентов и учеников.
            Ответить
            • Ну ученков то можно
              Ответить
              • Нельзя. Борманд запретил.
                Ответить
                • Помогать людям - это в бан? Не хочу я жить в таком обществе, в котором помощь слабым считается плохим делом. А это именно помощь, потому что понятно, что программизм - это не его, а он будет например дирехтаром.
                  Ответить
                  • Идика ты работать быдлоодмином в очередную ООО "Вектор". Там тебя быстро научат "помогать" слабым пользователям
                    Ответить
                    • Работа админа в принципе помогать. И вообще люди должны помгать друг другу.
                      Ответить
                      • Работа аникея помогать. А псевдоилитие сраное - пидорасы. Только на копейку больше знают, уже начинают советовать стать уборщиком, похуй, что их языком ты пользуешься по надобности.
                        Ответить
                        • Топикстартер может завтра одумается и поймет, что нужно больше работать над собой. Так что нечего ставить на нем крест
                          Ответить
                          • Если ему сегодня дать готовое решение, то завтра он не одумается. И это будет уже не его вина, а тех, кто "помог".

                            http://whathaveyoutried.com/
                            Ответить
                      • >Не хочу я жить в таком обществе, в котором помощь слабым считается плохим делом.

                        Не считается плохим делом. Однако, автор даже не пытался что-то сделать ("Вообще не разбираюсь в строках"). Блять, ты манул по питону пытался искать? Благодаря всяким интернетам и гуглам у нас есть возможность найти любую информацию за считанные секунды. Леонадро да Винчи, попади он в наше время, охуел бы от количества информации и зачитывался, забыв про еду.
                        Дай человеку одну рыбу - накормишт его на день, научи человека ловить рыбу - наромишь его на всю жизнь. Но многие идут по пути наменьшего сопротивления и привыкают, что за них все делают(сначала тупые пользователи просят одмина изменить шрифт в ворде, потом считают, что это его обязанность). И фейл тут не только для одмина, которого заебал тупые юзвери, но и для самого юзверя, так он в профессиональном плане нихуя не растет, а требуют, просит, жалуется и нихуя не пытается ловить рыбу.
                        Ответить
                        • Ты же видишь, что это не его. Он может будет хорошим дворником. Школьник, если кроме крайзиса и вконтактика не включает, то это нормально. Вполне возможно он не планирует связывать свою жизнь с компами.
                          Ответить
                          • Если посмотреть, то даже студенты часто по профессии не идут и переквалифицируются потом, а тут лишь школьник.
                            Ответить
                  • Так толсто, что толсто. Ты бы ещё в двощи пошёл помогать слабым.
                    Ответить
    • https://ideone.com/Yc5ErO
      Ответить
    • гнать ссаными тряпками из профессии
      Ответить
      • Из какой профессии? Он еще не программист, и не факт, что им когда-то вообще будет.
        Ответить
    • "При решении этой задачи не стоит пользоваться инструкцией if."

      а зачем в решении этой задачи вообще может быть нужен if?
      Ответить
    • вся суть пользования if в условии нечётности строки
      python:
      s = "1234567"
      s[int( len(s)/2 )+len(s)%2 :] + s[ :int( len(s)/2 )+len(s)%2 ]

      haskell:
      let a = "1234567"
      let b = ys++xs where (xs,ys) = splitAt ((length a `div` 2) + (length a `mod` 2)) a
      Ответить
    • А чего сложного-то, особенно, если if нема (ну ладно, -> тоже не используется):

      main(X) :- split(X,X,L,R), append(R,L,Y), write(Y).
      
      split([H|T],[_,_|Y],[H|L],R) :- split(T,Y,L,R), !.
      split([H|R],[_],[H],R).
      split(R,[],[],R).
      Ответить
      • А "!" здесь зачем?
        Ответить
        • А хз. Вроде нижние две строки сфейлиться никак не смогут, и он тут действительно не нужен.
          Ответить
        • Несущественно: чтобы в оболочке не предлагали искать дальше, правда нужно было перед append (или после) ставить.
          Ответить
          • // здесь таки предлагает в случае: [_]
            Ответить
          • А что оболочка ещё предлагает поискать? У неё есть ещё какие-то варианты или она сначала?
            Ответить
            • > А что оболочка ещё предлагает поискать
              Просто перебор вариантов пойдет дальше, пока они все не закончатся. А откат через "!" сразу же заканчивается фейлом.

              Но в данном случае, имхо, решение будет единственным, т.к. тут все 3 варианта взаимоисключающие из-за [_,_|Y], [_] и [].
              Ответить
              • Разумеется, единственным.
                Но в случае списка из одного элемента выведет его же согласно второму предикату split,
                но предложит продолжить поиск (по-крайней мере gprolog): ведь заранее интерпретатор не обязан знать, что 3-ий не подойдет.
                Ответить
    • В этом треде не хватает оверинжиниринга и параллельности!
      http://ideone.com/JFaWqU
      Видимо, на ideone больше одного ядра на выполнение не дают (а живой рабочий космос пока прикрыли), и выполнение получается практически последовательным. На моём компе вывод горутин перемешан.
      Ответить
      • на лайвворкспейске бы проверить, но он аут оф оде
        Ответить
        • Пример кстати, наглядно демонстрирует ограничение планировщика Go: у него нет понятия таймслайсов, горутины выполняются до тех пор, пока могут потреблять CPU, т.е. не висят в системных вызовах или в ожидании данных из канала. Впрочем, это всё равно значительно лучше, чем типичная однопоточная асинхронность.
          Ответить
          • Ты хочешь сказать, что горутины все время занимаются пулингом вместо нормального ожидания на событии? Это же плохо!
            Ответить
            • Пулингом чего? Фактически это типичная кооперативная многозадачность. Горутины снимаются с выполнения, когда входят в системый вызов или пытаются читать из пустого канала. Управление им будет возвращено, когда они будут готовы, а их соседи не будут потреблять процессор.
              Ответить
              • А не получится ли так, что несколько горутин загрузят все ядра какой-то вычислительной работой, а остальные будут спать и ждать таймслота, при этом повиснет гуй, перестанут обрабатываться сокеты и т.п...

                P.S. Ну хотя если это кооперативная многозадачность - то придется периодически втыкать в эти вычислительные рутины какой-нибудь yield, чтобы дать другим поработать.
                Ответить
                • Хоть в эрланге кооперативная многозадачность, но такой проблемы нет. Там взывается планировщик и вызовы его имитит сам компилятор
                  Ответить
                  • С хрена ли она в эрланге кооперативная?
                    Ответить
                    • А какая она по твоему? Именно такая, только компилятор сам вставляет в сгенерированный код вызовы планировщика процессов
                      Ответить
                      • > компилятор сам вставляет в сгенерированный код вызовы планировщика процессов
                        Так это же детали реализации.

                        А с точки зрения программиста там самая настоящая вытесняющая многозадачность.

                        Кооперативная многозадачность это нода жс, питонский твистед и прочая асинхронщина встающая колом от любого мало-мальского расчета.
                        Ответить
                        • Я рассказывал про внутреннюю реализацию вообще-то.

                          > А с точки зрения программиста там самая настоящая вытесняющая многозадачность.
                          Нет, это влияет на написание кода программистом. Вот представь себе:
                          Scheduler()//вставил компиль суда
                          while(1){}
                          Scheduler();//и суда

                          И все. Вся программа висит
                          Ответить
                          • > И все. Вся программа висит
                            Если я это сделаю на ноде жс или твистеде - да, так и будет, потому что там кооперативная многозадачность.

                            Если же я сделаю это на эрланге:
                            -module(test).
                            -export([start/0, foobar/0]).
                            
                            foobar() ->
                                foobar().
                            
                            start() ->
                                spawn(test, foobar, []).
                            и запущу test:start() десяток раз, то увижу что мой проц загружен на 200% (линух так показывает когда загружены оба ядра) этими вечными циклами, но система остается очень отзывчивой и ничего не висит.

                            Так какая все-таки многозадачность в эрланге с точки зрения программиста? ;)
                            Ответить
                          • P.S. Если хочешь доказать что эта деталь реализации хоть как-то влияет на стиль кода - напиши на эрланге функцию, которая будучи заспавненной повесит рантайм или не даст работать другим заспавненным функциям.

                            P.P.S. А поскольку такой код написать ты не сможешь, многозадачность с точки зрения программиста там все-таки вытесняющая, и абсолютно неважно что там под капотом.
                            Ответить
                            • >А поскольку такой код написать ты не сможешь
                              Если заряженное ружьё висит на стене, то оно переодически стреляет, именно поэтому эрланг переодически будет ставить подножку. От этого не уйти, поэтому нужно это учитывать.
                              Ответить
                              • Откуда столько пессимизма? С тем же успехом ядро линухи\винды может переклинить, и оно передумает переключать задачу.

                                > От этого не уйти, поэтому нужно это учитывать.
                                Как? Не юзать эрланг разве что.

                                P.S. Кстати воркеры переключают процессы каждые 2000 редукций. Не кажется ли тебе, что это все-таки вытесняющая многозадачность с точки зрения программиста на эрланге?

                                P.P.S. Да, сишный драйвер там вполне может заклинить, но он и написан не на эрланге.
                                Ответить
                • Да, с моделью десктопного GUI при наличии лишь одного процессора оно посложнее. В любом случае, долгие вычислительные рутины снабжаются прогресс-баром, для реализации которого требуется канал, запись в который и будет местом передачи управления. Но даже при таком раскладе отзывчивость интерфейса может пострадать.
                  Ответить
        • Вот вывод с моей машины
          $ ./main          
          2013/04/20 10:57:36 Running on 2 cpu core(s)
          Trololo
          2013/04/20 10:57:39 Initial string:  Trololo
          2013/04/20 10:57:39 [1] Received char [o(111)], inserting into pos[0]
          2013/04/20 10:57:39 [2] Received char [T(84)], inserting into pos[0]
          2013/04/20 10:57:39 [1] Received char [l(108)], inserting into pos[1]
          2013/04/20 10:57:39 [1] Received char [o(111)], inserting into pos[2]
          2013/04/20 10:57:39 [2] Received char [r(114)], inserting into pos[1]
          2013/04/20 10:57:39 [2] Received char [o(111)], inserting into pos[2]
          2013/04/20 10:57:39 [2] Received char [l(108)], inserting into pos[3]
          2013/04/20 10:57:39 Result string:  oloTrol
          Ответить
    • exception Done of char list * char list;;
      
      let half input =
        let ($) f g x = f (g x) in
        let list_to_string = (String.concat "") $ (List.map (String.make 1)) in
        try 
          let rec loop i j first_half second_half =
            let k = (j - i) in
            match k with
            | _ when k < 0 -> raise (Done (first_half, second_half))
            | _ when k == 0 -> raise (Done (((String.get input i) :: first_half), second_half))
            | _ -> loop (i + 1) (j - 1)
              ((String.get input i) :: first_half)
              ((String.get input j) :: second_half)
          in
          loop 0 (String.length input - 1) [] []
        with Done (first_half, second_half) ->
          Printf.printf "First half: %s\n, Second half: %s\n"
            (list_to_string (List.rev first_half)) (list_to_string second_half);;

      Я старался.
      Ответить
      • Исключение вместо просто вовращаемого значения? жесть.
        Ответить
        • Ты ещё boost::graph не видел. Там исключение используется для возврата значения
          Ответить
        • Ну, помоему тут вариантов с исключениями еще не предлагали...
          Ответить
          • А вон питон тоже для чего-то левого использует исключения. По моему для выхода из цикла с ренджами
            Ответить
            • Для выхода из любых циклов, все итераторы построены на этом. Но ладно змееусты, они хотя бы идиоматикой прикрылись. Но в функциональщине это как ножом по стеклу...
              Ответить
              • А каким местом они прикрылись? Помоему это неудобный костылище. Это что теперь ловить для каждого цикла по исключению?
                Ответить
                • for сам ловит это исключение. Я лично не понмю, когда последний раз пользовался итераторами напрямую (через функцию next), и пользовался ли вообще.
                  Идиоматика раз тут:
                  http://docs.python.org/2/glossary.html#term-eafp
                  Ответить
                  • Как всегда аргументированно объясняют... И не поспоришь..
                    Ответить
                • Ну в языках типа МЛ / Скалы исключения в циклах - нормальное явление, т.как break нету. Конечно, в примере выше оно совсем не нужно, но в типичном цикле на МЛ очень часто можно встретить исключения. Ну, в том же eLisp'e из цикла никак по-другому не выйти досрочно.
                  Ответить
                  • Во. Когда я на эмелях писал, думал что-за фигня? Неужели я неумею в мл, а оказывается все так делают.
                    Ответить
                  • > Скалы
                    Не нужны исключения там, где работает хвостовая рекурсия и return.
                    Опять же обсуждали это с коллегой на работе, вывели термин Pessimistic Programming - по умолчанию все функции считаются зафейлившимися, а успешный результат кидается исключением.
                    Ответить
    • (define (yoba-split str)
        (let* ((len (string-length str))
               (pos (ceiling (/ len 2))))
          (string-append (substring str pos)
                         (substring str 0 pos))))
      Ответить
      • Не мог пройти мимо: (ceiling (/ x 2)) = (ceiling x 2)
        Ответить
    • k = len(s)-len(s)/2
      print s[k:]+s[:k]
      Ответить
    • показать все, что скрытоололо, ололо, все вы быдло и хуйло!
      Ответить
    • показать все, что скрытоололо, ололо, все вы быдло и хуйло!
      Ответить
    • показать все, что скрытоололо, ололо, все вы быдло и хуйло!
      Ответить

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