Один поганий термінальний оператор заслуговує іншого


18

Сьогоднішній щоденний 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", якщо ваш вибраний ідентифікатор має однаковий бал для гольфу.
  • Немає виклику зовнішніх ресурсів для здійснення пошуку.
  • Діють звичайні правила гольф-коду.

Чи дозволяється нам зберігати FailSafe в іншій змінній (наприклад, f=FailSafeчи щось подібне)?
ProgramFOX

@ProgramFOX Це добре, але це завдання включено до підрахунку. Без котла, який веде вас до точки, де є змінна на ім'я FailSafe.
billpg

Не могли б ви досить роздрукувати код для нас? Або виклик зрозуміти виклик?
Джон Дворак

3
@JanDvorak Я не впевнений, що можу ...
billpg

2
Я сподіваюсь це: pastebin.com/jzXt4fsp приємніше читати
eithed

Відповіді:


5

Рубі, 210 символів

Схожий на рішення @Jan Dvorak, але трохи функціональніший і трохи коротший.

f=FailSafe
e=[f&1,f&2,f&4,f&8,1-f].zip(["Detection zones staying in a given state","Bad visibility","Initialization","Bad configuration","No technical alarms"]).map{|a,b|a>0&&b}-[!0]
e[0]||="Unknown"
e.join"; "

5

GolfScript, 167 символів

FailSafe.15&["Unknown"][""]"Bad configuration
Initialization
Bad visibility
Detection zones staying in a given state"
n/{`{n+1$+}+%}/1>+=n%"; "*"No technical alarms"if

Код приймає значення в змінній FailSafeі висуває результат на стек (тобто виводить рядок, якщо запускається як окрема програма). Ви можете перевірити код в Інтернеті .

Код в основному генерує масив з усіх 16 можливих результатів, вибирає повідомлення про помилку залежно від чотирьох найнижчих бітів FailSafe . Потім зовнішня ifобробляє нульовий корпус.


Я думаю, що orзамість цього ifврятував би тебе .. Але я визнаю, що не намагався розшифрувати оригінальний код.
Пітер Тейлор

4

Rebol / Red: 208 символів

Я не так зацікавлені в гольфі , як це на думці , що вкладені оператори потрійних дратують ... і відзначити це насправді хороший приклад для Rebol / Ред СПРАВІ . Це пов'язано з SWITCH і дійсно допомагає вирівняти такі речі:

f: FailSafe
append case [
    0 < f and 1 ["Detection zones staying in a given state"]
    1 < f and 2 ["Bad visibility"]
    3 < f and 4 ["Initialization"]
    7 < f and 8 ["Bad configuration"]
    f > 0 ["Unknown"]
    true ["No technical alarms"]
] "; "

Існує варіант під назвою CASE / ALL, який фактично виконує всі умови, але за замовчуванням після першого справжнього припиняється.

Я трохи "гольфую" до 208:

x: func [y] [y <(f: FailSafe) та ++ y] додайте випадок [x 0 ["Зони виявлення, що перебувають у заданому стані"] x 1 ["Погана видимість"] x 3 ["Ініціалізація"] y 7 ["Неправильна конфігурація"] f> 0 ["Невідомо"] 1 ["Немає технічних тривог"]] ";"


4

APL (172)

2↓⊃,/'; '∘,¨{⍵=0:⊂'No technical alarms'⋄0=16|⍵:⊂'Unknown'⋄'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2}FailSafe

Пояснення:

  • {... }FailSafe: генерувати рядки
    • ⍵=0:⊂'No technical alarms': 0справа
    • 0=16|⍵:⊂'Unknown': Unknownвипадок (FailSafe не 0, але перші чотири біти)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: отримайте найнижчі 4 біти в аргументі ( ⍵⊤⍨4/2), reverse ( ) та виберіть рядки для бітів, які ввімкнено ( /⍨).
  • '; '∘,¨: додати '; 'до передньої частини кожного повернутого рядка,
  • ⊃,/: об'єднайте всі рядки разом,
  • 2↓: і видаліть перші два символи (тому що '; 'на передній панелі є зайвий ).

Збережіть два байти, змінивши ⊃,/на .
Adám

3

Рубі, 183 символи

[(f=FailSafe)<1?"No technical alarms":f&15<1?:Unknown:["Detection zones staying in a given state"*f[0],"Bad visibility"*f[1],"Initialization"*f[2],"Bad configuration"*f[3]]-[""]]*"; "

Ще одне рішення Ruby, але трохи коротше інших. Це єдиний вираз, який використовує константу FailSafe(у Ruby всі великі регістри ідентифікатори є константами) для створення вихідного рядка.


в рубіні перед оголошенням слід оголосити константу (подобається FailSafe). І ви піднімаєте кодuninitialized constant FailSafe

4
@ Зелёный Як зазначено в запитанні: "Напишіть якийсь код, який приймає ціле значення з назвою FailSafe" - тому мій код (як і всі інші відповіді тут) припускає FailSafe, що вже визначений. Коли ви хочете запустити код, вам доведеться спочатку визначити константу.
Вентеро

2

JavaScript, 197 195 символів

FailSafe?['Detection zones staying in a given state','Bad visibility','Initialization','Bad configuration'].filter(function(_,i){return FailSafe&1<<i}).join('; ')||'Unknown':'No technical alarms'

відформатовано:

FailSafe
  ? [ 'Detection zones staying in a given state',
      'Bad visibility',
      'Initialization',
      'Bad configuration'
    ].filter(function(_, i) {
      return FailSafe & 1<<i;
    }).join('; ') || 'Unknown'
  : 'No technical alarms';

Можна додатково зменшити, використовуючи вирази функцій ES6 або Coffeescript.


що робити, якщо FailSafe 18? (насправді, оригінальний код виклику дивиться лише на нижчі 4 біти, тому випадок "Невідомий" насправді ніколи не виявляється!) Тож питання полягає в тому, чи насправді слід піклуватися про нього чи надавати "фіксований" алгоритм.
blabla999

@ blabla999: Він повернеться, "Bad visibility"тому що встановлено 2-бітний і жоден з інших нижчих 4 біт. UnknownВипадок відбувається , коли жоден з нижніх 4 біт не встановлений, але FailSafeце != 0- так само , як у вихідному коді (спробуйте 16). Чи варто це "виправляти", вам слід запитати ОП (у коментарі до питання), а не я ...
Бергі

ти маєш рацію - я дурний. Мене так збентежив той фрагмент коду. Вибачте за це.
blabla999

2

Рубі, 213 символів

f=failSafe
e=f&1>0?["Detection zones staying in a given state"]:[]
e+=["Bad visibility"]if f&2>1
e+=["Initialization"]if f&4>3
e+=["Bad configuration"]if f&8>7
e[0]||=f>0?"Unknown":"No technical alarms"
e.join"; "

Це буде просто чудово загорнутий у функціональне тіло ( def transform failSafe; ...; end). Він також може бути використаний як окремий вираз (обгортання в дужках, оскільки крапка з комою / новим рядком має найменший пріоритет) або як послідовність висловлювань з останнім виразом ( e.join"; "), що використовується в виразі.


Я додам правило, щоб дозволити інше ім’я.
billpg

e+=["Initialization"]if f&4>3Я хочу цього в Python.
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs вас не вразило []||=?
Джон Дворак

Не впевнений, що це робить ... Також: Так since FailSafe must be a constant in Ruby. Ставлення Python більше схоже на "Так, ви можете порушити речі, але не сподівайтесь, що я
очищую

1
@ ɐɔıʇǝɥʇuʎs ||=як, +=але з ||- a ||= bеквівалентно a = a || b. Він зазвичай використовується для замовчування змінної, коли вона хибна.
Аарон Дюфур

1

VBScript, 204 234 232 символи

(відредагувати: покращений бал на 2, використовуючи array (), а не split (). 232 зараз.)

f=failsafe:for b=0to 3:s=s&split(",; Detection zones staying in a given state,; Bad visibility,,; Initialization,,,,; Bad configuration",",")(f and 2^b):next:array("No technical alarms","Unknown",mid(s,3))(2+(f=0)+(len(s)=0))

(редагувати: забули "невідому" частину. 234 символів зараз.)

f = failsafe: для b = 0 до 3: s = s & split (",; зони виявлення, що перебувають у заданому стані;; погана видимість ,,; ініціалізація ,,,,; неправильна конфігурація", ",") (f і 2 ^ b): далі: розділити ("Немає технічних тривог, невідомо", & mid (s, 3), ",") (2+ (f = 0) + (len (s) = 0))

(оригінал, 230)

для b = 0 до 3: s = s & split (",; зони виявлення, що перебувають у заданому стані;; погана видимість ,,; ініціалізація ,,,,; неправильна конфігурація", ",") (FailSafe та 2 ^ b): наступний : масив (середина (s, 3), "Немає технічних тривог") (- (len (s) = 0))

Звичайно, це лише частина сценарію. щоб перевірити це, спробуйте щось подібне:

FailSafe=cint(inputbox("Please enter Failsafe as an integer"))
f=failsafe:for b=0to 3:s=s&split(",; Detection zones staying in a given state,; Bad visibility,,; Initialization,,,,; Bad configuration",",")(f and 2^b):next
msgbox array("No technical alarms","Unknown",mid(s,3))(2+(f=0)+(len(s)=0))

я теж забув випадок Невідомий ;-)
blabla999

@ blabla999 Дійсно. Виправлено. Спасибі!
JesterBLUE

1

Маленький розмова, 243 символи

FailSave>15ifTrue:'Unknown'ifFalse:[((((1to:4)select:[:b|FailSafe isBitSet:b])collect:[:b|#('Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration')at:b])asStringWith:'; ')ifEmpty:'No technical alarms']     

відформатовано для читабельності:

FailSafe > 15 
    ifTrue:'Unknown'
    ifFalse:[
        ((((1 to:4)
            select:[:b | FailSafe isBitSet:b ])
                collect:[:b| 
                    #( 'Detection zones staying in a given state'
                       'Bad visibility'
                       'Initialization'
                       'Bad configuration') at:b ]
                    ) asStringWith:'; ')
                        ifEmpty:'No technical alarms']

Дякуємо Бергі за те, що вказав на помилку в першій версії.

Це висуває ідею: якщо я зіставити значення FailSafe в 6-бітну маску (відображення 0 -> 16 і більше-15 -> 32), я можу позбутися остаточних тестів. Відображення 6-бітної маски m можна виконати за допомогою:

m := {16},(1 to: 15) at:FailSafe+1 ifAbsent:32.

тобто m буде 16 для нульових FailSafe, а 32 - для значень поза межами. Потім виберіть і збирайте рядки, як зазначено вище. Це дає новий код:

m := {16},(1 to:15) at:FailSafe+1 ifAbsent:32.
(((1 to:6) select:[:b | m isBitSet:b ])
        collect:[:b| 
            #( 'Detection zones staying in a given state'
               'Bad visibility'
               'Initialization'
               'Bad configuration'
               'No technical alarms'        
               'Unknown') at:b ]
               ) joinWithAll:'; '

(Я також замінив asStringWith: на joinWithAll :, що є псевдонімом).

Хоча це здається приємною ідеєю, це має однаковий підрахунок символів - зітхання. Можливо, якась інша мова програмування із щільнішими іменами операторів набирає тут кращих результатів!

Я міг би зберегти кілька знаків, не використовуючи тимчасову змінну для m, але перерахувати її у циклі і не використовуючи буквальний масив для векторного рядка, щоб отримати підрахунок трохи нижче 240 символів.

Нарешті, маску m можна було також обчислити m:={32},(1 to: 16) at:(FailSafe+1 min:17) , яка може бути коротшою в APL. Потім обмінюються останніми двома рядками у векторі.

PS: Перша версія передбачає, що FailSafe є негативною, як і деякі інші рішення тут. Другий може мати справу з чим завгодно, навіть нульовим чи іншим не номером.


2
Що з Unknownконфігурацією?
Бергі

Пробачте - я мушу це виправити.
blabla999

0

CoffeeScript, 161 160 221 символів

F = FailSafe;F<16 and (F and [0..3].filter((i)->(1<<i)&F).map((i)->(['Detection zones staying in a given state','Bad visibility','Initialization','Bad configuration'])[i]).join('; ') or 'No technical alarms') or 'Unknown'

Що сталося Unknownі No technical alarms?
Бергі

3
Ау дерьмо. Я повинен був підозріло ставитись до відповіді GolfScript ...
Райан Кеннеді

Як завжди, я забув крайні справи ...
Райан Кеннеді

0

VB.net

Function StateText(f As FailFlag) As String
  If f=0 Then Return "No Technical Alarm"
  Dim t=""
  If f.HasFlag(f1) Then t &= "Detection zones staying in a given state; "
  If f.HasFlag(f2) Then t &= "Bad visibility; "
  If f.HasFlag(f4) Then t &= "Initialization; "
  If f.HasFlag(f8) Then t &= "Bad configuration; "
  Return If( t<>"", t.TrimEnd("; "),"Unknown")
End Function

<Flags>
Enum FailFlag
  f1 = 1
  f2 = 2
  f4 = 4
  f8 = 8
End Enum

Редагувати: кращий запис

Function StateText(f As FailFlag) As String
  If f = 0 Then Return "No Technical Alarm"
  Dim t = String.Join("; ",
            From e In [Enum].GetValues(GetType(FailFlag))
            Where f.HasFlag(e)
            Select [Enum].GetName(GetType(FailFlag), e).Replace("_", " "))
  Return If( t<>"", t,"Unknown")
End Function

<Flags>
Enum FailFlag
  Detection_zones_staying_in_a_given_state = 1
  Bad_visibility = 2
  Initialization = 4
  Bad_configuration = 8
End Enum

0

Perl, 208 197 Персонажі

$f=$FailSafe;%m=(1,'Detection zones staying in a given state',2,'Bad visibility',4,'Initialization',8,'Bad configuration');($f?join'; ',@m{map{$f&$_?$_:()}1,2,4,8}:'No technical alarms')||'Unknown'

З кодовим кодом, щоб він працював:

#!/usr/bin/env perl
$FailSafe=17;
print failmsg() . "\n";

sub failmsg {
$f=$FailSafe;%m=(1,'Detection zones staying in a given state',2,'Bad visibility',4,'Initialization',8,'Bad configuration');($f?join'; ',@m{map{$f&$_?$_:()}1,2,4,8}:'No technical alarms')||'Unknown'
}

Перечитайте код: немає перевірки меж.
titanofold

0

Символи Java 275 (не рахуючи зайвого пробілу)

    String s = "";
    int b = 1;
    for (String m : new String[]{"Detection zones staying in a given state; ","Bad visibility; ", "Initialization; ", "Bad configuration; "}) {
        if ((FailSafe & b) != 0) s = s + m;
        b <<= 1;
    }
    return (s.length() == 0) ? (FailSafe == 0) ? "No technical alarms" : "Unknown" : s.substring(0, s.length() - 2);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.