- 1
- 2
- 3
- 4
- 5
- 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");
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
#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");
}
восьмибитные
Алгоритм:
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.
*Фух, писал полчаса, наконец ни одного мата*
> почему литерал 8u
Чтобы тип привелся к беззнаковому, чтобы не проверять > 0 и < 8
Где-то видел такое:
UPD А нет, там еще что-то было..
Замени инклюды на <bits/stdc++.h>
Тю, я думал ты его решение принес.
И уже в комментарии делать всю магию (нутыпонел)
Там C++, просто так вышло, что эта программа попала в пожмножество Си.
/^[A-H][1-9]-[A-H][1-9]$/