1

Тема: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Дано кординати поля шахової дошки x, y (цілі числа в діапозоні 1-8) З огляду на те, що ліве нижнє поле дошки(1, 1) є чорним, перевірити істиннісь "Це поле є білим".

Тобто якщо кординати поля на білому, то True, на чорному - False

Post's attachments

_001_1800.jpg 150.18 kb, 227 downloads since 2018-03-07 

2

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

то ж дуже очевидна задачка, розв'яжіть її самі

3

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Розв'язав, давайте наступну.

Подякували: LoganRoss, sensei, P.Y., leofun01, ping5

4

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

#include <stdio.h>

bool IsWhite(int x, int y) { return (x ^ y) & 1; }

int main() {
    int x, y;
    x = 1;
    y = 1;
    printf("(%i, %i) is %s\r\n", x, y, IsWhite(x, y) ? "white" : "black");
    x = 3;
    y = 4;
    printf("(%i, %i) is %s\r\n", x, y, IsWhite(x, y) ? "white" : "black");
}

https://replace.org.ua/misc.php?action=pun_attachment&amp;item=1763&amp;download=0

Post's attachments

ChessBoard001.png 15.88 kb, 190 downloads since 2018-03-07 

5

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

от не можна було по-людськи це написати?? дідько!

(x ^ y) & 1

6

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Ну в мене вийшло якось так. Перевірте пліз, бо мого теста може і не вистачити

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

int main(int argc, char** argv) {
    system("chcp 1251 >> nul");
    setlocale(LC_ALL, "UKR");
    cout.setf(ios::boolalpha);
    
    int x, y;
    cout << " X = "; cin >> x;
    cout << " Y = "; cin >> y;
    
    bool ok = (x==y);
    bool ok1 = ((x%2==1)||(y%2==1));
    goto tp;
    
    cout << " Answer - " << ok << endl;
    tp:
    cout << " Answer - " << ok1 << endl;
         
    cout << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    system("pause");
    return 0;
}
Подякували: Дмитро-Чебурашка1

7

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

FakiNyan написав:

от не можна було по-людськи це написати?? дідько!

(x ^ y) & 1

^ - xor
& - and
Робимо xor(x, y) і накладаємо маску and(..., 1).
Шо не ясно ?

Maxrad20 написав:

Ну в мене вийшло якось так. Перевірте пліз, ...

    bool ok = (x==y);
    bool ok1 = ((x%2==1)||(y%2==1));

*FACEPALM*
Всьо не так, всьо не то.

8

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

тепер ясно, я назви тих значків забув

9

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

leofun01 написав:
FakiNyan написав:

от не можна було по-людськи це написати?? дідько!

(x ^ y) & 1

*FACEPALM*
^ - xor
& - and
Робимо xor(x, y) і накладаємо маску and(..., 1).
Шо не ясно ?

Maxrad20 написав:

Ну в мене вийшло якось так. Перевірте пліз, ...

    bool ok = (x==y);
    bool ok1 = ((x%2==1)||(y%2==1));

*FACEPALM*
Всьо не так, всьо не то.

Шо не так??? Шо не то??

10 Востаннє редагувалося P.Y. (07.03.2018 22:44:22)

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Я чогось думав, у наші часи на тих, хто пише goto, нападають динозаври.
До рядка, який іде після безумовного переходу перед найближчою після нього міткою, потрапити неможливо, тому можете спокійно його стерти чи закоментувати — на хід роботи це не вплине. А позбувшись його, ви отримаєте

goto tp;
tp: 

тобто, перехід на мітку, що стоїть у тому ж місці, куди б ми потрапили, якби goto не було; переходів на tp з інших місць програми також нема — можете стерти й ці два рядки.

Подякували: koala, Дмитро-Чебурашка2

11

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

leofun01 написав:
FakiNyan написав:

от не можна було по-людськи це написати?? дідько!

(x ^ y) & 1

*FACEPALM*
^ - xor
& - and
Робимо xor(x, y) і накладаємо маску and(..., 1).
Шо не ясно ?

Можна було б з тим же успіхом написати

(x + y) % 2

позаяк цікавить лише молодший біт, а лякало б менше :)

leofun01 написав:
Maxrad20 написав:

Ну в мене вийшло якось так. Перевірте пліз, ...

    bool ok = (x==y);
    bool ok1 = ((x%2==1)||(y%2==1));

*FACEPALM*
Всьо не так, всьо не то.

Егеж. Причому перевірити це можна було б, кілька разів ткнувши у випадкову клітинку і підставивши координати.

12

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

ReAl написав:
leofun01 написав:
(x ^ y) & 1

Можна було б з тим же успіхом написати

(x + y) % 2

позаяк цікавить лише молодший біт, а лякало б менше :)

Це, звичайно, добре, що сучасні процесори працюють достатньо швидко, щоб ми не відчували різниці між обчисленнями цих виразів, але "(x^y)&1" є оптимальнішим, а "(x+y)%2" змушує ганяти зайві біти при додаванні і немає гарантії, що компілятор проведе оптимізацію для ...%2.
І на рахунок "лякало б менше", такі операції (&, ^, |, &&, ||) мають вивчатися перед арифметичними операціями, бо вони простіші, тобто потребують менше бітових перетворень.

13 Востаннє редагувалося Maxrad20 (08.03.2018 10:49:06)

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

P.Y. написав:

Я чогось думав, у наші часи на тих, хто пише goto, нападають динозаври.

Але це реально корисна штука
І якщо б я не застосував вивелось би зразу змінна ok1 і ok

14

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Це реально шкідлива штука, якої треба уникати.
Щоби щось не зробилося, треба просто цього не робити, логічно? Видаліть рядок - і він не спрацює. А якщо вам треба, щоб деякий блок коду на час відлагодження не працював, а потім знову запрацював, загальна практика - коментування. Замість

    goto tp;
    cout << " Answer - " << ok << endl;
    tp:

треба робити просто

//    cout << " Answer - " << ok << endl;

якщо рядків кілька, то

    /*
    cout << " Answer - " << ok << endl;
    */

Це краще за goto, бо дійсно виключає виконання цих рядків, а у вас лишається можливість, що десь іще відбудеться перехід по goto в ніби-то "виключену" зону.

Подякували: P.Y.1

15

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

По операції: нам, насправді, треба перевірити, чи однакова парність у номерів рядку і стовпця, тобто абсолютно строге рішення

bool is_black = (x % 2) == (y % 2);
//або
bool is_white = (x % 2) != (y % 2);

Звісно, можна звернути увагу, що операція ділення (а відтак і обчислення залишку) - довга, а парність у двійковій системі перевіряється останнім бітом:

bool is_black = (x & 1) == (y & 1);
bool is_white = (x & 1) != (y & 1);

але це потребує додаткових знань (хоча й не надто глибоких).
Оптимізація до стану (x^y)&1, звісно, можлива, але вже не так очевидна, так що потребує коментаря.

Подякували: Maxrad20, leofun012

16

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

koala написав:

а у вас лишається можливість, що десь іще відбудеться перехід по goto в ніби-то "виключену" зону.

Але як? Хіба що перед goto можна дописати if або while, тоді перехід стане умовним — відповідно, в «виключену» зону стане можливо потрапити.

Хоча справді, загальноприйнята практика в наш час — закоментувати непотрібний рядок. Це краще ще й тому, що закоментований код при компіляції пропускається (а обійдений — усе одно компілюється) — не треба турбуватися про помилки в непотрібних рядках, а кінцева відкомпільована програма виходить компактнішою. А ще, перехід на мітку поганий тим, що імена міток, якщо їх декілька, можна переплутати, а тоді довго намагатися зрозуміти, в якому порядку програма виконується.

17

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

P.Y. написав:

Але як? Хіба що перед goto можна дописати if або while, тоді перехід стане умовним — відповідно, в «виключену» зону стане можливо потрапити.

Це стосується, очевидно, складніших випадків, коли виключається кілька рядків, а в програмі є багато goto.

P.Y. написав:

Хоча справді, загальноприйнята практика в наш час — закоментувати непотрібний рядок. Це краще ще й тому, що закоментований код при компіляції пропускається (а обійдений — усе одно компілюється) — не треба турбуватися про помилки в непотрібних рядках, а кінцева відкомпільована програма виходить компактнішою.

Тут ви не праві. Оптимізацією програми, тим більше дрібною, треба займатися вже після її відлагодження. Якщо код вже працює, як слід, то всі закоментовані фрагменти треба просто викинути як непотрібні. А якщо програма працює некоректно, то непродумані дрібні оптимізації можуть тільки нашкодити.

18

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

leofun01 написав:

Це, звичайно, добре, що сучасні процесори працюють достатньо швидко, щоб ми не відчували різниці між обчисленнями цих виразів, але "(x^y)&1" є оптимальнішим, а "(x+y)%2" змушує ганяти зайві біти при додаванні і немає гарантії, що компілятор проведе оптимізацію для ...%2.

Та ну, на всіх відомих мені архітектурах (тобто не лише тих, де я реально кодив на асмі, а і тих, де я лише читав документацію, сюди входять і дво- та чотири-бітові секції арифметико-логічних пристроїв секціонованих процесорів) всі базові операції АЛП між двома регістрами займають однаковий час. Тобто різний час виконання XOR і ADD це щось взагалі нереальне.
Щодо оптимізації, то сперечатися важче, але для сучасного компілятора при хоч якійсь оптимізації (не аналог -O0 для gcc) вважаю відмінність вкрай малоймовірною
.
Що стосується gcc, то лінукс-x86-84, arm-none-eabi для Cortex-M3 і avr-gcc, як я щойно перевірив, навіть при -O0 для обох цих варіантів дає код, що відрізняється лише одним рядком, add замість xor (eor), про час виконання якого див. вище.

Подякували: leofun011

19

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Оптимізацією програми, тим більше дрібною, треба займатися вже після її відлагодження.

Догма, якій не завжди варто цілковито довіряти. Якщо в початковому коді нема непотрібних деталей, які ніби-то мають самі згладитись при оптимізації, то й написання/відлагодження коду значною мірою спрощується — то чи слід таку оптимізацію вважати передчасною?

Подякували: leofun01, LoganRoss2

20

Re: C++ Розв'яжіть задачу (клітинки шахматної дошки)

Це стосується, очевидно, складніших випадків, коли виключається кілька рядків, а в програмі є багато goto.

Все одно, як потрапити з допомогою goto в місце, заізольоване безумовним переходом, після якого нема мітки? Хіба що застосувати перехід на адресу, обчислену як число (але це надто екзотично для просто макаронного коду, і точно не знаю, в яких компіляторах Сі таке підтримується).

Подякували: Дмитро-Чебурашка1