1. Си / Говнокод #24840

    −2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    #include <stdio.h>
    #include <math.h>
    char s[6];
    main(){
    	puts(gets(s)[2]==45&8u>*s-65&8u>s[1]-49&8u>s[3]-65&8u>s[4]-49?abs((*s-s[3])*(s[1]-s[4]))-2?"NO":"YES":"ERROR");
    }

    Запостил: 666_N33D135, 01 Октября 2018

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

    • Определение, верный ли ход конем )
      Ответить
    • Аналог nanochess пилишь?
      Ответить
    • Я многого прошу?
      Ответить
      • Прости, я на "PHP", так не смогу )
        Ответить
      • <?php $s=unpack(@C5,fgets(STDIN));echo $s[3]==45&8>$s[1]-65&8>$s[2]-49&8>$s[4]-65&8>$s[5]-49?abs(($s[1]-$s[4])*($s[2]-$s[5]))[email protected]:@YES:@ERROR;


        Кое-что я всё-таки не осилил: в оригинальном коде использовалась константа 8u, чтобы перевести числа в беззнаковые и два условия (типа s[1]-49>0 и s[1]-49<8) уложить в одно. Если придумаю, как это сделать на "PHP", допишу.
        Ответить
        • P.S. >=0, а не >0, конечно же.
          Ответить
          • Разность должна попасть в интервал [0..7]. Значит, должны быть установлены только три бита, т. е. после сдвига вправо на три должны получить ноль. Как-то так:
            ($s[3]!=45)+($s[1]-65)>>3+($s[2]-49)>>3+($s[4]-65)>>3+($s[5]-49)>>3==0
            Ответить
            • Итого:
              <?php $s=unpack(@C5,fgets(STDIN));echo ($s[3]!=45)+($s[1]-65)>>3+($s[2]-49)>>3+($s[4]-65)>>3+($s[5]-49)>>[email protected]:(abs(($s[1]-$s[4])*($s[2]-$s[5]))[email protected]:@YES);

              Что-то длинно. Не знаю, как сократить.
              Ответить
              • идея: собачку вынести за скобки
                Ответить
                • Вместо трёх собачек будет собачка и две скобки.
                  Первую (которая у константы C5) мы не можем вынести, потому что она в другом выражении.

                  Кстати, можно убрать пробел после echo, раз уж поставили скобку.
                  Ответить
              • У тебя проверка работает неправильно, для A0-G9 должно выдать ERROR, а твой код выдаёт NO.
                Ответить
                • Точно! -1 + 1 = 0. Нужно плюсы заменить на |.
                  Ответить
        • Расшифровка некоторых трюков:
          1. @C5, @NO, @YES, @ERROR —— компактная запись констант (вместо 'C5', 'NO', 'YES', 'ERROR'), основанная на том, что все необъявленные константы в "PHP" равны их имени (а @ используется для подавления вывода Notice о необъявленной константе).

          2. unpack('C5', строка) преобразует строку в массив пяти беззнаковых байтов (unsigned char в Си). В принципе, можно было написа́ть unpack('C*',fgets(STDIN)), чтобы не уточнять количество элементов.
          Ответить
        • > @NO:@YES:@ERROR

          лооооол )))
          Ответить
          • Зато на три символа короче, чем 'NO':'YES':'ERROR'.
            Ответить
        • а если define('s',fgets(STDIN)) сделать, доллары можно будет убрать?
          Ответить
          • Нет. Мы работаем не с символами, а с числами. Для этого нужно либо каждый раз писать ord (например, ord($s[1])), либо выполнить unpack. Но "PHP" не хочет присваивать константам массивы, он хочет либо скалярное значение, либо строку.
            Ответить
        • Я непонил, в пхп массивы с единицы штоль нумееруются?
          Ответить
          • Нет с нуля. Просто так работает функция unpack для строки.
            Ответить
            • И для чего нужна эта её особенность?
              Ответить
              • Для совместимости с Паскалем, в котором символы строк нумеруются с единицы.

                На самом деле не знаю. Проверил, как сделано в Перле, из которого позаимствовали эту функцию. Оказалось, что в Перле нумерация с нуля. С другой стороны, Перл чётко различает массивы и хэш-таблицы, а в "PHP" они перемешаны в один тип данных (фактически в "PHP" любой массив —— это хэш-таблица с возможностью доступа по числовому индексу).
                Ответить
    • Проверка правильности хода коня. Суть в том, что конь ходит 2 раза "вперед" и 1 "вбок". Модуль перемножения его перемещения всегда равен 2.

      Алгоритм:
      1. Читаем 5 символов, провеняем, что матчит /^[A-H][0-9]-[A-H][0-9]/ (иначе -> "ERRROR")
      2. Вычисляем модуль перемножения по вертикали (s[0] - s[3]) и горизонтали (s[1] - s[4]). Если == 2 --> "YES", иначе "NO"

      Использованные трюки:
      * Отсутствие возвращаемого типа main (совместимо с ANSI C, aka C98)
      * Числовые литералы вместо символьных (65 == 'A', 49 == '1', '45' == '-')
      * Битовый оператор & вместо логического &&
      * Вычитание (- 2) в тернернике вместо сравнения (!= 2)
      * Использование результата gets() (gets(s)[2]) наряду с аргументом (s)

      Не понимаю только почему литерал 8u вместо просто 8.

      *Фух, писал полчаса, наконец ни одного мата*
      Ответить
      • Ты молодец, но эту программу написао я. Меня больше интересует, что там за монсьр на 124 байт на первом месте.

        > почему литерал 8u
        Чтобы тип привелся к беззнаковому, чтобы не проверять > 0 и < 8
        Ответить
        • > Меня больше интересует, что там за монсьр на 124 байт на первом месте.

          засылать без инклудов пробовал?
          Ответить
          • Без инклудов, пробелов и пепеносов строк —– 128 байт, да и ругается на необъявленныйе индендификитаторы puts, gets, abs
            Ответить
        • Зойчем ты 8u нопейсал?
          Ответить
        • > Ты молодец, но эту программу написао я. Меня больше интересует, что там за монсьр на 124 байт на первом месте.
          Тю, я думал ты его решение принес.
          Ответить
        • Кстати, если там не считают комментарии, то можно было бы что-то в стиле
          main() { system("lua " __ FILE__); }

          И уже в комментарии делать всю магию (нутыпонел)
          Ответить
          • Комментартии тожее считаются, было бы интересно, если бы там был интерпретатор whitespace
            Ответить
      • > ANSI C, aka C98
        Там C++, просто так вышло, что эта программа попала в пожмножество Си.
        Ответить
      • > /^[A-H][0-9]-[A-H][0-9]/
        /^[A-H][1-9]-[A-H][1-9]$/
        Ответить

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