1. Куча / Говнокод #24699

    −3

    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
    Вот прога на C#:
    using System;
    namespace SomeNamespace
    {
        class SomeProgram
        {
            public static void Main(string[] args)
            {
                ulong input = ulong.Parse(Console.ReadLine());
                int counter = 0;
                Console.Write(input + " ");
                while(input != 3)
                {
                    switch(input % 3) 
                    {
                        case 0:
                        input /= 3;
                        Console.Write("/ 3 = " + input + " ");
                        counter++;
                        break;
                        case 1:
                        input--;
                        Console.Write("- 1 = " + input + " ");
                        counter++;
                        break;
                        case 2:
                        input++;
                        Console.Write("+ 1 = " + input + " ");
                        counter++;
                        break;
                    }
                }
                Console.WriteLine("\n3 reached. Number of moves: " + counter);
            }
        }
    }
    А вот на питонии:
    inpt = int(input())
    counter = 0
    print(str(inpt),end=' ')
    while not (inpt==3):
        if not(inpt%3==0):
            if inpt % 3 == 1:
                inpt -= 1
                print("- 1 = "+str(inpt),end=' ')
                counter += 1
            else:
                inpt += 1
                print("+ 1 = "+str(inpt),end=' ')
                counter += 1
        else:
            inpt //= 3
            print("/ 3 = "+str(inpt),end=' ')
            counter += 1
    else:
        print("\n3 reached. Number of moves: "+str(counter),end='',flush=True)

    И вот теперь скажите что-то, почему C# лучше питона.

    Запостил: shite, 31 Августа 2018

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

    • 3/2 = 1 или 1.5 в зависиомсти от версии питона

      в C# на любой версии дотнета результат одини тот-же
      Ответить
    • Критикну:
      > not (inpt==3):
      Скопке нинужны, и ещё в Питонии есть оптератор !=

      используй elif:
      while inpt != 3:
          if inpt % 3 == 1:
              inpt -= 1
              print("- 1 = " + str(inpt), end=' ')
              counter += 1
          elif inpt % 3 == 2:
              inpt += 1
              print("+ 1 = " + str(inpt), end=' ')
              counter += 1
          else:
              inpt //= 3
              print("/ 3 = "+str(inpt), end=' ')
              counter += 1
      Ответить
    • > C# лучше питона.
      В контексте. Всегда в контексте.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Ладно:
        def g(x):
            while x != 3:
                s = str(x) + [" // 3", " - 1", " + 1"][x % 3]
                yield s
                x = eval (s)
        
        n = int(input())
        s = tuple(g(n))
        print(" = ".join(s))
        print("3 reached. Number of moves:", len(s))
        Ответить
    • генереторы:
      def g(x):
          while x != 3:
              if x % 3 == 1:
                  x -= 1
                  yield "- 1 = " + str(x)
              elif x % 3 == 2:
                  x += 1
                  yield "+ 1 = " + str(x)
              else:
                  x //= 3
                  yield "// 3 = " + str(x)
      
      n = int(input())
      s = tuple(g(n))
      print(n, " ".join(s))
      print("3 reached. Number of moves:", len(s))
      Ответить
    • go !n !i = let f = [(`quot` 3), pred, succ] !! mod i 3
                     s = [" / 3 → ", " - 1 → ", " + 1 → "] !! mod i 3
                 in if i == 3
                    then putStrLn $ "\n3 reached. Number of moves: " ++ show n
                    else putStr (s ++ show (f i)) >> go (n+1) (f i)
      main = do x <- readLn
                putStr (show x)
                go 0 x
      Ответить
      • vanished
        Ответить
        • показать все, что скрытоvanished
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • Прочёл код по-диагонали, спутал с гипотезой Коллатца. Впрочем, на тотальном языке и это-то будет паршивенько реализовывать.
            Ответить
            • ...сказал Снаут и проебал выходные:

              https://gist.github.com/k32/f2999ee884b5c7d08dfff2f594ccb3c3

              Короче дальше там всё просто, доказываем что go сходится к 3 за n шагов, далее используем этот факт для определения уже функции go, используя n как хинт для терминэйшн-чекера.
              Ответить
        • Кстати, после выхода golang как-то стрёмно стало называть воркеров go.
          Ответить
      • Это да, в тематику этого сайта:
        1) Смесь IO и чистых вычислений
        2) По сути это очень медленный интерпретатор
        Ответить
        • 1) у меня не было цели написать красиво, была цель написать просто и коротко. Я начал было с unfold в АДТ, но потом всё выкинул в угоду простоте.
          2) видишь BangPatterns? Все оптимизировано
          Ответить
      • f :: Int -> [String]
        f 3 = ["3"]
        f x = (show x) : ([" / 3 = ", " - 1 = ", " + 1 = "] !! mod x 3) : (f $ g x (mod x 3))
          where
            g :: Int -> Int -> Int
            g x 0 = quot x 3
            g x 1 = pred x
            g x 2 = succ x
        
        main = do x <- readLn
                  let s = f x
                  putStrLn $ foldl (++) "" s
                  putStrLn $ "Moves: " ++ (show $ length s)
        Бля, какое же говно этот ваш Хаски – хуй поймёшь, где ставить скопке, где функция применяется, а где она как оргумент, где сколько оргументов, ебучие приоритеты. J намного проще: выражения вычисляются справа-налево, скобки для группировки, функции либо бинарные, либо унарные, разве что с композицией глаголов можно запутаться.
        Ответить
        • > foldl
          Join за O(n^2)?
          Ответить
          • Я в первый раз в попку. А как надо?
            Ответить
          • И почему квадрате?
            Ответить
            • Название foldl и существование foldr как бы намекает, что мы получим
              ((…((s[0] ++ s[1]) ++ s[2]) ++ …) ++ s[length s - 1])
              Посчитай сколько раз ты получишь из двух строк третью за n, при том, что join должен за n скопировать сразу все строки в одну.
              Ответить
              • В какой-нибудь джаве ты в обоих случаях получаешь квадрат, независимо от того, с какой стороны делаешь свёртку.
                Рекомендую [1] для просвещения.
                [1] https://teh.id.au/posts/2017/05/10/lambdajam-slides/slides.pdf
                Ответить
                • > Рекомендую [1] для просвещения.

                  Возник вопрос: актуальна ли эта проблема и решение для Scala?
                  Ответить
                  • В отношении списков — да, ситуация аналогичная, сворачивать нужно справа налево.
                    Строки в скалке обычые, упакованные, их надо по-другому склеивать (буфером или аналогом DList).
                    По поводу йонед и коденсити точно сказать не могу — не знаю, как это в скалке выглядит и используется (лень смотреть в scalaz).
                    Ответить
    • показать все, что скрытоvanished
      Ответить
    • f =: verb define
          if. y = 3 do.
              <": 3
          else.
              select. 3 | y
              case. 0 do.
                  (' / 3 = ' ,~ ":y) ; f y % 3
              case. 1 do.
                  (' - 1 = ' ,~ ":y) ; f <:y
              case. 2 do.
                  (' + 1 = ' ,~ ":y) ; f >:y
              end.
          end.
      )
      
      g =: ((,&LF@; , ,&LF@('3 reached. Number of moves: '&,)@":@<:@#)@f)" 0
      
      echo g 3 ". stdin ''
      https://tio.run/##bZDBTsMwEETv/oqREXWsBuM2NBJugnzihPiHNl63QW0iJaVSJMSvBycgClXmtDuat6vdt75nHrnBmZotHPmyIoag0it0yJHA1Wp0BmXcIBk7OrR08Vs6UHFSIf2B7tctNiED/W/CoEjgPkRzCMSf4KaTWMOHdbc/wy/wYgq@C/Y1nJnrvcspdD6BPv1BqXLfzFhIxnbDc6Ionr082zVijEUkEjS0KfbkFF7fj1tqUHsc6zO1BmIWS8uNzYy9kdZLDs0YFfsau3A1V2hPrqwgRN8/LJGmKR611lhovdL6Cw
      Ответить
    • Какая блядь минусит все посты и каменты?
      Ответить
    • На отрицательных числах твоя программа расходится (будет нули печатать до тепловой смерти вселенной).
      просто не вводите отрицательные числа, это неуважение к разработчику
      Ответить
      • Пофиксил. Проверь.
        f = lambda x: [str(x)] if x == 0 or abs(x) == 3 else {
            0: lambda: ["%d / 3 = " % x] + f(x // 3),
            1: lambda: ["%d - 1 = " % x] + f(x - 1),
            2: lambda: ["%d + 1 = " % x] + f(x + 1),
        }[x % 3]()
        
        s = f(int(input()))
        print("".join(s))
        print("0 or 3 reached. Number of moves:", len(s) - 1)
        Кто сможет однострочник на Perl?
        Ответить

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