Qué hace este botón?

11

Actualmente en mi trabajo nos mudamos a un nuevo edificio. Se supone que es lo último en tecnología y tiene luces automáticas, persianas enrollables automáticas, y ahora es conocido como el edificio más ecológico de esta ciudad.
Sin embargo, en realidad no funciona tan bien. Las persianas enrollables a veces bajan en días nublados y se levantan cuando el sol comienza a brillar, y las luces a veces causan efectos de discoteca alternando el encendido y apagado cada 5-10 minutos. Además, no tenemos ninguna forma manual de controlar estas persianas enrollables, ni la temperatura, PERO tenemos un control remoto para las luces.
Sin embargo, estos controles remotos vienen sin manual de instrucciones y contienen poco más de 20 botones que hacen todo tipo de cosas excepto lo que parece querer ...

PD: escribí este desafío hace 1,5 meses en el Sandbox. Actualmente, de alguna manera, sabemos cómo funcionan los controles remotos.
Una gran ventaja de este edificio es que es más de 30 grados centígrados afuera, pero en el interior se mantiene la misma temperatura ambiente de 21 en todo momento.

Entonces, esa fue la introducción, y el control remoto de las luces inspiró este desafío.

Desafío:

Digamos que inicialmente tenemos una lámpara apagada:

L

Luego presionamos todo tipo de botones y luego emitimos el estado de la lámpara.

Utilizamos los siguientes números para las diferentes funciones del control remoto de la lámpara. Cuando un símbolo menos está delante de ese número, hacemos lo contrario.

  • 1= ENCENDIDO; -1= APAGADO
  • 2= Aumenta la fuerza en un 25%; -2= Disminuir (atenuar) la fuerza en un 25%.
  • 3= Incrementar el spread en un 50%; -3= Disminuir el spread en un 50%.
  • 4 = Alternar el tipo de luz.

Entonces, todo esto es bastante vago, así que vamos a profundizar un poco más lo que significa cada cosa:

Entonces, -1(APAGADO) es bastante obvio, y 1pasará al estado ENCENDIDO inicial (50% para 2y 50% para 3):

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

2y -2es qué tan lejos viaja la luz ( ==se agrega por cada 25%):

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

25%
L ==

50%
L ====

75%
L ======

100%
L ========

3y -3es qué tan lejos se extiende la luz:

0%:
L ====

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

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

(NOTA: Cuando 2y 3son ambos al 100%, tendrá este estado:

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

4 es alternar el tipo de luz.

Default:
  //
L ==
  \\

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

Entrada:

Recibirá una entrada que contiene las posibles pulsaciones de botones. Por ejemplo:

12-34

Salida:

El estado de la lámpara de luz después de presionar todos los botones de la entrada es subsecuencial. Entonces, con la entrada de ejemplo anterior, tenemos la siguiente salida:

L ------

Reglas de desafío:

  • La entrada solo contiene 1234-(y nunca -antes 4).
  • Nunca puede ir por debajo del 0% o por encima del 100%. Si un número aumenta o disminuye más allá de estos límites, puede ignorarlo.
  • Cuando la lámpara se apaga, puede ignorar cualquier acción y, cuando se vuelve a encender, se restablece al estado de ENCENDIDO inicial (50% para ambos 2y 3, y predeterminado 4). Por ejemplo: 12-1-341solo imprimirá el estado ON inicial mencionado anteriormente. (SUGERENCIA: puede ignorar todo antes del final 1de la entrada, excluyendo -1).
  • Los espacios finales iguales a la longitud de la luz o una nueva línea final no se inhiben. Sin embargo, agregar nuevas líneas innecesarias adicionales no lo es.
  • Se le permite tomar la entrada como una lista de enteros en lugar de una sola cadena. Entonces, en lugar de 12-34, puede tener [1,2,-3,4]como entrada.

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

Casos de prueba:

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
fuente
1
¿Para qué es la salida 134?
PurkkaKoodari
@ Pietu1998 Agregué el caso de prueba (y arreglé algunas cosas con respecto a los espacios después de alternar 4). Gracias por preguntar.
Kevin Cruijssen
1
No creo que la propagación para el tercer caso de prueba sea correcta.
PurkkaKoodari
1
Si la lámpara se enciende y 1se presiona, ¿se restablecen los parámetros?
PurkkaKoodari
2
¿Su oficina tiene 21º en este clima? Tengo ganas de derrotarte por envidia.
Neil

Respuestas:

6

Python 2, 221 bytes

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

Esto terminó siendo más largo de lo que esperaba. La primera línea calcula el estado de la lámpara, el resto implementa la impresión.

La entrada se proporciona a través de STDIN en forma de matriz.

Ver los casos de prueba en ideone

PurkkaKoodari
fuente
3

R, 323 320 bytes

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

Sin golf:

z=scan()

lee una línea de entrada (enteros separados por espacios)

a=c=1;b=d=2

Inicializa las variables a (on-ness), b (brillo), c (ancho), d (tipo de haz). des cero o dos, lo que significa que podemos llamar a if (d) más tarde que a if (d> 1) o similar y guardar un par de bytes.

while(any(z|1))

Una forma de escribir de golf y while(length(z))donde z es un vector entero.

El resto de la primera línea maneja la entrada a través de una switchdeclaración. La segunda línea se imprime.

Es posible que algunos de ellos <-puedan ser reemplazados =, pero creo que te comerán vivo con un alcance léxico ...

También tenga en cuenta que en R, las barras invertidas deben escaparse.

c*(c>0)es una forma de escribir de golf max(c,0)que salva a un personaje.

Si la luz no está encendida, ya que *tiene una precedencia menor que :, el for(i in a*b:-b)ciclo solo se repite 0:0.

Actualizar; ahorró 3 bytes al reemplazar el bucle en la primera línea con un for (en lugar de while). Tenga en cuenta que 1:sum(1|z)hay menos caracteres que 1:length(z)o seq_along(z). seq(z)funcionaría en la mayoría de los casos, pero no cuando zes de longitud uno. La solución dada no funcionará para la entrada de longitud cero, pero espero que esté fuera del alcance de la competencia.

JDL
fuente
2

Kotlin , 445 bytes

Mi primer golf de Kotlin, 38 bytes menos que 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"}()

Con espacios en blanco y pruebas:

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

Curiosamente, en lugar de definir la función normalmente y / printo returnla cadena creada, fue más corto usar la asignación de función (la fun f() =de una lambda evaluada. (¿Tiene sentido esa descripción?)

Solo desearía que SE tuviera el resaltado de sintaxis Kotlin adecuado

CAD97
fuente
2

Java 8, 484 483 452 446 440 bytes

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

Finalmente ... Ok, mi propio desafío es un poco más difícil de lo que esperaba ...; P

Esto, sin duda, puede jugarse utilizando un enfoque completamente diferente. Ahora primero determino qué hacer y luego lo imprimo. La impresión es en realidad el más difícil de este desafío, en mi humilde opinión.

-6 bytes gracias a @ceilingcat .

Explicación:

Pruébalo aquí.

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

Lote, 552 bytes

@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

Nota: set v=contiene un espacio final y set s=contiene tres. Esto fue realmente incómodo, ya que no puede imprimir fácilmente un número variable de |s en Batch, por lo que debe usar un marcador de posición y reemplazarlo en la declaración de eco.

Neil
fuente
0

05AB1E , 106 bytes

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

Entrada como una lista de enteros.

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

Ahora tenemos la cadena:

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

Pues:

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

Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir listas enteras? ) Para comprender por qué •Wθ¨S9ƒTª»þúÙ•6вes [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]; y Ž8Ães 2234.

Kevin Cruijssen
fuente