Создайте самую короткую программу, которая принимает два целых числа со знаком в качестве входных данных (через stdin или в качестве аргументов) и отображает 3 различных результата в зависимости от того, является ли первое число (1) больше, (2) меньше или (3) равно второму число.
Поймать
Вы не можете использовать в своей программе следующее:
- Стандартные операторы сравнения:
<
,>
,<=
,>=
,==
,!=
. - Любой файл библиотеки , кроме
conio
,stdio
илиiostream
. - Любой не-ASCII или непечатный ASCII-символ.
Победитель
Программа с самым коротким количеством символов выигрывает.
code-golf
restricted-source
c
c++
лесок
источник
источник
abs
без включения файла библиотеки (потому что компилятор это знает) также не разрешено?Ответы:
53 байта
Уместен только первый символ вывода. Три разных выхода:
Он работает для всего диапазона ввода int на всех платформах, где sizeof (long)> sizeof (int).
Изменить: стоит один дополнительный символ, чтобы вместо варианта 3 печатать '+':
источник
Может быть, я что-то упустил в правилах, но ...
81 байт
Выходы
00
еслиa > b
,-10
еслиa == b
, и-1-1
еслиa < b
.источник
long long
может быть больше 64 бит,int
может быть настолько большим, чтобы вы могли переполниться, результат смещения вправо отрицательных значений определяется реализацией. Практически все C-производные ответы имеют похожие проблемы.sizeof
,90 байт
Если мы можем использовать
stdio
, почему бы не использовать возможности форматирования для сравнения?Предполагает ASCII-совместимое кодирование и порядок байтов.
72 байта
Коэффициенты округлены до нуля, но сдвиги вправо (на практике) «округлены вниз». Это мертвая распродажа.
6579 байтДругое отличительное свойство отрицательных чисел состоит в том, что они производят отрицательные по модулю. Этот не зависит от целочисленного представления вообще; он даже работает на моем 8-битном тостере с избыточностью-127! О, и так как мы можем использовать
conio
, почему бы не сохранить два байта сputch
? Теперь, если бы я только мог найти свою копию TurboC ...РЕДАКТИРОВАТЬ : обрабатывать большие различия, предполагая,
long long
что шире, чемint
.источник
%d
s в вашем,scanf
чтобы однозначно проанализировать два целых числа. Хорошая идея, хотя!a = 1, b = 23
иa = 12, b = 3
. Разве вам не нужно надевать123
STDIN в любом случае?1 23
и12 3
как входы).6461 персонажПечатает символьные значения -1, 0 и 1 для значений меньше, равно или больше, соответственно.
Эта реализация опирается на неопределенное поведение для
b
того типаint
и для входов вне диапазонаINT_MIN / 2
кINT_MAX / 2
. На платформах, где происходит переполнение со знаком, будь то дополнение 2s (в основном все) или величина знака, оно завершится неудачно для 25% возможных пар допустимых значенийint
. Интересно (во всяком случае, для меня), что он будет работать правильно на платформах, где насыщение со знаком насыщается.источник
a-b
переполнится.-(2^14)
и2^14 - 1
на всех совместимых платформах, и он, вероятно, будет работать для значительно большего диапазона на большинстве платформ. Все остальные ответы на этом этапе делают предположения о размере типа, относительных размерах типов или представлении.main(a,b)
это уже неопределенное поведение, поэтому ни один из ответов не гарантированно сработает. Фигу портативность.66102 байтаСчитывает целые числа из STDIN и печатает
0
(a <b),1
(a> b) или2
(a == b).Изменить: Теперь это должно также работать для различий, которые слишком велики, чтобы вписаться в 32-разрядное целое число. Я уверен, что вложенные троичные могут быть сокращены с помощью некоторой дополнительной магии.
источник
52 байта
К сожалению, этот работает только для натуральных чисел, но я думал, что концепция использования чисто арифметических операторов была интересна:
Выходы:
источник
putchar(a/b-b/a)
это намного короче.5954 персонажа54 символа с таким компилятором, как gcc, который не мешает
main(x,y)
:59 символов в противном случае:
Выход:
источник
main(x,y)
работает в gcc, так что не стесняйтесь отбрасывать эти 5 байтов из числа ваших символов.66 байт
Печатает байт 0x00 if
a == b
, 0x01 ifa < b
и 0xff ifa > b
.Поскольку в программе [my] не-ASCII или непечатный ASCII-символ и если что-либо явно не запрещено в вопросе, то это разрешено , непечатаемый символ в выходных данных должен быть полностью в порядке.
источник
long
64-битный.87 персонажей
Использование трюка 2 ^ 31 для преобразования в unsigned int
Приведение деления к unsigned для обработки старшего бита как данных, а не знака
Используя ^ к XOR a и b, когда они равны, это возвращает 0
Использование вложенных условных выражений (?) Для получения "<", ">" или "=" для подачи в put ()
источник
71 байт
http://ideone.com/uvXm6c
источник
z=x-y
и я уверен, что они необходимы. Вы также можете сохранить два символа, используя49,
50` и51
напрямую, вместо добавления48
.-2000000000 2000000000
, как и любая другая комбинация целых чисел, которая вызывает переполнение в вычитании.68 персонажей
Помещает ASCII символ 1, 2 или 3 на меньше чем, больше или равно соответственно.
источник
a-b
переполнится.8889 байтЭто начинается с добавления
1<<31
(INT_MIN
) к a и b, так что теперь 0 соответствуетINT_MIN
. Затем зацикливает и уменьшает a и b каждый цикл до тех пор, пока не будет 0, затем выводит 0, 1 или 2 в зависимости от того, a, b или оба равны 0.120119 байтЭто не самое короткое решение, как есть, но может быть немного лучше, чем я. (Или просто люди с большим знанием C, чем я)
Идея состоит в том, чтобы маскировать каждый бит, начиная с левого и проверяя на неравенство. Остальное должно объясниться. Так как отрицательные числа начинаются с 1 бита, я сначала инвертирую первый бит с
a^=1<<31
.источник
;)
смайлик должен быть грустным);
смайликом. 2.a&b
только проверяет, еслиa
иb
имеют общие биты; вам нужно&&
.Я думаю, что даже не собираюсь пытаться писать короткий код. Я попытаюсь выполнить это сравнение так, чтобы оно было переносимым в соответствии со спецификацией C99.
Оператор по модулю сохраняет знак, но он вполне может произвести ноль (включая отрицательный ноль), поэтому мы гарантируем, что у нас есть как нечетное, так и четное значение для его проверки (даже не зная, используем ли мы их дополнение). Арифметические операции могут переполняться, но побитовые не будут, и, гарантируя, что биты установлены и очищены, мы избегаем непреднамеренного преобразования нашего числа в отрицательный ноль или значение ловушки. Тот факт, что две операции требуются для этого странным образом, не должен иметь значения, потому что возможное представление ловушек не вызывает неопределенного поведения, пока не будет помещено в lvalue. Выполнение операции с переключенным битом 0 гарантирует, что мы получим ровно один ненулевой остаток. Вооружившись знанием обоих признаков, мы можем решить, как продолжить сравнение.
Этот метод может быть одним из немногих, которые позволяют извлечь знак целого отрицательного нуля. Мы решаем это путем явной проверки на ноль. Если бы мы играли в гольф по-настоящему, мы могли бы, конечно, позволить сравнение двух нулей, чтобы выполнить вычитание.
источник
C 80 символов
Он печатает «<», «>» или «=», как и должно быть.
C 63 символов
Новый подход:
Печатает «1», «2» или «3».
источник
В 64 символов без stdio.h
a,b;main(){scanf("%d%d",&a,&b);puts((a-b)>>31?"<":a^b?">":"=");}
печатает '>' если a> b, '<' если a <b, '=' если a == b int переполнение равно UB. Только не переполняй.
источник