LINUX.ORG.RU
ФорумAdmin

XOR для N переменных

 ,


2

2

Собственно сабж.

Сделал так:

function XORN()
{
	a=0
	while (($#)); do
		(( a = a + ! ! ${1} ))
		shift
	done
	echo $((( a = a % 2 )))
}

Работает, но интуитивно чувствую, что можно изящнее.

Как?



Последнее исправление: Cave-Canem (всего исправлений: 1)

function XORN()
{
	a=0
	for n; do
		(( a = ! ( ! $n - a ) ))
	done
	echo $a
}

P.S.: ни разу не XOR, скорее нечетность

anonymous
()
Ответ на: комментарий от anonymous

Malbolge

Это вообще кому? Не понял, кто (и что) написал максимально сложного?

Cave-Canem
() автор топика
Ответ на: комментарий от anonymous

XORN это не bitwise XOR, а logical function XOR

Сложе́ние по мо́дулю 2 (логи́ческая неравнозна́чность, исключа́ющее «ИЛИ», строгая дизъюнкция, XOR, поразрядное дополнение, побитовый комплемент, жегалкинское сложение) — булева функция, а также ЛОГИЧЕСКАЯ и битовая операция.

Таким образом,

$ XORN 1 2
0
дает правильный результат, т.к. 1 и 2 — это логические переменные, оба —«истина» (не «ноль»).

Более того:

XORN 1 "abc" -25
0
так же возвращает правильный результат. (К сожалению, Bash не имеет типизации данных).

За оптимизацию кода БОЛЬШОЕ спасибо!

Cave-Canem
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.