Apa yang dilakukan tombol ini?

11

Saat ini di tempat kerja saya, kami pindah ke gedung baru. Itu seharusnya menjadi canggih dan memiliki lampu otomatis, jendela gulung otomatis, dan sekarang dikenal sebagai bangunan paling ramah lingkungan di kota ini.
Namun, itu tidak benar-benar bekerja dengan baik .. Jendela gulung kadang turun pada hari berawan dan naik ketika matahari mulai bersinar, dan lampu kadang-kadang menyebabkan efek disko dengan bergantian menghidupkan dan mematikan setiap 5-10 menit. Juga, kami tidak memiliki cara manual untuk mengendalikan jendela gulung ini, atau suhunya, TETAPI kami memiliki remote untuk lampu.
Namun remote ini datang tanpa instruksi manual dan mengandung sedikit lebih dari 20 tombol melakukan semua jenis hal kecuali untuk apa yang Anda inginkan ..

PS: Saya menulis tantangan ini 1,5 bulan yang lalu di Sandbox. Saat ini kami, agaknya, tahu bagaimana remote bekerja.
Satu keuntungan besar tentang bangunan ini, berada di luar 30 derajat Celcius, tetapi di dalamnya tetap berada pada suhu 21 kamar yang sama setiap saat.

Jadi, itulah intro, dan remote control untuk lampu menginspirasi tantangan ini.

Tantangan:

Katakanlah kita awalnya mematikan lampu:

L

Kemudian kami menekan semua jenis tombol dan mengeluarkan status lampu sesudahnya.

Kami menggunakan angka-angka berikut untuk berbagai fungsi kendali jarak jauh untuk lampu. Ketika simbol minus ada di depan angka itu, kita melakukan yang sebaliknya.

  • 1= ON; -1= MATI.
  • 2= Meningkatkan kekuatan sebesar 25%; -2= Penurunan (redup) kekuatan sebesar 25%.
  • 3= Tingkatkan spread sebesar 50%; -3= Kurangi penyebaran sebesar 50%.
  • 4 = Mengalihkan jenis cahaya.

Jadi, ini semua cukup kabur, jadi mari kita sedikit lebih dalam tentang apa arti setiap hal:

Jadi, -1(MATI) cukup jelas, dan 1akan masuk ke keadaan ON awal (50% untuk 2dan 50% untuk 3):

   //
  //
L ====
  \\
   \\

2dan -2seberapa jauh perjalanan cahaya ( ==ditambahkan untuk setiap 25%):

0% (equal to a light bulb that is OFF)
L

25%
L ==

50%
L ====

75%
L ======

100%
L ========

3dan -3seberapa jauh cahayanya menyebar:

0%:
L ====

50%:
   //
  //
L ====
  \\
   \\

100%:
|| //
||//
L ====
||\\
|| \\

(CATATAN: Kapan 2dan 3keduanya 100%, Anda akan memiliki status ini:

||   //
||  //
|| //
||//
L ========
||\\
|| \\
||  \\
||   \\

4 adalah untuk mengaktifkan jenis cahaya.

Default:
  //
L ==
  \\

After toggling (note the single space before '/' instead of two):
 /
L --
 \

Memasukkan:

Anda akan menerima input yang berisi kemungkinan penekanan tombol. Sebagai contoh:

12-34

Keluaran:

Keadaan lampu lampu setelah semua tombol input ditekan sub-sekuensial. Jadi dengan contoh input di atas, kami memiliki output sebagai berikut:

L ------

Aturan tantangan:

  • Input hanya berisi 1234-(dan tidak pernah -sebelumnya 4).
  • Anda tidak akan pernah bisa di bawah 0% atau di atas 100%. Jika suatu angka akan naik / turun di luar batas ini, Anda dapat mengabaikannya.
  • Ketika lampu dimatikan, Anda dapat mengabaikan tindakan apa pun dan ketika dinyalakan kembali, lampu akan kembali ke kondisi ON-awal (50% untuk keduanya 2dan 3, dan default 4). Sebagai contoh: 12-1-341hanya akan mencetak keadaan ON awal yang disebutkan di atas. (TIPS: Anda dapat mengabaikan semuanya sebelum 1input final - tidak termasuk -1.)
  • Jarak spasi yang sama dengan panjang cahaya atau satu garis trailing baru tidak dibatasi. Namun menambahkan baris baru yang tidak perlu tambahan.
  • Anda diizinkan mengambil input sebagai daftar bilangan bulat alih-alih satu string. Jadi alih-alih 12-34, Anda bisa memiliki [1,2,-3,4]input.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

12-34
L ------

12-1-341
   //
  //
L ====
  \\
   \\

14-3224333-2
||  //
|| //
||//
L ======
||\\
|| \\
||  \\

142-1-314-3-322
L --------

1324-2-3
  /
 /
L ----
 \
  \

134
| /
|/
L ----
|\
| \

1-2-2-214-3-3-3
L ----
Kevin Cruijssen
sumber
1
Untuk apa hasilnya 134?
PurkkaKoodari
@ Pietu1998 Saya telah menambahkan test case (dan memperbaiki beberapa hal terkait spasi setelah beralih 4). Terima kasih untuk bertanya.
Kevin Cruijssen
1
Saya pikir penyebaran untuk test case ketiga tidak benar.
PurkkaKoodari
1
Jika lampu dihidupkan dan 1ditekan, apakah parameternya diatur ulang?
PurkkaKoodari
2
Kantor Anda 21º dalam cuaca seperti ini? Saya merasa ingin menurunkan Anda karena iri.
Neil

Jawaban:

6

Python 2, 221 byte

for b in[-1]+input():exec["p=b>0;d=2;s=1;t=2","d+=b/2*(-2<d+b<6)","s+=b/3*(-3<s+b<5)","t=3-t"][abs(b)-1]
i=c=(s>0)*d*p
q='print" |"[s/2]*t+" "*i+t*%r;'
exec('i-=1;'+q%'/')*c
print"L "+" -="[t]*2*d*p
exec(q%'\\'+'i+=1;')*c

Ini akhirnya menjadi lebih lama dari yang saya harapkan. Baris pertama menghitung status lampu, sisanya menerapkan pencetakan.

Input diberikan melalui STDIN dalam bentuk array.

Lihat kasus uji pada ideone

PurkkaKoodari
sumber
3

R, 323 320 byte

    z=scan();a=c=1;b=d=2;for(i in 1:sum(1|z)){s=sign(y<-z[i]);switch(y/s,b<-d<-2*(c<-a<-y),b<-b+s,c<-c+s,d<-2-d);b=min(b,4);c=min(c,2);b=b*(b>0);c=c*(c>0)}
    s="/";v=if(c>1)"|"else" ";for(i in a*b:-b){if(i)cat(v,if(d)v,rep(" ",abs(i)-1),s,if(d)s,"\n",sep="")else{cat("L ",if(d)rep("==",b)else rep("--",b),"\n",sep="");s="\\"}}

Tidak Disatukan:

z=scan()

membaca sebaris input (bilangan bulat dipisahkan dengan spasi)

a=c=1;b=d=2

menginisialisasi variabel a (on-ness), b (kecerahan), c (lebar), d (tipe balok). dadalah nol atau dua, yang berarti kita dapat memanggil jika (d) lebih lama daripada jika lebih lama (d> 1) atau serupa dan menyimpan beberapa byte.

while(any(z|1))

Cara menulis golf-y di while(length(z))mana z adalah vektor integer.

Sisa baris pertama menangani input melalui switchpernyataan. Baris kedua dicetak.

Ada kemungkinan bahwa beberapa <-dapat diganti dengan =, tapi saya pikir Anda dimakan hidup-hidup dengan pelingkupan leksikal ...

Perhatikan juga bahwa dalam R, backslash perlu di lepas.

c*(c>0)adalah cara menulis golf-y max(c,0)yang menyelamatkan karakter.

Jika lampu tidak menyala, maka karena *memiliki prioritas lebih rendah daripada :, for(i in a*b:-b)loop hanya beralih 0:0.

Memperbarui; disimpan 3 byte dengan mengganti loop di baris pertama dengan for (daripada sementara). Perhatikan bahwa 1:sum(1|z)karakter lebih sedikit daripada 1:length(z)atau seq_along(z). seq(z)akan bekerja dalam banyak kasus, tetapi tidak ketika zpanjangnya satu. Solusi yang diberikan tidak akan bekerja untuk input dengan panjang nol tapi saya harap itu di luar lingkup kompetisi.

JDL
sumber
2

Kotlin , 445 byte

Golf Kotlin pertama saya, 38 byte kurang dari Java :)

fun f(z:IntArray)={var a=1<0;var b=2;var c=1;var d=a
z.map{when(it){1->{a=1>0;b=2;c=1;d=!a}-1->a=1<0;2->if(b<4)b+=1;-2->if(b>0)b-=1;3->if(c<2)c+=1;-3->if(c>0)c-=1;4->d=!d}}
var r="";val l=if(c>1)if(d)"|" else "||" else if(d)" " else "  "
if(c>0)for(i in b downTo 1)r+="${l+" ".repeat(i-1)+if(d)"/" else "//"}\n"
r+="L ${(if(d)"--" else "==").repeat(b)}\n"
if(c>0)for(i in 1..b)r+=l+" ".repeat(i-1)+"${if(d)"\\" else "\\\\"}\n"
if(a)r else "L"}()

Dengan ruang putih dan tes:

fun f(z: IntArray) = {
    var a = false // ON / OFF
    var b = 2 // Strength [0,4]
    var c = 1 // Spread [0,2]
    var d = a // Type

    // Find state to print
    z.map {
        when (it) {
            1 -> {
                a = true
                b = 2
                c = 1
                d = !a
            }
            -1 -> a = false
            2 -> if (b < 4) b += 1
            -2 -> if (b > 0) b -= 1
            3 -> if (c < 2) c += 1
            -3 -> if (c > 0) c -= 1
            4 -> d = !d
        }
    }

    var r = ""
    val l = if (c > 1) if (d) "|" else "||"
    else if (d) " " else "  "

    // Print state
    if (c > 0) for (i in b downTo 1) {
        r += "${l + " ".repeat(i - 1) + if (d) "/" else "//"}\n"
    }
    r += "L ${(if (d) "--" else "==").repeat(b)}\n"
    if (c > 0) for (i in 1..b) {
        r += "${l + " ".repeat(i - 1) + if (d) "\\" else "\\\\"}\n"
    }

    /* return */ if (a) r else "L"
}()

fun main(args: Array<String>) {
    println(f(intArrayOf(1, 2, -3, 4)))
    println(f(intArrayOf(1, 2, -1, -3, 4, 1)))
    println(f(intArrayOf(1, 4, -3, 2, 2, 4, 3, 3, 3, -2)))
    println(f(intArrayOf(1, 4, 2, -1, -3, 1, 4, -3, -3, 2, 2)))
    println(f(intArrayOf(1, 3, 2, 4, -2, -3)))
    println(f(intArrayOf(1, 3, 4)))
    println(f(intArrayOf(1, -2, -2, -2, 1, 4, -3, -3, -3)))
}

Menariknya, daripada mendefinisikan fungsi secara normal dan printatau returnstring yang dibuat, itu lebih pendek untuk menggunakan penugasan fungsi (yang fun f() =dari lambda yang dievaluasi. (Apakah deskripsi itu masuk akal?)

Saya hanya berharap SE memiliki highlight sintaksis Kotlin yang tepat

CAD97
sumber
2

Java 8, 484 483 452 446 440 byte

z->{int a=1,b=2,c=1,d=0,j,k;for(int i:z){d=i==1?0:i>3?1-d:d;a=i*i==1?i:a;b+=i==1?2-b:i==2&b<4?1:i==-2&b>0?-1:0;c+=i==1?1-c:i==3&c<2?1:i==-3&c>0?-1:0;}String t=d<1?"=":"-",q=d<1?"//":"/",x=d<1?"\\\\":"\\",n="\n",y=" ",w=d<1?y+y:y,g=c>1?d<1?"||":"|":w,r="";if(c>0)for(r+=g,j=b;j-->0;r+=q+n+(j>0?c>1?g:w:""))for(k=j;k-->0;r+=y);for(r+="L ",j=b;j-->0;r+=t+t);r+=n;if(c>0)for(r+=g;++j<b;r+=x+n+(j<b-1?g:""))for(k=j;k-->0;r+=y);return a>0?r:"L";}

Akhirnya .. Ok, tantangan saya sendiri sedikit lebih sulit dari yang saya harapkan ..; P

Ini tanpa diragukan lagi dapat golf dengan menggunakan pendekatan yang sama sekali berbeda .. Saya sekarang pertama-tama menentukan apa yang harus dilakukan, dan kemudian mencetaknya. Pencetakan sebenarnya adalah yang paling sulit dari tantangan ini, imho.

-6 byte terima kasih kepada @ceilingcat .

Penjelasan:

Coba di sini.

z->{                          // Method with integer-array parameter and String return-type
  int a=1,                    //  ON/OFF flag, initially ON
      b=2,                    //  Strength, initially 50%
      c=1,                    //  Spread, initially 50%
      d=0,                    //  Type of light, initially two lines
      j,k;                    //  Index-integers
  for(int i:z){               //  Loop over the input-array
    d=i==1?0:i>3?1-d:d;       //   Determine the new type of light
    a=i*i==1?i:a;             //   Determine if the light is ON/OFF
    b+=i==1?2-b:i==2&b<4?1:i==-2&b>0?-1:0;
                              //   Determine the new strength
    c+=i==1?1-c:i==3&c<2?1:i==-3&c>0?-1:0;}
                              //   Determine the new spread
  String t=d<1?"=":"-",       //  Horizontal light symbol
         q=d<1?"//":"/",      //  Upper diagonal light symbol
         x=d<1?"\\\\":"\\",   //  Bottom diagonal light symbol
         n="\n",              //  New-line
         y=" ",               //  Space
         w=d<1?y+y:y,         //  One or two spaces?
         g=c>1?d<1?"||":"|":w,//  Space(s) or vertical light symbol(s)?
         r="";                //  Result String, starting empty
  if(c>0)                     //  Do we have spread >0%?
    for(r+=g,j=b;j-->0;r+=q+n+(j>0?c>1?g:w:""))for(k=j;k-->0;r+=y);
                              //   Create upper light part
  r+="L ";                    //  Light-bulb
  for(j=b;j-->0;r+=t+t);      //  Horizontal light next to the light-bulb
  r+=n;
  if(c>0)                     //  Do we have spread >0%?
    for(r+=g;++j<b;r+=x+n+(j<b-1?g:""))for(k=j;k-->0;r+=y);
                              //   Create bottom light part
  return a>0?                 //  Is the light turned ON?
             r                //   Return the created result-String
            :                 //  Else:
             "L";}            //   Return just "L"
Kevin Cruijssen
sumber
1

Batch, 552 byte

@echo off
for %%a in (1 %*) do call:l %%a
set/aw*=o,l*=o
if %w% gtr 0 for /l %%a in (%l%,-1,1)do call:w %%a /
set s=----
if %t%==1 set s=====
call echo L %%s:~-%l%%%%%s:~-%l%%%
if %w% gtr 0 for /l %%a in (1,1,%l%)do call:w %%a \
exit/b
:w
set v= 
set u=%2
if %w%==2 set v=l
if %t%==1 set u=%2%2&set v=%v%%v%
set s=    
call set s=%%s:~-%1%%
echo %v:l=^|%%s:~1%%u%
exit/b
:l
if %1==1 set/ao=w=t=1,l=2
if %1==-1 set/ao=0
if %1==2 set/al+=1-l/4
if %1==-2 set/al-=!!l
if %1==3 set/aw+=1-w/2
if %1==-3 set/aw-=!!w
if %1==4 set/at^=1

Catatan: set v=mengandung satu spasi tambahan dan set s=mengandung tiga. Ini benar-benar aneh, karena Anda tidak dapat dengan mudah mencetak sejumlah variabel |dalam Batch, jadi Anda harus menggunakan placeholder dan menggantinya dalam pernyataan gema.

Neil
sumber
0

05AB1E , 106 byte

“/|= 
L“•Wθ¨S9ƒTª»þúÙ•6вèJ¶¡sŽ8ÃS«1¡θΣÄ}.γÄ}ODd*©н8‚ß8αF樚NÈi¨]R®θ8Öi"||//="2ô…|/-S:}®Ås3/©_iθ}®i'|ð:}».∊

Input sebagai daftar bilangan bulat.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

“/|= 
L               # Push string "/|=\nL"
  Wθ¨S9ƒTª»þúÙ• # Push compressed integer 9569494169631511496055972036
   6в            # Converted to Base-6 as list: [5,3,2,2,2,2,2,2,2,2,4,1,1,0,0,4,1,1,3,0,0,4,1,1,3,3,0,0,4,1,1,3,3,3,0,0]
     è           # Index each into the string
      J          # Join everything together

Kami sekarang memiliki string:

L ========
||//
|| //
||  //
||   //

Maka kita akan:

¶¡               # Split it by newlines: ["L ========","||//","|| //","||  //","||   //"]
s                # Swap to take the (implicit) input-list
 Ž8Ã             # Push compressed integer 2234
    S            # Converted to a list of digits: [2,2,3,4]
     «           # Append it at the end of the input-list
                 #  i.e. [4,3,3,2,1,3,2,4,-2,-3] → [4,3,3,2,1,3,2,4,-2,-3,2,2,3,4]
 1¡              # Then split on 1
                 #  i.e. [4,3,3,2,1,3,2,4,-2,-3,2,2,3,4]
                 #   → [[4,3,3,2],[3,2,4,-2,-3,2,2,3,4]]
   θ             # Only leave the last inner list
                 #  i.e. [[4,3,3,2],[3,2,4,-2,-3,2,2,3,4]] → [3,2,4,-2,-3,2,2,3,4]
    ΣÄ}          # Sort on the absolute value
                 #  i.e. [3,2,4,-2,-3,2,2,3,4] → [2,-2,2,2,3,-3,3,4,4]
       .γÄ}      # Then group by absolute value
                 #  i.e. [2,-2,2,2,3,-3,3,4,4] → [[2,-2,2,2],[3,-3,3],[4,4]]
           O     # Then take the sum of each group
                 #  i.e. [[2,-2,2,2],[3,-3,3],[4,4]] → [4,3,8]
            Dd   # Duplicate it, and check for each if it's non-negative (>= 0)
                 #  i.e. [4,3,8] → [1,1,1]
              *  # Multiply the two lists
                 #  i.e. [4,3,8] and [1,1,1] → [4,3,8]
               © # And store the result in the register (without popping)
н                # Now take the first value (the strength)
                 #  i.e. [4,3,8] → 4
 8              # Pair it with 8
                 #  i.e. 4 → [4,8]
   ß             # Pop and push the minimum of the two
                 #  i.e. [4,8] → 4
    8α           # And then calculate the absolute difference with 8
                 #  i.e. 4 → 4
      F          # Loop that many times:
       ć         #  Extract the head of the string-list
                 #   i.e. ["L ========","||//","|| //","||  //","||   //"] → "L ========"
        ¨        #  Remove the last character
                 #   i.e. "L ========" → "L ======="
         š       #  And prepend it back to the list again
                 #   i.e. ["||//","|| //","||  //","||   //"] and "L ======="
                 #    → ["L =======","||//","|| //","||  //","||   //"]
       NÈi       #  And if the loop-index is even:
          ¨      #   Also remove the last item of the string-list
                 #    i.e. ["L =======","||//","|| //","||  //","||   //"]
                 #     → ["L =======","||//","|| //","||  //"]
      ]          # Close both the if and loop
                 #  i.e. ["L ========","||//","|| //","||  //","||   //"] and 4
                 #   → ["L ====","||//","|| //"]
       R         # Then reverse the list
                 #  i.e. ["L ====","||//","|| //"] → ["|| //","||//","L ===="]
®                # Push the list from the register again
 θ               # Now take the last value (the toggle)
                 #  i.e. [4,3,8] → 8
  8Öi         }  # If it's divisible by 8:
                 #  i.e. 8 → 1 (truthy)
     "||//="     # Push string "||//="
            2ô   # Split into parts of size 2: ["||","//","="]
     …|/-        # Push string "|/-"
         S       # Split into characters: ["|","/","-"]
     :           # And replace all of them in the string-list
                 #  i.e. ["|| //","||//","L ===="] → ["| /","|/","L ----"]
®                # Push the list from the register again
 Ås              # Now take the middle value (the spread)
                 #  i.e. [4,3,8] → 3
   3/            # Divide it by 3
                 #  i.e. 3 → 1
     ©           # Store it in the register (without popping)
      _i }       # If it's exactly 0:
                 #   i.e. 1 → 0 (falsey)
        θ        #  Only leave the last value of the string-list
     ®i    }     # If it's exactly 1 instead:
                 #   i.e. 1 → 1 (truthy)
       '|ð:     '#  Replace all "|" with spaces " "
                 #   i.e. ["| /","|/","L ----"] → ["  /"," /","L ----"]
»                # Then join the string-list by newlines
                 #  i.e. ["  /"," /","L ----"] → "  /\n /\nL ----"
 .∊              # And finally intersect mirror everything vertically
                 # (which automatically converts the slashes)
                 #  i.e. "  /\n /\nL ----" → "  /\n /\nL ----\n \\n  \"
                 # (And output the result implicitly)

Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? Dan Cara daftar bilangan bulat kompres? ) Untuk memahami mengapa •Wθ¨S9ƒTª»þúÙ•6вadalah [5,3,2,2,2,2,2,2,2,2,4,1,1,0,0,4,1,1,3,0,0,4,1,1,3,3,0,0,4,1,1,3,3,3,0,0]; dan Ž8Ãadalah 2234.

Kevin Cruijssen
sumber