Сегодняшний Daily WTF цитирует следующую строку кода ...
FailSafe==0?'No technical alarms':((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&4)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad visibility;
Initialization; Bad configuration':((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&4)!=0?'Detection zones staying in a given state; Bad visibility; Initialization':
((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad visibility; Bad configuration':((FailSafe&1)!=0&&(FailSafe&4)!=0&&
(FailSafe&8)!=0?'Detection zones staying in a given state; Initialization; Bad configuration':((FailSafe&2)!=0&&(FailSafe&4)!=0&&(FailSafe&8)!=0?'Bad visibility;
Initialization; Bad configuration':((FailSafe&1)!=0&&(FailSafe&2)!=0?'Detection zones staying in a given state; Bad visibility':((FailSafe&1)!=0&&(FailSafe&4)!=0?'Detection
zones staying in a given state; Initialization':((FailSafe&1)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad configuration':((FailSafe&2)!=0&&
(FailSafe&4)!=0?'Bad visibility; Initialization':((FailSafe&2)!=0&&(FailSafe&8)!=0?'Bad visibility; Bad configuration':((FailSafe&4)!=0&&(FailSafe&8)!=0?'Initialization; Bad
configuration':((FailSafe&1)!=0?'Detection zones staying in a given state':((FailSafe&2)!=0?'Bad visibility':((FailSafe&4)!=0?'Initialization':((FailSafe&8)!=0?'Bad
configuration':'Unknown')))))))))))))))
Напишите некоторый код, который принимает целочисленное значение с именем FailSafe и возвращает ту же строку, что приведенный выше код будет производить из того же целочисленного значения.
- Задача состоит в том, чтобы переписать эту строку, чтобы «стандартный» код был бесплатным, включая любой код, который загружает целочисленное значение и выводит строку. Считается только код, который выполняет вышеуказанное преобразование из целого числа в строку.
- Вы можете использовать другое имя для «FailSafe», если хотите, если выбранный вами идентификатор имеет ту же оценку в гольфе.
- Нет вызова внешних ресурсов для выполнения поиска.
- Применяются нормальные правила игры в гольф.
f=FailSafe
или что-то в этом роде)?Ответы:
Рубин, 210 символов
Похоже на решение @Jan Dvorak, но более функционально и немного короче.
источник
GolfScript, 167 символов
Код принимает значение в переменной
FailSafe
и помещает результат в стек (т. Е. Выводит строку, если запускается как отдельная программа). Вы можете проверить код онлайн .Код в основном генерирует массив всех 16 возможных результатов, выбирает сообщение об ошибке в зависимости от четырех младших битов
FailSafe
. Затем внешнийif
обрабатывает нулевой регистр.источник
or
вместо того,if
чтобы спасти вас.
. Но я признаю, что я не пытался расшифровать оригинальный код.Rebol / Red: 208 символов
Я не так заинтересован в этом, как согласиться с тем, что вложенные троичные операторы раздражают ... и упоминание, что это на самом деле хороший пример для CASE Rebol / Red . Это связано с SWITCH и действительно помогает сгладить такие вещи:
Существует вариант с именем CASE / ALL, который фактически выполняет все условия, но значение по умолчанию просто останавливается после первого истинного.
Я буду "гольфить" это немного до 208:
источник
APL (172)
Объяснение:
{
...}FailSafe
: генерировать строки⍵=0:⊂'No technical alarms'
:0
дело0=16|⍵:⊂'Unknown'
:Unknown
case (FailSafe не 0, но первые четыре бита)'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2
: получить младшие 4 бита в аргументе (⍵⊤⍨4/2
), reverse (⌽
) и выбрать строки для битов, которые включены (/⍨
).'; '∘,¨
: добавить'; '
в начало каждой возвращаемой строки,⊃,/
: объединить все строки вместе,2↓
: и удалите первые два символа (потому что есть дополнительный'; '
в передней.)источник
⊃,/
на∊
.Рубин, 183 символа
Еще одно решение Ruby, но немного короче других. Это единственное выражение, которое использует константу
FailSafe
(в Ruby все идентификаторы в верхнем регистре являются константами) для создания выходной строки.источник
FailSafe
) перед использованием. И вы код поднятьuninitialized constant FailSafe
FailSafe
он уже определен. Когда вы захотите запустить код, вы должны сначала определить константу самостоятельно.JavaScript,
197195 символовотформатирован:
Может быть дополнительно уменьшено с помощью выражений функций ES6 или Coffeescript.
источник
"Bad visibility"
потому что установлен 2-битный, а остальные 4 младших бита отсутствуют.Unknown
Случай происходит , когда ни один из нижних 4 бит не установлен, ноFailSafe
это!= 0
- так же , как в исходном коде (попробуйте16
). Должны ли мы «исправить» это, вы должны спросить у ОП (в комментарии к вопросу), а не у меня…Рубин, 213 символов
Это будет прекрасно работать в теле функции (
def transform failSafe; ...; end
). Его также можно использовать как одно выражение (заключить в скобки, так как точка с запятой / новая строка имеет самый низкий приоритет) или как последовательность операторов с последним выражением (e.join"; "
), используемым в выражении.источник
e+=["Initialization"]if f&4>3
Я хочу это в Python.[]||=
?since FailSafe must be a constant in Ruby
Ха. Отношение Питона больше похоже на «Да, вы можете что-то сломать, но не ждите, что я||=
это как,+=
но с||
-a ||= b
эквивалентноa = a || b
. Обычно это используется по умолчанию для переменной, когда она ложная.VBScript,
204 234232 символа(edit: улучшил счет на 2, используя array () вместо split (). 232 сейчас.)
(редактировать: забыл "неизвестную" часть. 234 символов сейчас.)
f = отказоустойчивый: для b = 0 до 3: s = s & split (",; зоны обнаружения остаются в заданном состоянии ;; плохая видимость ,,; инициализация ,,,;; плохая конфигурация", ",") (f и 2 ^ b): следующее: split («Нет технических аварийных сигналов, неизвестно», & mid (s, 3), «,») (2+ (f = 0) + (len (s) = 0))(оригинал, 230)
для b = 0 до 3: s = s & split (",; Зоны обнаружения, находящиеся в данном состоянии ,; Плохая видимость ,,; Инициализация ,,,,; Плохая конфигурация", ",") (FailSafe и 2 ^ b): далее : массив (средний (s, 3), «Нет технических аварий») (- (len (s) = 0))Конечно, это всего лишь часть сценария. чтобы проверить это, попробуйте что-то вроде этого:
источник
Smalltalk, 243 персонажа
отформатирован для удобства чтения:
Спасибо Берги, за указание на ошибку в первой версии.
Это порождает идею: если я сопоставлю значение FailSafe с 6-битной маской (отображение 0 -> 16 и больше-15 -> 32), я смогу избавиться от финальных тестов. Отображение на 6-битную маску m можно выполнить с помощью:
m := {16},(1 to: 15) at:FailSafe+1 ifAbsent:32.
то есть m будет 16 для нулевого FailSafe и 32 для значений за пределами. Затем выберите и соберите строки, как указано выше. Это дает новый код:
(Я также заменил asStringWith: на joinWithAll:, который является псевдонимом).
Хотя это кажется хорошей идеей, у нее одинаковое количество символов - вздох. Может быть, какой-нибудь другой язык программирования с более плотными именами операторов будет лучше!
Я мог бы сохранить несколько символов, не используя временную переменную для m, но пересчитав ее в цикле и не используя буквальный массив для строкового вектора, чтобы получить счетчик чуть меньше 240 символов.
Наконец, маска m также может быть вычислена
m:={32},(1 to: 16) at:(FailSafe+1 min:17)
, что может быть короче в APL. Затем поменяйте две последние строки в векторе.PS: первая версия предполагает, что FailSafe неотрицательна, как некоторые другие решения здесь. Второй может иметь дело с чем угодно, даже с нулем или другими не числами.
источник
Unknown
конфигурации?CoffeeScript,
161 160221 символисточник
Unknown
иNo technical alarms
?VB.net
Изменить: лучший вход
источник
Perl,
208197 символовС шаблоном кода, чтобы он работал:
источник
Java 275 символов (не считая ненужных пробелов)
источник