Satu Operator Ternary Buruk Layak Lain

18

Harian WTF hari ini mengutip baris kode berikut ...

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')))))))))))))))

Tulis beberapa kode yang mengambil nilai integer bernama FailSafe dan mengembalikan string yang sama yang akan dihasilkan oleh kode di atas dari nilai integer yang sama.

  • Tantangannya adalah menulis ulang baris itu, jadi kode "boilerplate" gratis, termasuk kode apa pun yang memuat nilai integer dan menghasilkan string. Hanya kode yang melakukan transformasi di atas dari integer ke string yang diperhitungkan.
  • Anda dapat menggunakan nama lain untuk "FailSafe" jika Anda mau, asalkan pengidentifikasi yang Anda pilih memiliki skor golf yang sama.
  • Tidak memanggil sumber daya eksternal untuk melakukan pencarian.
  • Aturan kode-golf normal berlaku.
billpg
sumber
Apakah kami diizinkan menyimpan FailSafe dalam variabel lain (misalnya, f=FailSafeatau sesuatu seperti itu)?
ProgramFOX
@ProgramFOX Tidak apa-apa, tapi tugas itu termasuk dalam hitungan. Hanya boilerplate yang mengarahkan Anda ke titik di mana ada variabel bernama FailSafe gratis.
billpg
Bisakah Anda mencetak kode ini untuk kami? Atau apakah tantangan untuk memahami tantangan itu?
John Dvorak
3
@ JanDvorak Saya tidak yakin saya bisa ...
billpg
2
Saya harap ini: pastebin.com/jzXt4fsp lebih baik untuk dibaca
eithed

Jawaban:

5

Ruby, 210 karakter

Mirip dengan solusi @Jan Dvorak tetapi sedikit lebih fungsional dan sedikit lebih pendek.

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"; "
Howard
sumber
5

GolfScript, 167 karakter

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

Kode mengasumsikan nilai dalam variabel FailSafedan mendorong hasilnya pada stack (yaitu output string jika dijalankan sebagai program mandiri). Anda dapat menguji kode secara online .

Kode ini pada dasarnya menghasilkan array dari semua 16 hasil yang mungkin, memilih pesan kesalahan tergantung pada empat bit terendah FailSafe. Yang terluar ifkemudian menangani kotak nol.

Howard
sumber
Saya pikir orbukannya ifakan menyelamatkan Anda .. Tetapi saya akui bahwa saya belum mencoba menguraikan kode asli.
Peter Taylor
4

Rebol / Merah: 208 karakter

Saya tidak tertarik bermain golf ini seperti dalam menyetujui bahwa operator ternary bersarang menjengkelkan ... dan menyebutkan ini sebenarnya adalah sebuah contoh yang bagus untuk Rebol / Red KASUS . Ini terkait dengan SWITCH dan sangat membantu meratakan hal-hal seperti ini:

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"]
] "; "

Ada varian yang disebut KASUS / SEMUA yang benar-benar akan menjalankan semua kondisi, tetapi default hanya berhenti setelah yang benar pertama.

Saya akan "bermain golf" sedikit ke 208:

x: func [y] [y <(f: FailSafe) dan ++ y] menambahkan case [x 0 ["Zona deteksi tetap dalam kondisi tertentu"] x 1 ["Visibilitas buruk"] x 3 ["Inisialisasi"] y 7 ["Konfigurasi buruk"] f> 0 ["Tidak Dikenal"] 1 ["Tidak ada alarm teknis"]] ";"

Rebmu
sumber
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

Penjelasan:

  • {... }FailSafe: menghasilkan string
    • ⍵=0:⊂'No technical alarms': 0kasusnya
    • 0=16|⍵:⊂'Unknown': Unknowncase (FailSafe bukan 0 tetapi empat bit pertama adalah)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2: dapatkan 4 bit terendah dalam argumen ( ⍵⊤⍨4/2), mundur ( ), dan pilih string untuk bit yang ada di ( /⍨).
  • '; '∘,¨: tambahkan '; 'ke depan setiap string yang dikembalikan,
  • ⊃,/: gabungkan semua string,
  • 2↓: dan hapus dua karakter pertama (karena ada tambahan '; 'di bagian depan.)
marinus
sumber
Simpan dua byte dengan mengubah ⊃,/ke .
Adám
3

Ruby, 183 karakter

[(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]]-[""]]*"; "

Namun solusi Ruby lain, tetapi sedikit lebih pendek dari yang lain. Ini adalah ekspresi tunggal yang menggunakan konstanta FailSafe(dalam Ruby, semua pengidentifikasi huruf besar adalah konstanta) untuk membuat string keluaran.

Ventero
sumber
di ruby ​​Anda harus mendeklarasikan konstanta (seperti FailSafe) sebelum menggunakan. Dan Anda meningkatkan kodeuninitialized constant FailSafe
4
@ Зелёный Seperti yang dinyatakan dalam pertanyaan: "Tulis beberapa kode yang mengambil nilai integer bernama FailSafe" - jadi kode saya (seperti semua jawaban lain di sini) menganggap FailSafesudah didefinisikan. Saat Anda ingin menjalankan kode, Anda harus menentukan sendiri konstanta terlebih dahulu.
Ventero
2

JavaScript, 197 195 karakter

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'

diformat:

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';

Lebih lanjut dapat dikurangi dengan menggunakan ekspresi fungsi ES6 atau Coffeescript.

Bergi
sumber
bagaimana jika FailSafe berusia 18? (sebenarnya, kode tantangan asli tidak hanya melihat pada 4 bit yang lebih rendah, sehingga kasus Unknown sebenarnya tidak pernah terdeteksi!) Jadi pertanyaannya adalah, apakah kita harus benar-benar peduli atau menyediakan algoritma "tetap".
blabla999
@ blabla999: Ini akan kembali "Bad visibility"karena 2-bit diatur dan tidak ada yang lebih rendah dari 4 bit lainnya. The Unknownkasus yang terjadi ketika tidak ada satu pun yang lebih rendah 4 bit diatur, tetapi FailSafeadalah!= 0 - seperti dalam kode asli (coba dengan 16). Apakah kita harus "memperbaiki" ini, Anda harus bertanya kepada OP (dalam komentar pada pertanyaan), bukan saya ...
Bergi
Anda benar - saya bodoh. Saya jadi bingung dengan potongan kode itu. Maaf untuk itu.
blabla999
2

Ruby, 213 karakter

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"; "

Ini akan bekerja dengan baik dibungkus dengan fungsi body ( def transform failSafe; ...; end). Itu juga dapat digunakan sebagai ekspresi tunggal (membungkus tanda kurung karena tanda titik koma / baris baru memiliki prioritas terendah) atau sebagai urutan pernyataan dengan ekspresi terakhir ( e.join"; ") yang digunakan dalam ekspresi.

John Dvorak
sumber
Saya akan menambahkan aturan untuk mengizinkan nama yang berbeda.
billpg
e+=["Initialization"]if f&4>3Saya ingin ini dengan Python.
ɐɔıʇǝɥʇuʎ
@ ɐɔıʇǝɥʇu apakah kamu tidak terkesan []||=?
John Dvorak
Tidak yakin apa fungsinya ... Juga: since FailSafe must be a constant in RubyHah. Sikap Python lebih seperti "Ya, Anda dapat memecahkan barang-barang, tetapi jangan berharap saya untuk membersihkan kekacauan"
ɐɔıʇǝɥʇuʎs
1
@ ɐɔıʇǝɥʇuʎs ||=seperti +=tetapi dengan ||- a ||= bsama dengan a = a || b. Ini biasanya digunakan untuk default variabel ketika itu palsu.
Aaron Dufour
1

VBScript, 204 234 232 karakter

(sunting: peningkatan skor 2 dengan menggunakan array () alih-alih split (). 232 sekarang.)

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))

(edit: lupa bagian "tidak dikenal". 234 karakter sekarang.)

f = failafe: for b = 0to 3: s = s & split (",; Zona deteksi tetap dalam keadaan tertentu,; Visibilitas buruk ,,; Inisialisasi ,,,,; Konfigurasi buruk", ",") (f dan 2 ^ b): selanjutnya: split ("Tidak ada alarm teknis, Tidak Dikenal," & pertengahan (s, 3), ",") (2+ (f = 0) + (len (s) = 0))

(asli, 230)

untuk b = 0 hingga 3: s = s & split (",; Zona deteksi tetap dalam keadaan tertentu,; Visibilitas buruk ,,; Inisialisasi ,,,,; Konfigurasi buruk", ",") (FailSafe dan 2 ^ b): berikutnya : array (mid (s, 3), "Tidak ada alarm teknis") (- (len (s) = 0))

Tentu saja, ini hanya bagian dari naskah. untuk mengujinya, coba sesuatu seperti ini:

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))
Jester BIRU
sumber
saya juga lupa kasus Tidak Diketahui ;-)
blabla999
@ blabla999 Memang. Tetap. Terima kasih!
JesterBLUE
1

Smalltalk, 243 karakter

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']     

diformat untuk dibaca:

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']

Terima kasih kepada Bergi, karena menunjuk bug di versi pertama.

Ini memunculkan ide: jika saya memetakan nilai FailSafe ke dalam topeng 6-bit, (pemetaan 0 -> 16 dan lebih besar dari 15 -> 32), saya dapat menyingkirkan tes akhir. Pemetaan ke topeng 6bit m dapat dilakukan dengan:

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

yaitu, m akan menjadi 16 untuk FailSafe nol, dan 32 untuk nilai di luar batas. Kemudian pilih dan kumpulkan string seperti di atas. Ini memberikan kode baru:

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:'; '

(Saya juga mengganti asStringWith: by joinWithAll :, yang merupakan alias).

Meskipun ini tampaknya ide yang bagus, ini memiliki jumlah karakter yang sama - desah. Mungkin beberapa bahasa pemrograman lain dengan skor nama operator yang lebih baik di sini!

Saya bisa menyimpan beberapa karakter dengan tidak menggunakan variabel sementara untuk m, tetapi menghitung ulang dalam loop dan dengan tidak menggunakan array literal untuk vektor string, untuk mendapatkan hitungan sedikit di bawah 240 karakter.

Akhirnya, mask m juga bisa dihitung dengan m:={32},(1 to: 16) at:(FailSafe+1 min:17), yang mungkin lebih pendek di APL. Kemudian tukar dua string terakhir dalam vektor.

PS: Versi pertama menganggap FailSafe adalah non-negatif, seperti beberapa solusi lain di sini. Yang kedua dapat menangani apa saja, bahkan nil atau non-angka lainnya.

blabla999
sumber
2
Bagaimana dengan Unknownkonfigurasi?
Bergi
Aduh maaf - saya harus memperbaikinya.
blabla999
0

CoffeeScript, 161 160 221 karakter

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'
Ryan Kennedy
sumber
Apa yang terjadi dengan Unknowndan No technical alarms?
Bergi
3
Aduh omong kosong. Saya seharusnya curiga ketika saya mengalahkan jawaban GolfScript ...
Ryan Kennedy
Seperti biasa, saya lupa kasing tepi ...
Ryan Kennedy
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

Edit: Entri Lebih Baik

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
Adam Speight
sumber
0

Perl, 208 197 Karakter

$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'

Dengan kode boilerplate untuk membuatnya berfungsi:

#!/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
sumber
Baca ulang kode: Tidak ada batas pemeriksaan.
titanofold
0

Java 275 karakter (tidak termasuk spasi putih yang tidak perlu )

    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);
Jeff Grigg
sumber