Кресты / Говнокод #26728 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
  57. 57
  58. 58
  59. 59
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int perevod(char a)
{
  switch (a)
  {
    case 'A': {return 1; break;}
    case 'B': {return 2; break;}
    case 'C': {return 3; break;}
    case 'D': {return 4; break;}
    case 'E': {return 5; break;}
    case 'F': {return 6; break;}
    case 'G': {return 7; break;}
    case 'H': {return 8; break;}
  }
    return 0;
}
int proverka(char a)
{
  switch (a)
  {
    case '1': {return 1; break;}
    case '2': {return 2; break;}
    case '3': {return 3; break;}
    case '4': {return 4; break;}
    case '5': {return 5; break;}
    case '6': {return 6; break;}
    case '7': {return 7; break;}
    case '8': {return 8; break;}
  }
    return 0;
}
int main()
{
    string s;
    cin >> s;
    int x1, x2, y1, y2;
    x1=perevod(s[0]);
    x2=perevod(s[3]);
    y1=proverka(s[1]);
    y2=proverka(s[4]);
    if(s.length() != 5 || x1 == 0 || x2 == 0 || y1 == 0 || y2 == 0||s[2]!='-')
    {
        cout << "ERROR";
    }
    else{
    if(abs(x2 - x1) == 1 && abs(y2 - y1) == 2 || abs(x2 - x1) == 2 && abs(y2 - y1) == 1)
    {
        cout << "YES";
    }
    else
    {
        cout << "NO";
    }
    }
    return 0;
}

Простенькая проверка на возможность хода конем.

Запостил: Verenick Verenick, (Updated )

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

  • Красиво. Ничего не значащие названия функций «perevod» и «proverka» (хотя в названии как-то надо было отметить, что это перевод в число первой и второй координаты соответственно).
    Ответить
  • Проверку на длину строки надо делать до того, как к её символам лезешь, а не после. Иначе кровь-кишки-undefined-behavior.
    Ответить
  • Перевёл на высокоуровневый ЯП:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int  die      (char * a) { printf(a);   exit(1);                                            }
    char saturate (char a)   { return a * !((a - 1) & ~7);                                      }
    char hi_nibble(char a)   { return a >> 4;                                                   }
    char lo_nibble(char a)   { return a & 15;                                                   }
    char valid    (char a)   { return hi_nibble(a) && lo_nibble(a);                             }
    int  perevod  (char * a) { return saturate(a[0] - 'A' + 1) << 4 | saturate(a[1] - '1' + 1); }
    #define BUFLEN 255
    int main()
    {
        char s[BUFLEN];
        fgets(s, BUFLEN, stdin);
        int z1, z2;
        z1=perevod(s);
        z2=perevod(s + 3);
        (strlen(s) != 6 || !valid(z1) || !valid(z2) || s[2] != '-') && die("ERROR");
        abs(hi_nibble(z1) - hi_nibble(z2)) + abs(lo_nibble(z1) - lo_nibble(z2)) == 3 ? printf("YES") : printf("NO");
        return 0;
    }
    Ответить
                      • Ты данные подложил без перевода строки? А как это воспроизвести не в виртуалке? Подложить программе текстовый файл без перевода строки через знак меньше? Типа ./petuh <input.txt ?
                        Ответить
                        • Ты как будто никогда решения в систему проверки не засылал, там всегде программы кормят из файла.
                          Ответить
                          • А есть в сишке безопасный способ ввода строки без лишнего пердолинга?

                            • gets не проверяет размер буфера, возможно переполнение.
                            • gets_s есть не во всех библиотеках (ввели в C11, но до сих пор где-нибудь может отсутствовать).
                            • fgets проверяет размер, но может вернуть результат с символом перевода строки, а может без.
                            Ответить
                            • А что небезопасного в строке без перевода строки?
                              Ответить
                                • Макака думал, что "небезопасная строка" это такая строка, которая вдруг почему-то не нулём кончается.
                                  Ответить
                            • Поддерживаю макаку, если перевод строки не был введён или вся строка в буфер не влезла, что делать? Добавлять в строку отсебятину? Или всегда не включать перевод строки, чтоб не было понятно, был он или нет?
                              Ответить
                              • Поддерживаю. Без этой питушни неясно, ввелась психоза целиком или нет.

                                Однако, я бы возвращал количество считанных символов вместо питушарского указателя на саму строку, который никому не нужен. Это даёт O(1) накладных расходов, но избавляет от пердолинга с O(N) strlen получившейся питушни.
                                Ответить
                                • Поддерживаю 1023. Один хуй в 99% случаях нужно вызывать strlen. Особо скилловые питухи начинают итерироваться до нуль терминала.
                                  Ответить
                                • Поддерживаю. Нахуя вообще придумали этот питушарский разврат переданной строки? Чтобы поддерживать однострочные хаки вида «char *line = fgets(malloc(42), 42, 0);»?
                                  Ответить
                                  • А зачем придумали в условии оператора if возможность объявлять переменную, тут же ей присваивать значение и тут же это значение с чем-нибудь сравнивать?
                                    Ответить
                                  • > malloc
                                    какую-то его версию, которая не ворвращает NULL

                                    > однострочные хаки
                                    Причём эта недофункциональщина встречается только в некоторых функциях. Видимо, только в тех местах, где она требовалась авторам языка на стадии, когда кроме них на нём никто не писал.

                                    Неясно, почему нельзя сделать второй слой API - stdio2, stdlib2 или просто добавить в них
                                    #ifdef API_V2
                                    #ifndef API_V2_STLIB
                                    #define API_V2_STLIB
                                    ...
                                    #endif
                                    #endif
                                    Ответить
                                • поддержу ошибку при попытке вычесть 1 из rvalue.

                                  я уже и так передал питухам указатель на строку, и они ее заполнили

                                  на кой хуй мне еще один указатель? чтобы я еще раз длину строки проверял, которрая у нультерминейтед O(N)?
                                  Ответить
                                • >Это даёт O(1) накладных расходов, но избавляет от пердолинга с O(N) strlen получившейся питушни.

                                  Видимо они ожидают посимвольного чтения и парсинга буферизированного потока.
                                  Ответить
                            • >А есть в сишке безопасный способ ввода строки без лишнего пердолинга?
                              size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
                              
                              Reads data from the given stream into the array pointed to by ptr.
                              
                              Return Value
                              
                              The total number of elements successfully read are returned as a size_t object, which is an integral data type. If this number differs from the nmemb parameter, then either an error had occurred or the End Of File was reached.


                              POSIX read
                              read(2) - Linux man page
                              Name
                              read - read from a file descriptor
                              Synopsis
                              
                              #include <unistd.h>
                              ssize_t read(int fd, void *buf, size_t count);
                              
                                  int fd file descriptor is an integer and not a file pointer. The file descriptor for stdin is 0
                              
                                  void *buf pointer to buffer to store characters read by the read function
                              
                                  size_t count maximum number of characters to read
                              
                              Description
                              read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.
                              
                              On files that support seeking, the read operation commences at the current file offset, and the file offset is incremented by the number of bytes read. If the current file offset is at or past the end of file, no bytes are read, and read() returns zero.
                              
                              If count is zero, read() may detect the errors described below. In the absence of any errors, or if read() does not check for errors, a read() with a count of 0 returns zero and has no other effects.
                              
                              If count is greater than SSIZE_MAX, the result is unspecified.
                              Ответить
                                • #include <stdio.h>
                                  
                                  int main(){
                                  	char pituh[42];
                                  	size_t size = fread(pituh, sizeof(char), 42, stdin);
                                  	printf("%d\n", size);
                                  }
                                  
                                  $ echo 'kokoko' > test && gcc 1.c -o k && ./k < test
                                  7
                                  Ответить
                                  • fread, да. Но там Иканус волновался, что перевод строки может быть, а может и не быть.

                                    Кстати, что такое stdin в одинарных кавычках?
                                    Ответить
                                    • Царский метод между прочим.

                                      NAME
                                      fread, fwrite - binary stream input/output


                                      fgets питушня заточенная на текстовые данные. Потому всякие \n.
                                      Ответить
                                      • Кстати, Макака верно понимает, что перевод строки может зависеть от степени прожарки линейной дисциплины никсового терминала?

                                        Велдан всегда будет с переводом, а raw -- нет?
                                        А ведь есть еще штольмановский getline...
                                        Ответить
                                        • Я хз зачем такие проблемы если можно использовать бинарное чтение.

                                          Опять же неразумные питузы клевали и оплевывали Царя, вместо того чтобы внимать его мудрому Слову.

                                          https://tsar1997.blogspot.com/2019/10/blog-post_18.html
                                          Текстовый формат используют только идиоты.
                                          
                                          Текстовый формат имеет смысл только для текста, читаемого человеком.
                                          
                                          Очевидно, что всё остальное - ненужно.
                                          Ответить
                                          • Это правда. По этой причине я ебал json, например.
                                            В сишке же сериализация из коробки. Если ты умеешь управлять align (кажется, что все компиляторы дают такую возможность), то зачем вообще текстовые файлы?
                                            Ответить
                                              • А как эту проблему решили для tcp/ip?:)

                                                Ну хотя да, наверное если у меня
                                                char petuh;
                                                int krestuh;
                                                char petuh2;

                                                то будут проблемы. Кстати, а у кого порядок байт отличается из современных cpu? Кроме x86 и ARM есть что-то? Какой порядок у ARM?
                                                Ответить
                                                • У ARM порядок байтов можно менять на лету прямо на горячем процессоре. Инструкция есть для этого.
                                                  Ответить
                                                  • Можно во всем мире зафиксировать порядок байт, а все другие объявить ересью?

                                                    Жалко спарк конечно (хорошая архитектура, умевшая execute xor write еще в 90-е), но красота требует жертв
                                                    Ответить
                                                    • Кроме ARM переключать порядок умели MIPS, PowerPC, Alpha, Itanium. «Линукс» и «Солярис» для этих процессоров были и LE, и BE, «Windows» — только LE.

                                                      Похоже, ARM — единственная выжившая платформа с переключателем порядка байтов.
                                                      Ответить
                                                      • >MIPS, PowerPC, Alpha, Itanium
                                                        Умерли же все, нет? Я как-то зырил серию лекций какого-то профессора про архитектуру компов (очень пиздатую кстати, он там нормально объяснил устройство DRAM, например).
                                                        Он грустил о MIPS. Говорил, очень хорошая архитектура, но уже никому почти не нужна.

                                                        W2K был под Alpha, прыщи были под PPC (чтобы портануться под MAC, по этой причине завезли фрейм буфер кстати), но потом всё
                                                        Ответить
                                                    • >Можно во всем мире зафиксировать порядок байт, а все другие объявить ересью?

                                                      Можно
                                                      См. TCP/IP.
                                                      https://tools.ietf.org/html/rfc1700 Есть SMB, но то как правильно замечено виндузятные еретики.
                                                      Ответить
                                                      • Наскока я понимаю, network byte order надо явно конвертить в host byte order, то-есть идея бесплатной сериализации портится
                                                        Ответить
                                                        • >Наскока я понимаю, network byte order надо явно конвертить в host byte order, то-есть идея бесплатной сериализации портится

                                                          Опять же читаем изречения Царя о полезных структурах данных.
                                                          Массиву байт например насрать на их сетевой порядок.
                                                          А всё остальное от лукавого.

                                                          Впрочем какой-нибудь bswap ещё никому не делал хуже.
                                                          Ответить
                                                          • Байт не испортится, а что делать с двумайтовыми числами?
                                                            Ответить
                                                            • >а что делать с двумайтовыми числами?
                                                              Использовать две ячейки байтового массива!
                                                              Ответить
                                                              • ну то-есть байтордер сделать частью бизнес логики?

                                                                Паттерн Лохи:
                                                                strurct word {
                                                                 char lo;
                                                                 char hi;
                                                                }
                                                                Ответить
                                                                • Предлагаю модификацию сишки: разрешить использовать многобайтовые числа только для вспомогательных переменных в арифметических выражениях. Брать указатель можно только на char, массивы можно собирать только из чаров, ввод-вывод можно только чарами.
                                                                  Ответить
                                                                  • Вот да.
                                                                    Всем хватит 256 символов. И чисел.
                                                                    Если кто-то настолько туп, что не способен осилить английский, или настолько жаден, что ему мало 256, то такой питух нам не нужен
                                                                    Ответить
                                                      • Да почти в любом формате файла так, кроме TIFF.

                                                        TIFF-файлы были с сигнатурой «MM» (от слова «Motorola») и «II» (от слова «Intel»), указывающей на порядок байтов в многобайтовых числах.
                                                        Ответить
                                                    • Представь, как можно говнокодить на ARM. Можно, например, чётные итерации цикла проходить в режиме SETEND BE, а нечётные — в режиме SETEND LE.
                                                      Ответить
                                                    • Поддерживаю. Эта питушня вызывает только лишние проверки и дублирование кода.
                                                      Ответить
                                                • SETEND

                                                  Set the endianness bit in the CPSR, without affecting any other bits in the CPSR.

                                                  SETEND cannot be conditional, and is not permitted in an IT block.
                                                  Show/hideSyntax

                                                  SETEND specifier

                                                  where: specifier is one of:

                                                  BE Big-endian.
                                                  LE Little-endian.

                                                  Show/hideUsage

                                                  Use SETEND to access data of different endianness, for example, to access several big-endian DMA-formatted data fields from an otherwise little-endian application.
                                                  Show/hideArchitectures

                                                  This ARM instruction is available in ARMv6 and above.

                                                  This 16-bit Thumb instruction is available in T variants of ARMv6 and above, except the ARMv6-M and ARMv7-M architectures.

                                                  There is no 32-bit Thumb version of this instruction.

                                                  Example
                                                      SETEND  BE          ; Set the CPSR E bit for big-endian accesses
                                                      LDR     r0, [r2, #header]
                                                      LDR     r1, [r2, #CRC32]
                                                      SETEND  le          ; Set the CPSR E bit for little-endian accesses for the
                                                                          ; rest of the application
                                                  Ответить
                  • Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the end-of-file is reached, whichever happens first.

                    A newline character makes fgets stop reading, but it is considered a valid character by the function and included in the string copied to str.
                    Ответить
      • Вот да.
        почему 15, а не 0xF?
        Почему функции, а не макросы с инлайном?
        Ответить
    • Неплохой перевод без отсебятины. Даже тот момент, о котором говорил Борманд, остался.
      Ответить
      • Однострочные хуёвые предложения, полные тоски и безысходности.
        Аллокатор, вовзращащий указатель на 1 элемент массива, заполненного массивами.
        Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8