Это CMC (чат-мини-вызов), который я опубликовал в нашем чате, Ninteenth Byte , немного назад.
Соревнование
Учитывая положительное целое число x
, в зависимости от последних 2 битов x
, сделайте следующее:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
Ввод, вывод
Single Integer -> Single Integer
Конечный перевод строки разрешен в выходных данных. Никакие другие пробелы не допускаются.
Testcases
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
Это испытание для игры в гольф , поэтому выигрывает самый короткий код!
0
случай бытьx + 2
, видя, как остальныеx * 2
,x ^ 2
иx ^^ 2
(тетрация)? : Px ^ x
)? 32-разрядного уже недостаточно для тестового примера11
, а 64-разрядного недостаточно для тестового примера19
.Ответы:
Желе , 8 байт
Попробуйте онлайн!
Как это работает
Во-первых, обратите внимание, что
x&3
эквивалентноx%4
, где%
по модулю. Затем, поскольку Jelly использует модульную индексацию (a[n] == a[n+len(a)]
), нам даже не нужно иметь с этим дело.Затем:
x%4==0
вернутьx_x
(вычитание) (для согласованности);x%4==1
вернусьx+x
;x%4==2
вернутьx×x
(умножение);x%4==3
вернутьx*x
(возведение в степень)Обратите внимание, что Jelly использует 1-индексирование, поэтому вычитание
"_"
перемещается до конца.источник
wc --bytes
).Python , 30 байт
Попробуйте онлайн!
источник
CJam , 12 байт
Попробуйте онлайн!
объяснение
Запускает одну из следующих операций в зависимости от
x
значения mod 4 (mod 4 эквивалентно AND 3).источник
Mathematica 25 байт
Сохранено 4 байта благодаря @MartinEnder
источник
Pyth, 8 байт
переводчик
источник
v
вместо.v
..v
не может получить доступQ
... Видимо, меня обошли в Pyth. +1 для вас.v
имеет локальную область видимости,.v
просто выражает выражение."0y*^
может быть"-+*^
.Рубин , 26 байт
Попробуйте онлайн!
источник
PHP, 37 байт
Онлайн версия
PHP, 47 байт
Онлайн версия
До н.э Математические функции
источник
Haskell,
2827 байтовПопробуйте онлайн!
Редактировать: Спасибо @ Örjan Johansen за 1 байт.
источник
cycle
.JavaScript, 24 байта
Попробуйте онлайн!
источник
C, 63 или 62 байта
-1 байт, если допустимы макросы, если предположить, что
x
это выражение не похоже на3+5
(поскольку это испортит приоритет):источник
cast to incomplete array type "int[]" is not allowed
компилятор сказалerror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; ТАКЖЕ! где int f (int x)? код на самом деле как минимум на 8 байт длиннее; также он очень медленный и неэффективный, так как он оценивает все - не повторяйте его в(int[])
синтаксис для этой ситуации. 2)f(x)
совершенно легально с89. Я не указал стандарт. 3) Речь идет о размере кода, а не эффективности. И 4) Если вы собираетесь покровительствовать, используйте хотя бы настоящий компилятор и / или проверьте свои факты.Java 7, 75 байт
Несмотря на то, что он действителен в соответствии с правилами,
long
является 64-битным, поэтому он не подходит для тестов на возведение в степень19^19
и выше. Чтобы исправить это, мы можем использоватьBigDecimal
подход:148146 байтПояснение (подхода BigDecimal):
Тестовый код:
Попробуй это здесь.
Выход:
источник
x86 Assembler, синтаксис Intel, 192 байта
Пример претендует на самую высокую скорость работы. Is - это программа или часть программы, которая использует соглашение fastcall. Он предполагает входную переменную
x
в регистреeax
и возвращает результат также вeax
. Основная идея - избегать использования условных переходов, как в некоторых примерах здесь. Кроме того, это не для оценки всего (как в примере C с массивами), а для использования массива указателей на функции и более быстрых безусловных переходов (jmp / call) в качестве оптимизированного аналога "языка переключения C () - case ..". Эта техника может быть полезна и для конечных автоматов, таких как эмуляторы процессоров, исполнители и так далее.Upd: для x64 используйте «r» в именах регистров вместо «e» (например,
rax
вместоeax
,rcx
вместоecx
). Размер не будет изменен, и он будет использовать 64-битные слова без знака.источник
C #, 39 байт
объяснение
Обратите внимание, что:
(хх, х + х, х * х, х ^ х) == (0, 2, х, х ^ (х-1)) * х
Решение создает массив, индексирует его, а затем умножает результат на
x
:Альтернативные версии:
(39B, все умножение сделано в массиве,
x%4
заменяетx&3
)(39B, такой же, как ответ @ MetaColon, но
x%2*2*x
заменяетx*x%4<1?0:2
)источник
На самом деле , 12 байтов
Попробуйте онлайн!
Объяснение:
источник
05AB1E , 10 байтов
Использует кодировку 05AB1E . Попробуйте онлайн!
источник
J , 14 байт
Попробуйте онлайн!
источник
(4&|{-,+,*,^)~
работает также, но это тот же счетчик байтов из-за паренов, хотя это немного более очевидно, что он делает.Оазис , 25 байт
Попробуйте онлайн!
Как это работает
Обратите внимание, что
x&3
эквивалентноx%4
, где%
по модулю.Oasis - это основанный на стеке язык, где каждый символ является командой.
источник
Cubix , 29 байт
Попробуйте онлайн!
Объяснение будет добавлено в ближайшее время ...
источник
C #, 42 байта
На самом деле это обычный C #, но поскольку вы не можете запустить его как целую программу, и вам нужно ввести его в интерактивном режиме, я думаю, вы можете назвать его C # интерактивным .
объяснение :
Не могу сказать, что это самый короткий вариант, любые предложения приветствуются.
источник
x
оно не определено. Это делает этот фрагмент, а не полную программу.x
» означает, что вам даютx
стандартный метод ввода (т. Е. Функцию или программу).PHP, 36 байт
источник
дк, 27
У меня никогда не было возможности использовать массивы в dc:
Попробуйте онлайн .
источник
Groovy, 26 байт
Попробуйте онлайн!
источник
C, 115 байтов
Пример - это функция
int f(int x)
Он претендует на самую быструю скорость работы, поскольку не позволяет ЦП использовать условные переходы. И это единственный верный способ оптимизации скорости для этой задачи. Кроме того, он пытается не оценивать все, как в примере с массивом C,
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
но разумно использовать массив указателей на функции, чтобы сделать намного более быстрые безусловные переходы (jmp / call) с гораздо более быстрой адресной арифметикой, как оптимизированную версию " переключатель () - случай .. ". Этот метод также может быть полезен в некоторых типах конечных автоматов, таких как эмуляторы процессора, исполнители, анализаторы потока команд и т. Д., Где скорость имеет значение, а подобный кодswitch(x%4) case(0):... case(1):...
не подходит, поскольку он генерирует несколько команд cmp / jnz; и это дорогостоящие операции для процессораСамая простая и самая короткая тестовая программа (в условиях по умолчанию) для случая будет выглядеть следующим образом:
Это добавит всего 12 байтов полезной нагрузки и увеличит наш размер до 127 байтов;
Но вам лучше сказать компоновщику использовать
f
функцию в качестве точки входа, а неmain
. Именно так, если мы стремимся получить максимально быстрый рабочий двоичный файл для этой задачи из кратчайшего кода ;-) Это происходит потому, что библиотека C добавляет дополнительный код init / shutdown перед вызовом функции main ().Код компилируется в MSVS Community 2015 без каких-либо уловок и проблем и дает правильные результаты. Я не проверял это с gcc, но я уверен, что он также будет работать нормально.
источник
R,
4742 байтаПрименяет функцию
-
,+
,*
или^
на основе модуляx
кx
иx
.-
единственная (несколько) умная вещь, так какx-x
как всегда 0.R, 33 байта
Тот же метод, что и другие люди. Хотя это короче, мне это не так нравится.
источник
Pyth , 12 байт
Попробуйте онлайн!
Как это работает
Во-первых, обратите внимание, что
x&3
эквивалентноx%4
, где%
по модулю. Тогда, так как Pyth использует модульную индексацию (a[n] == a[n+len(a)]
), поэтому нам даже не нужно иметь с этим дело.Затем:
x%4==0
вернусьx-x
(для согласованности);x%4==1
вернусьx+x
;x%4==2
вернусьx*x
;x%4==3
, возвратx^x
.Подробнее о польской нотации: Википедия (очень плохо, если вы в Турции).
источник
Japt , 13 байт
Попробуйте онлайн!
При этом используется тот же метод, что и в других ответах eval, за исключением того, что программа
-U
просто отрицаетU
, поэтому^
вместо него мы используем (побитовый XOR)источник
Vim, 50 байтов
Здесь
^V
представляет собойCtrl+V
,^R
представляетCtrl-R
и^[
представляетesc
ключРаботает, сначала создав выражение, а затем позволяя
bc
оценить его. Ожидается ввод в первой строке в противном случае пустой буфер.Объяснение:
источник
^V
D
вместоd$
Pyth, 9 байт
Тестирование
Ничего особенного здесь не происходит, просто рассчитайте четыре значения и выберите одно с модульной индексацией.
источник
Пакет, 135 байт
Я надеялся создать возведение в степень, создавая и оценивая строку формы в
[0+...+0, 2+...+2, x+...+x, x*...*x]
зависимости от последних двух битов,x
но, к сожалению, код для выбора операции занял слишком много времени, чтобы выразить, потому что я не мог использовать*
в качествеfor
параметра, но я был по крайней мере, в состоянии использовать некоторую хитрость падения, чтобы убрать несколько байтов.источник
Сетчатка , 87 байт
Попробуйте онлайн!(Ссылка включает тестовый набор.)
Объяснение: первые две строки преобразуют ввод в унарный код и дублируют его (теперь мы имеем
x;x
). Следующие две строки искатьx&3
либо0
или1
и измененияx;x
вx;0
илиx;2
надлежащим образом . Следующие две строки ищутx&3==3
и заменяютx;x
наx;x;x;...;x;1;x
(x
x
s). Это означает , что мы имеем либоx;0
,x;2
,x;x
, илиx;...;x
и остается умножить все вместе и преобразовать обратно в десятичной системе . (Код умножения основан на коде в вики Retina, но изменен для обработки умножения на ноль.)источник