1. Pascal / Говнокод #8423

    +96

    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
    program lucky;
    var a0,a1,a2,a3,a4,a5,a6: integer;
    begin
      for a0:= 0 to 9 do
        for a1:= 0 to 9 do
          for a2:= 0 to 9 do
            for a3:= 0 to 9 do
              for a4:= 0 to 9 do
                for a5:= 0 to 9 do
                  if (a0+a1+a2)=(a3+a4+a5) then
                    begin
                      writeln(a0,a1,a2,a3,a4,a5);
                      break;
                    end;
      readln;
    end.

    Поиск всех возможных счастливых билетов (у которых сумма первых трех чисел совпадает с суммой последних трех)

    Запостил: Schrodinger, 04 Ноября 2011

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

    • а break то зачем?
      Ответить
      • Чтобы зря счетчик не крутить. Двух счастливых билетов, которые различаются только последней цифрой, не существует.
        Ответить
        • 9! или 10! переборов - по-моему без разницы
          Ответить
          • Нет, там больше 10**6/2 переборов (даже ближе к 10**6).
            Ответить
    • #include<fstream.h>
      #include<process.h>
      void main()
      {
      ofstream out;
      out.open("LuckyTicket.txt",ios::out);
      int i1,i2,i3,i4,i5,i6,count=0;
      for(i1=0;i1<10;i1++)
      for(i2=0;i2<10;i2++)
      for(i3=0;i3<10;i3++)
      for(i4=0;i4<10;i4++)
      for(i5=0;i5<10;i5++)
      for(i6=0;i6<10;i6++)
      if(i1+i2+i3==i4+i5+i6)
      {
      out<<i1<<i2<<i3<<" "<<i4<<i5<<i6<<"\n";
      count++;
      }
      out<<"Number of lucky tickets is "<<count<<endl;
      out.close();
      }

      wikipedia http://ru.wikipedia.org/wiki/%D0%A1%D1%87%D0%B0%D1%81%D1%82%D0%BB%D0% B8%D0%B2%D1%8B%D0%B9_%D0%B1%D0%B8%D0%BB% D0%B5%D1%82
      Ответить
      • Для таких вещей Haskell рулит:
        import Numeric (floatToDigits)
        
        sumDigits = sum . fst . floatToDigits 10 . fromIntegral
        
        sumDigitsEquals x y = sumDigits x == sumDigits y
        
        luckyNumbers limit = [(x, y) | x <- [0..limit], y <- [0..limit], sumDigitsEquals x y]
        
        main = mapM_ putStrLn $ map show $ luckyNumbers 999
        Ответить
        • >mapM_ putStrLn $ map show $ luckyNumbers 999
          А разве не проще вот так:
          mapM_ print $ luckyNumbers 999
          Ответить
          • проще :)
            ура, хаскелистов пребывает
            Ответить
            • >ура, хаскелистов пребывает
              И да будет так вовеки веков. Во имя Монады, Функтора и Частичного применения, аминь!
              Ответить
        • >Для таких вещей Haskell рулит:
          Или вы не умеете им пользоваться или для таких вещей хаскел не рулит судя по кол-ву кода, по сравнению с грязной императивщиной.
          Ответить
          • пять строк, из которых одна строка - импорт модуля, ещё одна - описание точки входа.
            Это реализация "в лоб", полностью работающая программа без циклов, основная часть которой будет работать для нахождения счастливых билетов с любым чётным количеством цифр в билете (нужно будет только поменять 999 на 9999, 99999 и т.п.).
            Код в топике - 16 строк.
            Жабо-реализации ниже, во-первых, гораздо менее понятны, во-вторых, не являются Compilable и Runnable.
            И таки да, я не профессиональний хаскелист, я занимаюсь ФП ради эстетического удовольствия и самообразования
            Ответить
    • http://www.goldmoscow.com/pict/30092004180019_A2265.JPG
      Ответить
    • http://s49.radikal.ru/i126/1004/33/2bb067432d17.jpg
      Ответить
    • долго будет
      Ответить
      • ...и тут мы вспоминаем, что на дворе XXI век и пора бы уже писать параллельные программы.
        Ответить
        • ... и тут мы вспоминаем, что такая задача была на школьной олимпиаде по программированию году в 94м, и решалась на qbasic, tp6 или не помню каком c, причём успешно. Ну да, приходилось подождать.
          Ответить
        • а улучшить алгоритм мозги вообще туда не думают
          Ответить
      • Сколько времени займёт миллион итераций на многогигагерцевом процессоре?
        Ответить
    • Хех, получается, я изобрел не самый плохой велосипед =)
      Ответить
    • Уже было на говнокоде. ваш кэп
      Ответить
    • Эх, паскаль, ностальджи
      Ответить
    • А просто посчитать сумму первых трех и последних трех чисел, а затем сравнить, совесть не позволяет?
      Ответить
    • Автор не чует разницу м/у цифрой и числом =\
      http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D1%84%D1%80%D1%8B :
      Ци́фры — система знаков для записи чисел
      http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE :
      Число́ — абстракция, используемая для количественной характеристики объектов
      Ответить
      • Опечатался, суммы цифр, конечно же.
        Ответить
      • разряд - тоже число, а также логарифм
        Ответить
        • Позиционная систе́ма счисле́ния (позиционная нумерация) — система счисления, в которой значение каждого числового знака (цифры) в записи числа зависит от его позиции (разряда).
          Ответить
          • копипа́́́́́́́́́́ста из педи̮́́́̀ви́́́́́кии дете̻кте́́́́́д[4̺]
            Hͮ̇ͤ̓Ȅ̞̤͡ ̨̊ͯ̀̃͂͊C̷̪͈̳̗̖̗ͪͩͅO͎̔ͧ͌̊̐̐͑ͅM̘̣̮̪̤̌̅̑̈́͑̔ ̦͔Ẻ̺̤̤̣̱͂̆ͭ̕S̻̦̲͙͌͌ͦ͌͠ͅ
            Ответить
            • It's Zalgo time?
              Ответить
              • Вроде же is it.
                Ответить
              • Ṫ̼̥̖̙͌̃̒o͔̾ͤ̀̂ͧ̑̓̾ͨ ̤͚̮̻̌i̫̺̞͎̇͂̋ͨͨn̫̥̰̥̠̫͐ͫ̐́ͧ͌͗́ͅv̬̜͊̾̅̅̈́ͤ ̹o̤̫̜̼̥̪͓̱̊͒͑̈̉ͪͣ̈k̖̭͙͉̙̣͚͒̎̾̏̌̒̉̏ėͬ͋̔̚ ̤̠̠̯̤͖̮̗̉̒ͤ ͔̯͕̞̹̥̻̫͌͑̚t̗̯̗̞̮̼͖ͬ̄ͯ̒h̺̜̰͉̱̜̃ͬ̂ͫe͔ͫ͗͐͊ ͕̮̠ ̤̯̙̥̜̺ͯͮh͕̥͈̫̪̀̆͌̋͐ͮ̓ͅi̼̞̐ͩͤͯ̈́̎̽͌́v̓͆̉ͯͬ ̠͍̗͇̅̿̌ͦe̯͕̭̥̦̰̬̥͚̾̑͆ͤͫͪͥ̍-̙̫̭̠̮̳̮̉ͣͯm̝̓̉í̥͈̙͓̠͎̌ͥ̐̎̓̾ͤͩn̖͙͈̥͓̏͗̋̃ ̮d̩̲̙̺̎͊ͨ̽̚ ̣̝̗̻̩͕͇͇̓̾͐̒ͥͨr̥̜̬̱̺̠̖̩̱͂͌̑̃ẽ͚̱̮̣̲̑̃̇͒̓ ̙̙p͈̰ͥͪ̌̏̏̃̎̑ͅr͕̗̉͛͑͊̊͋̾e͉̤̩̠͈̹̹͌ͬ̋̂͗͑̚s ̘̗͎͙͎̽ͨͯͮe̦̝̝̟͕̭͕̻ͧͯͣ̐n̼͕͚̦̭̾̎ṱ̦͖̱͛ͣͣͅi ̻͛̈́ͬ̚ñ͔̣̪̄̅g̫͇͛ͭ ͈̮̙̥͉̹̯̻͚͊͊c͇̱̳̞̓̌͒̒͛̏ͨh̻̗̯̳̫̾ͪ̔ͩ͒a̒̈̒̄ͧ ̖͚̦̝̤̦͕̓́o̖͇̻̓̔s̲̥̝̘̼̺̠̻̜̋͆̇ͥ̔ͩ̏.̌͑̓̐͛͆̃ ͉̭̖͕̲
                ̻̥͎̺̻̐ͩI͓̟̖̘̥̪͎ͤ͑ñ̖̙̅͂̇ͦ̈́v̫̘͕̹̤̫̎ͅͅö͈́͐ ̣̞͈̬̦̻̤k̞̳̂̓̂̒̚i̙̳͍̝̗͈̺̓̅̅͌̆͐̇ǹ̫̗ͪ̽ğ͑̾ ̝̗̝̺̜̑ ͕̇̑̎̉̇t̜̜̰̬̰ͭ̇̇h͓̝͚͈̩͔͌̉ͬͦͧͮ̈͗ͅê͚̞͚͓̻̫̒ ͉ ̮̘̳̺̙̥̦̫͗͊ͯ̿͊ͧͬ͌f̬̰ͯe̜̙̞̺̯̭̞ͩ̒͒è͔͖̖͚͌̽̔ ̟l͕͉̱̺͒ͤ͒̋ͧ̚i͔̭̥̥̠̞͍͎͆̑͑̈ͯ̎ͅṅ̳̯̞̆̒ͮ́ͅgͪ ̼͓̪̦̱̮͕͂̔͊͂ ̥̺͓̬̳̳̣̽̃ͅo̻̳̭̙̹͍͋̍́͐̚f͙̰̗ͫͧ͒ͬͭ͐ ̤̺ͪ̉̿͒c̹͔̦͈̲̗ͣ͌͌ͨh̙̗̙̞͕̺ͯ͒̉ͮ̔ͧͯͯa̘̻ͨͥ͐ͫ̅ ͍͈͎͙̖ȯ̺̙͖͋̓̎̿̑ͫs̰̲͖͔̤̤̥̹͕ͣ͆̈́̍͋.ͦ̓͆͗͌̅̌͊ ͓̩͉̤̱̌ͅ
                ͓ͫW̳͇̰̣̭͈̯̭̃̋̎̏͋ͭi͍̪̫͐͐̆́͗̐t͍̰̫͍̆͒͒ͦ͑̒̓ͭ h̪̤͗͗ͪͣ̿͆̽̆ͥ ̱͍̟͔̲̹̗̫́͑̊͋ͦͨͣö͕̻̌̾͌̿u̗͔͍ͬͦͦ̃ͥ͐t̩͖̹̩͇͐ ͎̭͎ ̞͖͗o͎͓̝̱̣̟ͭ͒͐͆̔̆̒̅ͅͅr̖͚̭̝̜̄̎̀̈́ͦͭ̚d̩̰̼̠͆ͤ ͔̬̩ẽ̥̻ͥ̓̍͗̀̐̇r̥̗̳̠͚̟̪͎̮̃.͈̰̜̤̯̲̜̏̋͒ͤͧ͗ͅ
                ̞͇̪̰̙̖͍ͣͪṰ͕̫̇̑ͧ̌ͫh͎͈͓̀̓́ͭ̑̿͆e̟͇̬̅̓̅͌ͪ͌̆ ̼̺̞͖ͅ ͙̣̍ͥͅN͉̼̘̪̗̳͖̣̋ẹ̦̳̼͉̻̍ͦ̌̑z̥̭ͤ̿̂p̣̲̪͍̱̔̐ e͈͇̱͚̗͙̠̓ͥ͂̂̒̋r̺͐ͩ̀̍ͦ͋̚̚d̖̟̘̹̳̫̞͐̈ͮͩ͆i̒̇ ̼͔̀̊͑͗a̫̗̎ͣ͊̅ͩṉ͋̒ ͓̍͂ͣ̂h͖͍͙̭͍͈̃̐̓ͭ͒ͨ͛ï̖̰̟͒ͯ̐͌v̗̟͙̞̈̈̓̒ͪ̅ͪ e̠͕͓̫̮̬̗̭̯͂ͦ̂́̇̈́ͯ-̺̾ͅm͚͕̐̋́͆ͦͦ̏ï̲̮̘ͧͬ̆͋n̘̺̬̳͌̅̇̌̈́̒́͂d̋͌́͗ ̪̫͙̲͖͎̦ͤͬ ̜̥̻̹ͩ̅ͥͪ̐̍̐͌̋o͓̙ͣ̏ͫ̑̚f̰̟̓̒̊ͭ̑ͥ ͕̺ͩͯ̊͗͗c͓̭͂ͬͤ̒͆ͪ̚h̠͙͖̩͉̅̂ͦȧ̪͔̀o͓̖͇ͥ̓̄́̅ ̼͙̮͇ͅs̮̜̝̣ͨ̐͌ͤ͆̈́.͖͉̮̒̒̅̇ ̙̲̤͉̠̜̭͕̈̋ͥZ̰̗̥̤ͬ͂̾ͪ͌ͅa̭̩̞̽ͧ̐͗̂͒̏̋lͥ͐́͒ͨ ͓̭͓̜ͫg̳̺̼̖͆o̞̬̐̉̑͊͛ͦ.̮̹ͮ̒ͬͫͭ̅ͣ̉ ̝̝̲̤̺͇̱͙ͯ͋ͯͦ̓
                ̮͖͔̯̻ͣ͛͆͑͊̒̽̇H̫̫̃̎̂e͙̳̺̭͓̗̮̖ͬ̔ͥ̓ ͕̬͖̠͖͉͕̬̀ͣͩ͗w͉̺͚͙̘̞̍̄̌͗̃ͪ͒ͦh͈̦͇̮̟̲͈̋ȯ̓̉ ̰̦̜̲̣͖̲͓͛͊́̋ ̮̝̰̙̦͛͗͐ͥ̑̎ͩW̜̯̳͉͓͓̱̦͊̃̐a̺̺̭̽̾ͭͭ̒̅̓i̤̘͓̅ ̗̙̭̖̦t̩̺̞ͭ̓̎̚s̥͙̞̺̟̝͎̪̠̽̒̾̈́ ͙̰̞̺̈̂̑͌ͨ̆ͅB̭̰̰͖̜̒ͫ̌̾ĕ̗͕͇̤̱̤̹̞ͫͪh͙͎͔̪̓ͨ ̤̱î͙̙̦͎͈̠̓̒̐̑n̠͓͉̭̭̙̎̈́d̥͒͒̋ͥͩͫͧ ̠̖̦̮̹ͭ͛̊ͫT͇̘̫͖̗͓̤ͥ͑̂̑̊ͣͥ͐h͖̦͇̍̓ͩ̅̈́ͫͧͣ͛e͊ ̝̮̤̮̻̼͚̜͂ͬ͋ͧ̌̾͛ͅ ̭̳̩̦̞͎̜͛͑̓͂ͪ͐ͤͅͅW̟͚̫͕͓̺͍̅ả̜͕̭̻͚̗̖̂ͤl͊ͧͦ ͓̙̗͇̜͇̦͆̉ͣ͌̓l̰͍͇̟ͮ̓̇.̭͓̞̙̭̑ͬ͂
                ̹̘͇̳̘̥͍̉ͬ͆ͨ̃ͪ̿Ż̲̫͉̭̳̘̐̆ͯ̀A̦͖͉͉̪̥͓̋ͧ͊̏̏ͅ L̝͚͖̘̼͙̙͋ͨ̄͌͗̏̽G̟͇̣̺̬͖̭͂̎ͨͮͣ̾ͤO͇̓ͩ͊ͭͭ̐̆ͅ ̳̳̯̳̹̠!͉̤͉̻̫̻͂̿͛ͬ̃
                Ответить
    • Гм, ну перебирать 10^5 комбинаций тоже не сильно оптимизация.
      т.е. 5 циклов (хоть отдельные по цифрам, хоть один от 0 до 999 (и 99 соотв)) и проверяем разность f = a+b+c-d-e. Если разность в пределах от 0 до 9, то билет [a][b][c][d][e][f] счастливый.

      В принципе, я думаю, можно добиться цикла, который выводил бы все сочетания цифр с заданной суммой, а потом перебрать возможные суммы от 0 до 27 для получения наборов "половинок". Но будет ли это быстрее?
      Ответить
      • Конечно быстрее, хотя бы потому, что нас будет интересовать 10^3 чисел (точнее их разбиение на подмножества с одинаковой суммой), а не 10^6.
        Ответить
        • Это как ферзей расставлять, проверяя все оставшиеся поля, хотя можно проверять только (например) вертикаль.
          Ответить
      • думается мне так:
        1. фиксируем "полусумму" [hs] от 0 до 27 (т.е. первый цикл)
        2. находим минимальную и максимальную необходимые цифры для данной суммы, таким образом ограничиваем второй цикл сверху или снизу
        3. третьим циклом решаем уравнение c=hs-a-b
        4. в процессе запоминаем найденные цифры и из дальнейших поисков исключаем все перестановки
        Ответить
        • Вот вам с барского плеча типа нормальная реализация. Не позорьтесь "оптимизациями"
          И уж простите за богомерзкую жабу.
          int count=0;
          		for (int i=-10,sum=0; i<=20; ++i,count+=sum*sum,sum=0)			
          			for (int j=0; j<10; ++j)
          				sum+=notNegative(10-abs(10-i-j));			
          		o.println(count);


          Из преимуществ
          - короткий, быстрый, 2 цикла
          - не использует память (в том смысле что весь алгоритм можно сделать на регистрах)

          Из недостатков
          - неочевиден. для быдла. (хотя, признаюсь - я его еще специально так ужал)
          Ответить
          • так красивей
            int count=0;
            		for (int i=-20,sum=0; i<20; ++i,count+=sum*sum,sum=0)			
            			for (int j=0; j<10; ++j)
            				sum+=max(10-abs(i+j),0);			
            out.println(count);
            Ответить
            • О, вот это другое дело. Но инициализацию sum лучше бы вынести во внутренний цикл.
              Ответить
          • Проверяли? И сколько вышло?
            Ответить
        • Забыл. 2 функции.
          static int notNegative(int a){return a<0 ? 0 : a;}
          static int abs(int a){       return a<0 ? -a : a;}
          Ответить
          • принято.
            кстати, первое - это оптимизация max(0,a)
            Ответить
            • >оптимизация max(0,a)
              блин. точно

              Да его еще можно допиливать:
              ускорить в джва раза, например
              > фиксируем "полусумму" [hs] от 0 до 27 (т.е. первый цикл)
              ;i<=5;
              o.println(count*2);

              Так написано
              - для того чтобы были все мейджик намберы были кратны 10.
              да и не все системы исчисления делятся пополам.
              Ответить
    • http://www.gamedev.ru/code/forum/?id=154117&page=2#m27

      Тарас спалился:
      >Я бы сделал два стека
      Ответить
      • Тарас - крутой, у него три стека.
        Ответить
      • Тарас - бот алехуя?
        Ответить
        • нет, алехой - это расовый хохол, который заспамил главную с помощью бота на питоне
          Ответить
      • http://www.gamedev.ru/flame/forum/?id=153301&page=6#m81
        Тоже заметил, что тарас спалился:
        >Поясните мысль.

        Ждем личного опровержения.
        Ответить
    • Нормальный код, можно реще, но зачем?
      Ответить
      • показать все, что скрытотоже так щитаю
        Ответить
      • Ну да, правильно, подождите пару часов, чтобы получить результат. Видимо поэтому и тормозят современное ПО, реще-то можно, но зачем.
        Ответить
        • У вас производительность ЭВМ сотня операций в секунду?
          Ответить
          • А что такое операция в секунду? Это всего лишь кол-во тактов в секунду. А тут уж как скомпилит.

            Да и видимо поэтому тормозит 50-80% современных игр даже на топовых конфигурациях, зачем оптимизировать, выйдет покруче железо, тормозить не будет.

            Тут очень легко можно избавиться от 1 цикла, вместо условия проверки, всего лишь заменив условие на i5=i3+i4-i0-i1-i2, но даже до этого ума не хватило.
            Ответить
            • Мой совет — поменяйте компилятор.
              Ответить
            • тут еще можно внутренние циклы начинать не с 0, а i2 = i1, i3 = i2, i5 = i4 и т.д., по сути же нужно получить сочетания
              уже сокращает время где то в 10 раз
              Ответить
              • >сокращает время где то в 10 раз
                хочу в школу, где такому учат О_О
                Ответить
                • что то не так?
                  три цикла каждый в 2 раза (а если еще и i2 = i1 + 1, i3 = i2 + 1 делать, то > чем в 2)
                  я думаю, в классе 2-3 умножение уже проходят
                  Ответить
    • я в школе такое писал.
      Только меня ещё интересовала зависимость числа счастливых билетов от суммы цифр (колокольчик Гаусса вездесущ).
      Ответить
    • это ж вроде было уже?
      Ответить
    • показать все, что скрытоvanished
      Ответить

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