Напишите программу или функцию, которая выводит L
if, если она работает на архитектуре с прямым порядком байтов или B
if, если она запускается на архитектуре с прямым порядком байтов. Вывод в нижнем регистре l
или b
также приемлемо.
Там нет ввода.
Подсчет очков - это код гольф, поэтому выигрывает код с наименьшим количеством байтов.
Изменить: Согласно комментариям ниже, я уточняю, что запись должна быть в состоянии работать на любой архитектуре.
Я считаю, что это влияет только на один ответ, и этот ответ ясно показал, что это так.
B0 4C C3
, который являетсяmov al, 'L' / ret
илиunsigned char f(){ return 'L'; }
, будет правильным ответом x86.Ответы:
Python, 33 байта
sys.byteorder
либо либо,'little'
либо'big'
(и для тех из вас, кто прочтет это предложение, не глядя на код,[0]
означает взять первый символ).источник
L
иB
(или вариант в нижнем регистре), а не все слово.sys.byteorder[0]
, то есть первый символbyteorder
.C, 26 байтов
Предполагает 32-битные
int
и ASCII символы. Проверено на amd64 (little-endian) и mips (big-endian).GCC, 23 байта
Предложено feersum. Значение многосимвольных констант зависит от реализации, но, похоже, это работает в GCC. Проверено на одинаковых архитектурах.
источник
a='B\0\0L';
В\0
s можно заменить байты нуля.MATLAB / Octave, 24 байта
computer
Функция дает информацию о, ну, компьютер он работает на. Третий результат - это endianness:L
илиB
для little- или big-endian соответственно.Попробуйте это на Ideone .
источник
JavaScript ES6, 50 байт
Я не знаю, кто решил, что для объектов TypedArray было бы неплохо раскрыть нативную последовательность интерпретатора, но мы здесь.
источник
C,
3635 байтов1 байт благодаря @algmyr и @owacoder.
Кредиты здесь .
Не проверено, поскольку у меня нет машины с прямым порядком байтов.
источник
main
?1
потому что ввод не дается (а имя программы всегда считается первым аргументом)main(a){putchar("BL"[*(char*)&a]);}
.main(char a){putchar("BL"[a]);}
.Математика, 22
Это, вероятно, нарушает какое-то правило о том, что не следует использовать встроенную функцию, но я не очень заинтересован в том, чтобы найти альтернативу.
источник
&
чтобы сделать его функцией. (Но могут быть разногласия по поводу того, что составляет «программу».)С, 27
На один байт длиннее, но здесь все равно:
источник
1001100 01000010
(пробел для разделения байтов). Теперь, если вы возьмете каждый байт, вернетесь к основанию 10 и проверите таблицу ASCII, вы увидите, что эта последовательность байтов эквивалентнаLB
.htons
будет делать свое дело , иputchar
будет печатать только LSB. В системах с прямым порядком байтов, то естьB
в порядке с прямым порядком байтов,htons
будут переброшены байты, поэтому LSB естьL
.19522
на'LB'
for для предупреждений компилятора и -1 байт.Машинный код PowerPC - 20 байт
PowerPC имеет двоичный код (порядок байтов может быть установлен при запуске), поэтому этот код должен соответствовать требованию вызова для возможности запуска на машинах BE и LE. Это функция, которая возвращает 1
'L'
или'B'
зависит от установленного в настоящий момент порядка байтов.В качестве функции AFAICT он соответствует SVR4 PowerPC ABI (используется Linux на ppc32), PowerOpen ABI (используется, например, AIX) и OS X ABI. В частности, он опирается только на тот факт, что GPR 0 является энергозависимым чистым регистром, а GPR 3 используется для возврата «маленьких» значений.
Теперь это выглядит так:
rlwinm
Экстракты только , что бит: оно принимает значение в GPR0, г otates л EFT на 1 место (так что теперь находится в положении 0) и м запрашивает его с 1 (маской , получаемой от этого 31,31 2 ); результат заносится в регистр ГП 3;'B'
) (10 - разница между'L'
и'B'
)Примечания
для тех, кто заинтересован, смотрите документацию по rlwinm ; почти ничего не зная о PowerPC, я нашел такие инструкции чрезвычайно интересными.
2018 Обновления : Raymond Chen публикует серию об архитектуре PowerPC, вы можете найти здесь свое большое сообщение о
rlwinm
& друзьям.источник
Java 8,
96, 6452 байтаГольф на основе этого ответа . Вся заслуга принадлежит @LeakyNun и @AlanTuning. Ява продолжает проигрывать.
96 байт:
64 байта:
Непроверенный б / у У меня нет доступа к машине с прямым порядком байтов.
источник
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
Perl,
3836 байтРаботает, упаковывая число в порядке байтов системы по умолчанию и сравнивая его с числом, упакованным в порядке байтов с прямым порядком байтов.
источник
(G) Далее, 24 байта
Предполагается, что ячейки 32-битные (и что ваш интерпретатор Forth поддерживает базовые префиксы Gforth ). Он просто сохраняет число 0x4200004C в памяти, а затем отображает байт в нижнем конце.
источник
C, 34 байта
Это предполагает кодировку символов ASCII
Звони без аргументов.
Объяснение:
При вызове
a
будет 1.*(char*)a
Доступ к первому байтуa
, который на платформах с прямым порядком байтов будет равен 1, на платформах с прямым порядком байтов будет 0.Таким образом, на платформах с прямым порядком байтов этот код будет передавать 66 + 10 * 0 = 66
putchar
. 66 - это код ASCII дляB
. На платформах с прямым порядком байтов он пройдет 66 + 10 * 1 = 76, что является кодом ASCIIL
.источник
C #,
6052 байтаC # на удивление конкурентоспособен в этом.
Кредиты Groo для синтаксиса C # 6.
60 байтов:
источник
char e=>System.BitConverter.IsLittleEndian?'L':'B';
конечно, это (как и ответ Java) на самом деле не печатает значение.Юлия,
2419 байтЭто анонимная функция, которая не принимает никаких данных и возвращает a
Char
. Чтобы вызвать его, назначьте его переменной. Предполагается, что целые числа являются 64-битными.ntoh
Функция преобразует байтов в значение , переданное в него из сетевого порядка байт (большой байтов) к используемому хост - компьютером. На машинах с прямым порядком байтовntoh
это функция идентификации, поскольку преобразование не требуется. На маленьких байтовых машинах байты меняются местамиntoh(5) == 360287970189639680
. Что также, возможно, более читабельно, равно:0000010100000000000000000000000000000000000000000000000000000000
в двоичном.Если мы сместим правильный результат
ntoh(5)
на 55, мы получим 0 на машинах с прямым порядком байтов и 10 на машинах с прямым порядком байтов. Добавив это к символьной константе'B'
, мы получим'B'
или'L'
для больших или маленьких порядковых машин соответственно.5 байтов сэкономлено благодаря FryAmTheEggman и Деннису!
источник
()->ntoh(5)>>55+'B'
?f()='L'-ntoh(10)%16
иf()='L'-ntoh(10)&10
должен работать на всех платформах.PHP 5.6,
4131 байт (thx to isertusernamehere)<?=unpack(S,"\x01\x00")[1]-1?B:L;
PHP 7, 41 байт
echo unpack('S',"\x01\x00")[1]-1?'B':'L';
Идея украдена у: https://stackoverflow.com/a/24785578/2496717
источник
<?=unpack(S,"\x01\x00")[1]-1?B:L;
.Common Lisp, 27 байт
Проверено на SBCL и ECL. Для портативного подхода следует использовать тривиальные особенности .
#+
Обозначения являются условием для чтения времени , который считывает следующую форму , только если условное выражение истины. Здесь условие представляет собой весь#+big-endian
текст, который означает, что тест выполняется, если:big-endian
ключевое слово принадлежит*FEATURES*
списку (список, который содержит, помимо прочего, информацию, относящуюся к платформе). Следующее выражение'B
, которое либо читается, либо пропускается в зависимости от результата теста. Если ваша платформа имеет формат с прямым порядком байтов и вы пишете приведенную выше форму в REPL, это точно так же, как если бы вы написали следующее:(NB.
CL-USER>
Является подсказкой)Тело функции является неявным
PROGN
, что означает, что возвращается только оценка последнего выражения. Таким образом , на самом деле выше символ возвратаB
. Однако, если условие времени чтения оценивается как ложное, форма читается так, как будто вы написали:... который просто возвращает символ
L
.источник
ARMv6 и более поздние: машинный код 20 байтов
Непроверенный, поскольку у меня нет подходящей машины в руки. Бит 9 CPSR дает текущий порядок загрузки / сохранения.
источник
BX lr
не так ли?) Вместоputchar
, потому чтоr0
это правильный регистр для возвращаемого результата.Perl 5, 21 + 1 = 22 байта
Беги с
perl -E
.Проверено на amd64 (little-endian) и mips (big-endian).
источник
-E
флаг действительно необходимо в счетчику байтов? Можно просто сказать, что вы используете Perl 5.10 (посколькуsay
команда доступна в этой версии)use 5.10.0;
это еще много байтов!-E
переключения илиuse
оператора дляsay
.-E
является "бесплатным" на PPCG. Не нужно ничего добавлять.-n
и-p
нет)R,
2823 байта.Platform$endian
возвращает,big
если работает на старшем порядке иlittle
если на маленьком. Здесь, используяsubstr
, он возвращает первую букву вывода, так что либоb
илиl
.Поскольку
endian
это единственный объект, начинающийся сe
содержащегося в объекте,.Platform
мы можем уменьшить его благодаря частичному сопоставлению со следующим 23-байтовым кодом:источник
Clojure,
4644 байтаЭто функция, которая использует встроенную функцию Java для получения порядкового номера машины. Затем получите его строковое представление, которое будет либо,
"LITTLE_ENDIAN"
либо,"BIG_ENDIAN"
и получите первый символ любой выбранной строки и верните ее.Сохранено 2 байта благодаря @ cliffroot .
источник
#(nth(str(java.nio.ByteOrder/nativeOrder))0)
на 2 байта корочеРубин,
3130 символовХм, должно быть, лучше. Считайте на 5 символов меньше, если символ не нужно выводить, так как я думаю, что другие решения не включают печать. то есть удалите часть «вводит», если вы не хотите, чтобы что-то печаталось.
источник
?L
и?B
вместоputs :L
иputs "B"
puts [76,66].pack("s")[0]
будет работать.puts [76,66].pack("s>")[0]
. Это означает, что возможно не работать с прямым порядком байтов по какой-то причине, которую я плохо понимаю. Но этот, кажется, работает (получено из вашего решения)puts [19522].pack("s>")[0]
. WDYT? Интересно, смогу ли я найти место для оценки с прямым порядком байтов?Bash (и другие оболочки Unix), 32 (33) байта
Первая и вторая попытка:
Спасибо Деннису, более короткая версия:
echo
Утилита выводит символ новой строки, с шестнадцатеричным значением0A
, и никакого другого выводом. Ибо<<<a
это так61 0A
.По
od
умолчанию утилита интерпретирует входные данные как двухбайтовые слова, дополненные нулями, если число байтов нечетное, и преобразует их в восьмеричное. Это приводит к тому, что выходные данные echo интерпретируются как0A 00
, которые преобразуются в значения005000
с прямым порядком байтов или000012
с прямым порядком байтов.61 0A
становится005141
в порядке байтов и060412
в порядке байтов. Полный выход ода также включает в себя адрес и размер данных означает , что мы не можем использовать0
,1
или2
для испытания.Команда четко определена, чтобы раскрыть системный порядок. Из стандарта :
Примечания по совместимости
Я не уверен, что использование
echo|od
обратных кавычек без двойных кавычек [что приводит к аргументу из трех слов вcase
] поддерживается во всех системах. Я не уверен, что все системы поддерживают сценарии оболочки без завершающей строки. Я в основном уверен, но не на 100% в поведении od с добавлением байта заполнения в системах с прямым порядком байтов. При необходимостиecho a
может использоваться для портативных версий. Все скрипты работают в bash, ksh и zsh, а переносимые - в dash.источник
[[
od<<<a|grep -q 5&&echo L||echo B
должен работать в Bash и других.echo|od
печатал,0000000\n005000\n0000001
как вы ожидали.od -a
.PHP, 16 байт
Здесь используются два трюка, которые не используются в двух существующих ответах PHP:
^
) работает со строками, и в результате получается длина до более короткой строки, избегая необходимости индексации строки или троичного оператора.источник
Узел, 42 байта
Pro: есть встроенный Con: имена свойств очень длинные
источник
PowerShell, 44 байта
Характер 66
B
и 10 символов позже это число 76,L
. Логическое значение «true» становится1
при приведении к числу.BitConverter
это стандартный класс .NET.источник
Ракетка,
3528 байт'B
или'L
соответственно. Дайте мне знать, если это не достаточно конкретно :)источник
PHP, 22 байта
источник
Haskell (используя числовые типы с ограниченным размером только GHC), 75 байтов
(не тестируется на архитектуре с прямым порядком байтов, но похоже, что она должна работать!)
источник
К, 15 байт
Объяснение;
источник
Баш, 27 байт
䉌
( U + 424C ) кодируется в виде трех UTF-8 байт:E4 89 8C
.Предполагается, что
iconv
используется функция из glibc и используется локаль UTF-8.источник