• Логика игры "Пятнашки" на Python?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Надо, чтобы "четность" перестановки совпадала с четностью финального поля (1).
    Занумеруйте все 16 позиций слева направо сверху вниз.
    чтобы подсчитать четность, рассматривайте каждую пару заполненных позиций (15\*14/2=105 пар) - если числа идут не в том порядке (большее число на позиции с меньшим номером) - то прибавьте 1 к ответу. В конце возьмите ответ по модулю 2. Это и будет четность перестановки.

    Чтобы получить поле, которое можно собрать, сгенерируйте любую перестановку (случайно перемешайте 15 чисел), а потом посчитайте ee четность. Если четность плохая, то поменйте местами любые 2 соседних элемента (выберите случайно, или меняйте первые 2 всегда - на вероятности всех возможных полей это не влияет).

    Edit: Но вы это почти все итак знатете, ибо функция is_solvable в вашем коде как раз инверсии уже считает.
    Значит, Но вы знаете, что плохое поле от хорошего отличается лишь четностью, значит, если поле плохое - меняйте местами 2 соседних по порядку элемента. Например верхний левый со вторым в верхней строке.
    Ответ написан
    Комментировать
  • Как отключить бесконечный редирект?

    После применения Rewrite, файл открывается заново с новым URL (подмененным), нужно сделать так, чтобы результат с измененным URL не попадал под правило замены.
    Ответ написан
    Комментировать
  • Объясните плиз, что тут eval(base64_decode())?

    @d-stream
    Готовые решения - не подаю, но...
    Если вкратце - то "удаление всего". На мой взгляд стоит побить разработчика, желательно ногами.
    Ответ написан
    2 комментария
  • Объясните плиз, что тут eval(base64_decode())?

    @Programmir
    Я только помню, что eval is evil
    Ответ написан
    Комментировать
  • Как посмотреть как работает (под капотом) приложение на windows?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    скачать программу и там будет все видно =)


    все так, вот программа
    Ответ написан
    Комментировать
  • Какой почтовый клиент посоветуете для 500 ящиков?

    zamboga
    @zamboga
    Аналитика данных, BI-аналитика, дашборды
    Можно ставить форвард с ваших 500 ящиков на отдельный специальный, и уже там обычными правилами раскидывать письма по папкам и категориям.
    Ответ написан
    Комментировать
  • Знаете ли вы программистов которые в одиночку создали крутой проект?

    @asd111
    Google - два парня Сергей Брин и Ларри Пейдж
    Facebook - начал Марк Цукерберг
    Instagram - два парня, один делал приложение для iPhone, другой делал сайт, потом заработали расширились
    MsDOS - первую версию сделал один человек, потом Баллмер у него купил за 50 000 $ и права перешли Microsoft
    Nginx - начал Игорь Сысоев
    Компьютер Apple I - дело рук Стива Возняка
    Linux - начал Линус Торвальдс
    Git - начал Линус торвальдс
    Redis - Salvatore Sanfilippo ( antirez )
    Minecraft - начал Маркус Перссон ( также известный как notch )
    Dropbox - начал Дрю Хьюстон
    Shadertoy - создан Iñigo Quilez ( также известен как iq )
    C++ - начал Бьёрн Страуструп
    Python - Гвидо ван Россум
    PHP - Расмус Лердорф

    SimplaCMS - начал один человек
    DLE CMS - начал один человек
    TYPO3 CMS - начал один человек

    P.S. ответ редактировался и дополнялся
    Ответ написан
    20 комментариев
  • Как убедить начальство отказаться от велосипедов?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Не волнуйтесь, вас уволят и правильно сделают. И вот почему.
    Начну со стороны хорошего бизнесмена:
    У него уже есть cms и crm, которую он пилил 5 лет, умеет продавать и знает. Да, так получилось, свой велосипед, ужасно написанный, но это его не волнует до тех пор, пока она кормит и его и всех его подопечных. Отказаться от неё означает не только огромные временные затраты на смену всего, начиная от обучения программистов как её пилить, заканчивая обучением всех, кто будет её касаться. Так же это означает поддержка уже двух систем, старых клиентов со старой и новых с новой. Но самое главное - это высокий риск того, что продавать её будет тяжелее.

    Со стороны хорошего разработчика:
    А хорошему разработчику вообще до фени, с чем ему работать. Спросите у опытных. Эмоционировать при виде говнокода и велосипедов - это максимализм юного программиста. Разработчики с опытом умеют погружаться в любой велосипед, в любой говнокод и работать с ним. А потому что они уже навидались и в своё время тоже кричали и пытались перевернуть мир, но, кому это надо? Вы - наёмный работник, вы не должны писать красивый код, вы должны решать бизнес задачи. Бывалые так и делают, просто иногда про себя вздыхая, т.к. чувство прекрасного всё же не убить :)
    Ответ написан
    18 комментариев
  • Как убедить начальство отказаться от велосипедов?

    Matvey-Kuk
    @Matvey-Kuk
    Разработчик в Cisco, CA.
    Уходить.
    Ответ написан
    Комментировать
  • Предлагают взломать сайт конкруентов, что можно сделать в данном случае?

    gospodinmir
    @gospodinmir
    Security analyst
    Предлагают = можно отказаться.
    Ответ написан
    Комментировать
  • Предлагают взломать сайт конкруентов, что можно сделать в данном случае?

    @other_letter
    Очень сложно ответить, честно. Как полагаю, живёте Вы в России?
    Писать в спортлото без толку. Никому лучше от этого не будет, а вероятность, что Вас сольют Вашему же шефу - весьма высока. Кто там что будет говорить - выслушаю, но не поверю.
    Сейчас тут жизнь такова, что у всякого есть "знакомый фээсбэшник", который как раз и строчит такие запросы и уж он-то узнает, кто написал жалобу. Если шеф раньше не догадается.

    Потому советую жалоб не писать.

    Теперь с другой стороны. Кто просит? Непосредственный начальник? Есть возможность обсудить это с его начальником? Вот это может быть подейственнее, но тоже может аукнуться.

    Сказать что не умеете никак?

    Ну и как вариант, чтобы и волки и овцы... Взломайте и честно напишите конкурентам что да как. По мне так самый рабочий вариант:
    1. Начальник будет доволен
    2. Вы покажете себя перед ним молодцом
    3. Не сотворите бяку особенную
    4. Будете рыцарем хоть и в испачканных, но белых доспехах
    5. Вдруг конкурент ещё денег предложит? За исправление косяков
    ...а после исправления косяков начальнику можно и на непробиваемую броню пожаловаться. Мол, больше никак...
    Ответ написан
    Комментировать
  • Предлагают взломать сайт конкруентов, что можно сделать в данном случае?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Отказаться.
    Ответ написан
    Комментировать
  • Предлагают взломать сайт конкруентов, что можно сделать в данном случае?

    mace-ftl
    @mace-ftl
    Коротко - всем НАСРАТЬ (простите, но это самое точное слово)

    1) Жаловался на педофильский сайт (ещё раз прошу прощения) в РКН - пофигу
    2) Вышел на контакты прямые торгующих по РФ спайсами - ноль эмоций у всех
    3) Обычные дела не будут открывать если на 100% не уверены что получать "палку" в статистику себе

    и т.п....
    Ответ написан
    Комментировать
  • Почему при tcp соединении постоянно приходит "мусор"?

    Neuroware
    @Neuroware
    Программист в свободное от работы время
    Можно читать данные пока они есть, столько сколько их есть, не обязательно знать их длину. Рабочий пример (не для консоли, но сути не меняет)
    Сервер
    namespace TCP_Server
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                MethodInvoker mi = new MethodInvoker(delegate
                {
                    int port = 999; //взяли порт из файла
                    TcpListener l = new TcpListener(port); //и на нем у нас висит сервер
                    l.Start(); //запущен
                    while (true)
                    {
                        TcpClient cl = l.AcceptTcpClient();
                        Connection c = new Connection();
                        c.cl = cl;
                        Thread t = new Thread(new ThreadStart(c.Work));
                        t.IsBackground = false;
                        t.Start();
                    }
                });
                mi.BeginInvoke(null, null);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            public class Connection
            {
                public TcpClient cl;
                public void Work()
                {
                    NetworkStream NWS = cl.GetStream();
                    //BinaryReader R = new BinaryReader(NWS); //принятие
                    //BinaryWriter W = new BinaryWriter(NWS); //отправка
                    if (NWS.CanRead)
                    {
                        StringBuilder fullServerReply = new StringBuilder();
                        byte[] readBuffer = new byte[cl.ReceiveBufferSize];
                        int numberOfBytesRead = 0;
                        do
                        {
                            numberOfBytesRead = NWS.Read(readBuffer, 0, readBuffer.Length);
                            fullServerReply.AppendFormat("{0}", Encoding.UTF8.GetString(readBuffer, 0, cl.ReceiveBufferSize));
                        } while (NWS.DataAvailable);
                        var s = fullServerReply.ToString();
                        Console.WriteLine(s); // тут твои данные
                    }
                }
            }
        }
    }


    Клиент

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace TCP_Client
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public int port = 999; //умолчание
            public string adres = "127.0.0.1"; //умолчание
            NetworkStream NWS;
            BinaryReader R;
            BinaryWriter W;
            private void Form1_Load(object sender, EventArgs e)
            {
                reg();
            }
    
            private void reg()
            {
                //создадим сокетное подключение для общения с сервером
                TcpClient client = new TcpClient(adres, port); //IP адрес сервера и порт на котором он висит
                NWS = client.GetStream();
                R = new BinaryReader(NWS); //поток для принятия данных
                W = new BinaryWriter(NWS); //поток для отправки данных
    
                //ну и тут ваше что-то
            }
    
            static byte[] GetBytes(string str)
            {
                byte[] bytes = new byte[str.Length * sizeof(char)];
                System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
                return bytes;
            }
    
            static string GetString(byte[] bytes)
            {
                char[] chars = new char[bytes.Length / sizeof(char)];
                System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
                return new string(chars);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                reg();
                W.Write(textBox1.Text);
                NWS.Flush();
            }
        }
    }


    Данные можно было бы упаковать в класс вместе с чек суммой и отправлять после сериализации, одновременно можно их еще и сжать (чтобы меньше пришлось передавать), вот пример реализации сериализации со сжатием:
    string FileName = "Signes.db";
            public void Save()
            {
                //Сохраняем резервную копию
                if (File.Exists(FileName))
                {
                    File.Copy(FileName, FileName + DateTime.Now.ToShortDateString() + ".bak", true);
                }
                BinaryFormatter bf = new BinaryFormatter();
                //откроем поток для записи в файл
                using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
                using (GZipStream gz = new GZipStream(fs, CompressionMode.Compress, false))
                {
                    bf.Serialize(gz, Signes);//сериализация
                }
            }
            public void Load()
            {
                if (!File.Exists(FileName))
                {
                    Signes = new List<BaseSign>(); //указать тип нового объекта
                    Save();
                }
                BinaryFormatter bf = new BinaryFormatter();
                using (FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                using (GZipStream gz = new GZipStream(fs, CompressionMode.Decompress, false))
                {
                    Signes = (List<BaseSign>)bf.Deserialize(gz); //указать тип объекта
                }
            }
    Ответ написан
    5 комментариев
  • Почему полиморфизм так работает?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Объяснить суть полиморфизма "на пальцах" довольно просто. Представьте себе класс Телефон. Его спроектировал некто в далеких 80-х, и определил в нем метод набратьНомер(). А потом другой программист в 90-х отнаследовал от него класс МобильныйТелефон и перекрыл метод набратьНомер(), т.к. грубо говоря, в новом устройстве набор производится уже не импульсно, а тонально. А потом третий программист отнаследовал от него класс Смартфон. При этом он не стал трогать метод набратьНомер(), а просто добавил методы для нового функционала, типа определитьПоложениеПоGPS() и т.д.

    Теперь представьте себе пользователя. Он родом из 80-х и понятия не имеет о тональном наборе и GPS... но если ему в руки дать любое из этих устройств, он сможет набрать номер и сделать звонок. Почему? Потому, что он умеет использовать метод набратьНомер(), и большего ему знать не нужно.

    А теперь представьте другого пользователя, нашего современника. Он вырос в эпоху смартфонов... но если ему в руки дать старый телефонный аппарат, он тоже сможет сделать звонок, т.к., опять же, знает метод набратьНомер().

    Применительно к ООП, пользователь - это переменная, содержащая ссылку на экземпляр класса. Ее тип (как она была объявлена) - это "набор знаний" о возможностях этого экземпляра. И т.к. Смартфон в своей основе является Телефон-ом, мы вполне можем дать его в руки гипотетическому пользователю из 80-х:
    Телефон устройство = new Смартфон();
    в результате чего он сможет сделать звонок:
    устройство.набратьНомер("03");
    А вот определить свое местоположение он не сможет, пока не узнает о существовании соотв. метода:
    Смартфон усовершенствованноеУстройство = (Смартфон)устройство;

    Это называется приведением типа. В данном примере у экземпляра класса уже был соотв. метод, но чтоб им воспользоваться, нужно сначала явно указать, что мы хотим рассматривать имеющееся у нас в руках устройство не как "простой" Телефон, а как Смартфон.

    P.S. Кстати, в этом примере мы затронули не только полиморфизм, но и наследование, и инкапсуляцию (пользователя "снаружи" совершенно не интересует, как именно производится набор номера - тонально, импульсно или еще как-то иначе)... так сказать, все три кита ООП в одном флаконе. И только так вообще имеет смысл рассматривать эти принципы, т.к. они по сути неотделимы друг от друга, как Отец, Сын и Святой Дух в Христианстве или же длина, ширина и высота в трехмерном пространстве :) Если это понять, ООП становится совершенно простой и естественной парадигмой программирования.
    Ответ написан
    8 комментариев
  • Как реализовать связь многие-ко-многим для одной и той же таблицы?

    В смысле? Вывести всех дочерних, у которых родитель равно id родителя, вот тебе и связь "родителя" с "дочерьми"???
    SELECT  * FROM `category` WHERE `parent_id`='какому то id'


    UPDATE::
    Для связи много ко многим, создать еще одну таблицу. В котором будут поля `родитель` и `ребенок`.
    Вывести всех дочерних по id родителя:
    SELECT `child` FROM `parent_child` WHERE `parent` = 'чему_то'

    Вывести всех родителей по id ребенка:
    SELECT `parent` FROM `parent_child` WHERE `child` = 'чему_то'


    Естественно в таблице должно быть поле `id` для удобной манипуляции с ней.
    Ответ написан
    3 комментария
  • Почему браузер во время разработки не обновляет измененные стили?

    @mayorovp
    Не слушайте тех, кто говорит про настройку браузера. Если такая проблема достает вас во время разработки - она же проявится и у посетителей при первом же обновлении сайта.

    Наиболее перспективным подходом у управлению кешированием ресурсов является добавление номера версии в URL. В качестве номера версии можно взять хеш-сумму от файла или дату его последней модификации. После того, как вы добавити номера версий во все URL - можно настраивать неограниченное кеширование ресурсов заголовками сервера и радовать посетителей быстрой загрузкой.

    Ну а если нет желания настраивать версии - то просто запретите серверу отдавать заголовок Expires. Грузиться будет медленнее - зато никаких больше "почистите кеш браузера, чтобы увидеть изменения на сайте".
    Ответ написан
    4 комментария
  • Почему браузер во время разработки не обновляет измененные стили?

    gluck59
    @gluck59
    Виртуальный глюк
    Слишком агрессивный кэш.
    На сервере отключите его совсем, в браузере сделайте так,как в первом комментарии.
    Ответ написан
    Комментировать
  • Почему браузер во время разработки не обновляет измененные стили?

    @ar2rsoft
    PHP-developer
    Как вариант обновлять комбинацией клавиш Ctrl+F5
    Ответ написан
    Комментировать