このボタンは何をしますか?


11

現在、私の仕事で新しい建物に移動しました。それは最新技術であると想定されており、自動照明、自動ロールダウンシャッターを備えており、現在この町で最も環境に優しい建物として知られています。
しかし、それはあまりうまくいきません。ロールダウンシャッターは曇りの日には時々下がり、太陽が輝いてくると上がり、ライトは5-10ごとにオンとオフを交互に切り替えることでディスコ効果を引き起こすことがあります。分。また、これらのロールダウンシャッターや温度を手動で制御する方法はありませんが、ライトのリモコンはあります。
ただし、これらのリモコンには取扱説明書が付属していませんが、20個を超えるボタンが含まれており、必要なものを除き、あらゆる種類の操作を実行できます。

PS:1.5か月前にSandboxでこのチャレンジを書きました。現在、私たちは、リモコンがどのように機能するかを知っています。
この建物の大きな利点の1つは、外気温が摂氏30度以上ですが、中は常に21室温であるということです。

それがイントロであり、照明のリモコンがこの課題に影響を与えました。

チャレンジ:

最初にランプをオフにしたとしましょう:

L

その後、あらゆる種類のボタンを押して、ランプの状態を出力します。

ランプのリモコンのさまざまな機能には、次の番号を使用します。マイナス記号がその番号の前にある場合、逆を行います。

  • 1=オン; -1=オフ。
  • 2=強度を25%増加させます。-2=強度を25%減少(暗く)します。
  • 3=スプレッドを50%増やします。-3=スプレッドを50%縮小します。
  • 4 =ライトの種類を切り替えます。

それで、これはすべてかなりあいまいですので、それぞれの意味をもう少し詳しく見てみましょう。

したがって、-1(OFF)はかなり明白であり1、初期のON状態になります(の場合は50%2、の場合は50%3):

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

2そして-2、光がどこまで進むかです(==25%ごとに追加されます):

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

25%
L ==

50%
L ====

75%
L ======

100%
L ========

3そして-3、光がどこまで広がるかです。

0%:
L ====

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

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

(注:2との3両方が100%の場合、この状態になります:

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

4 ライトのタイプを切り替えることです。

Default:
  //
L ==
  \\

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

入力:

可能なボタン押下を含む入力を受け取ります。例えば:

12-34

出力:

入力のすべてのボタンが連続して押された後のライトランプの状態。したがって、上記の入力例では、次の出力が得られます。

L ------

チャレンジルール:

  • 入力にはのみが含まれます1234--前には含まれません4)。
  • 0%未満または100%を超えることはできません。数値がこれらの境界を超えて増減する場合、無視できます。
  • ランプがオフになっている場合、あなたはどんな行動を無視することができますし、再びオンに戻すときには、バック初期オン状態(いずれも50%にリセットされます23、デフォルト4)。たとえば12-1-341、上記の初期のオン状態を出力します。(ヒント:1入力の最後の前のすべてを無視できます-を除き-1ます。)
  • ライトの長さに等しい後続スペースまたは単一の後続改行は禁止されていません。ただし、余分な不要な改行を追加することはありません。
  • 入力は、単一の文字列ではなく整数のリストとして取得できます。の代わりに12-34[1,2,-3,4]入力として使用できます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿することを妨げないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターを持つ関数/メソッド、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース:

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

1
出力は134何ですか?
-PurkkaKoodari

@ Pietu1998テストケースを追加しました(トグル後のスペースに関するいくつかの問題を修正しました4)。質問してくれてありがとう。
ケビンCruijssen 16

1
3番目のテストケースのスプレッドは正しいとは思わない。
-PurkkaKoodari

1
ランプが点灯して1押されている場合、パラメーターはリセットされていますか?
-PurkkaKoodari

2
この天気であなたのオフィスは21ºですか?私はあなたをen望から落とすような気がします。
ニール

回答:


6

Python 2、221バイト

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

これは思ったよりも長くなってしまいました。最初の行はランプの状態を計算し、残りは印刷を実行します。

入力は、STDINを介して配列形式で提供されます。

イデオンのテストケースを見る


3

R、323 320バイト

    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="\\"}}

ゴルフをしていない:

z=scan()

入力行を読み取ります(スペースで区切られた整数)

a=c=1;b=d=2

変数a(オンネス)、b(輝度)、c(幅)、d(ビームタイプ)を初期化します。dゼロまたは2のいずれかです。つまり、長いif(d> 1)または同様のものではなく、後でif(d)を呼び出して、数バイトを節約できます。

while(any(z|1))

while(length(z))zが整数ベクトルであるゴルフyの書き方。

最初の行の残りは、switchステートメントを介して入力を処理します。2行目が出力されます。

の一部は<-に置き換えられる可能性があり=ますが、字句スコープによって生き生きと食べられると思います...

また、Rでは、バックスラッシュをエスケープする必要があることに注意してください。

c*(c>0)max(c,0)キャラクターを救うゴルフ風の書き方です。

ライトが点灯していない場合、の*優先度はの優先度よりも低いため:for(i in a*b:-b)ループはを繰り返し0:0ます。

更新; 最初の行のループを(whileではなく)forに置き換えることで3バイトを節約しました。の1:sum(1|z)文字数は1:length(z)またはより少ないことに注意してくださいseq_along(z)seq(z)ほとんどの場合は機能しますzが、長さが1の場合は機能しません。与えられた解決策は、長さゼロの入力に対しては機能しませんが、競合の範囲外であることを望みます。


2

Kotlin、445バイト

私の最初のKotlinゴルフ、Javaより38バイト少ない:)

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"}()

空白とテストの場合:

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

興味深いことに、通常の関数printreturn作成された文字列を定義するのではなく、関数の割り当て(fun f() =評価されたラムダの)を使用する方が短かったです(その記述は意味がありますか?)

SEに適切なKotlin構文の強調表示があればいいのに


2

Java 8、484 483 452 446 440バイト

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

最後に.. OK、私自身の挑戦は思ったより少し難しいです。.; P

これは完全に異なるアプローチを使用することによって間違いなくゴルフをすることができます。私は今、まず何をすべきかを決定し、それを印刷します。実際、印刷はこの課題の中で最も難しいものです。

@ceilingcatのおかげで-6バイト。

説明:

ここで試してみてください。

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"

1

バッチ、552バイト

@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

注:set v=末尾に1つのスペースset s=が含まれ、3つが含まれます。|バッチで可変数のsを簡単に印刷できないため、これは本当に厄介でした。そのため、プレースホルダーを使用してechoステートメントで置き換える必要があります。


0

05AB1E、106 バイト

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

整数のリストとして入力します。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

“/|= 
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

これで文字列ができました:

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

それから:

¶¡               # 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)

私のこの05AB1Eヒントを参照してください(セクションでは、どのように大きな整数の圧縮方法は?圧縮整数リストにどのように?理由を理解すること•Wθ¨S9ƒTª»þúÙ•6вです[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]。とŽ8Ãです2234

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.