1. C++ / Говнокод #26728

    +1

    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
    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, 02 Июня 2020

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

    • Красиво. Ничего не значащие названия функций «perevod» и «proverka» (хотя в названии как-то надо было отметить, что это перевод в число первой и второй координаты соответственно).
      Ответить
    • Проверку на длину строки надо делать до того, как к её символам лезешь, а не после. Иначе кровь-кишки-undefined-behavior.
      Ответить
    • Да ты просто анскиллябра.

      https://govnokod.ru/24840
      Ответить
    • Перевёл на высокоуровневый ЯП:
      #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;
      }
      Ответить
      • Лашара.
        Ответить
        • Что не так?
          Ответить
          • Проверить не догадался?
            Ответить
            • Проверял. За щекой ничего нет.
              Ответить
              • По условию инпут 5 символов.
                Ответить
                • fgets захватывает символ перевода строки, поэтому 6.
                  Ответить
                  • Перевода нет.
                    Ответить
                    • У меня в «mingw» почему-то есть. И в «Ideone» тоже:
                      https://ideone.com/ROYHNd
                      Ответить
                      • https://ideone.com/VA2b3a
                        Ответить
                        • Ты данные подложил без перевода строки? А как это воспроизвести не в виртуалке? Подложить программе текстовый файл без перевода строки через знак меньше? Типа ./petuh <input.txt ?
                          Ответить
                          • Ты как будто никогда решения в систему проверки не засылал, там всегде программы кормят из файла.
                            Ответить
                            • А есть в сишке безопасный способ ввода строки без лишнего пердолинга?

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

                                  Однако, я бы возвращал количество считанных символов вместо питушарского указателя на саму строку, который никому не нужен. Это даёт O(1) накладных расходов, но избавляет от пердолинга с O(N) strlen получившейся питушни.
                                  Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                  • Поддерживаю. Нахуя вообще придумали этот питушарский разврат переданной строки? Чтобы поддерживать однострочные хаки вида «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
                                      Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                  • >Это даёт 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.
                                Ответить
                                • "Linux read" это не "в сишке"
                                  Ответить
                                  • #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
                                    Ответить
                                    • показать все, что скрытоvanished
                                      Ответить
                                      • Царский метод между прочим.

                                        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 порядок байтов можно менять на лету прямо на горячем процессоре. Инструкция есть для этого.
                                                    Ответить
                                                    • показать все, что скрытоvanished
                                                      Ответить
                                                      • Кроме ARM переключать порядок умели MIPS, PowerPC, Alpha, Itanium. «Линукс» и «Солярис» для этих процессоров были и LE, и BE, «Windows» — только LE.

                                                        Похоже, ARM — единственная выжившая платформа с переключателем порядка байтов.
                                                        Ответить
                                                      • >Можно во всем мире зафиксировать порядок байт, а все другие объявить ересью?

                                                        Можно
                                                        См. TCP/IP.
                                                        https://tools.ietf.org/html/rfc1700 Есть SMB, но то как правильно замечено виндузятные еретики.
                                                        Ответить
                                                      • Представь, как можно говнокодить на 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.
                      Ответить
          • > printf(a);
            Ответить
        • Вот да.
          почему 15, а не 0xF?
          Почему функции, а не макросы с инлайном?
          Ответить
      • Неплохой перевод без отсебятины. Даже тот момент, о котором говорил Борманд, остался.
        Ответить
        • Однострочные хуёвые предложения, полные тоски и безысходности.
          Аллокатор, вовзращащий указатель на 1 элемент массива, заполненного массивами.
          Ответить

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