Hacer un corredor de emergencia


46

En algunas naciones hay recomendaciones o leyes sobre cómo formar corredores de emergencia en las calles que tienen múltiples carriles por dirección. (A continuación, solo consideramos los carriles que van en la dirección en la que estamos viajando). Estas son las reglas que se aplican en Alemania:

  • Si solo hay un carril, todos deben conducir a la derecha de manera que los vehículos de rescate puedan pasar a la izquierda.
  • Si hay dos o más carriles, los autos en el carril más a la izquierda deben conducir hacia la izquierda, y todos los demás deben moverse hacia la derecha.

Desafío

Dado el número N>0de carriles regulares, muestre el diseño de los carriles cuando se forme un corredor de emergencia utilizando una cadena de N+1caracteres ASCII. Puede utilizar dos caracteres, desde el código ASCII 33hasta 126uno, para denotar el corredor de emergencia y otro para denotar los automóviles. Se permiten espacios finales o iniciales, saltos de línea, etc.

Ejemplos

Aquí lo estamos utilizando Epara el corredor de emergencia y Cpara los automóviles.

N  Output
1  EC
2  CEC
3  CECC
4  CECCC
5  CECCCC
6  CECCCCC
   etc

18
No voy a caer en esto! Solo está buscando un carril propio para deslizarse a través de su astuta serpiente.
orlp

16
@PmanAce Realmente no creo que flawr necesite nuestra ayuda para esto: P
orlp

8
+1 porque realmente funciona en Alemania. Estaba en la situación el fin de semana pasado.
ElPedro

10
@ msh210 Creo que las imágenes en la página alemana de WP lo explican mejor.
flawr

99
Sabes, al principio esto parecía un desafío directo con Cy E, ¡pero hay tantos enfoques agradables posibles para este desafío! Usar operaciones matemáticas para C=1/ E=2o C=2/ E=3como lo hace la respuesta principal; usando C=0/ E=1con 10^(n-1); usando C=0/ E=.por formato decimal 0.0; utilizando C=1/ E=-mediante la utilización -1; etc. etc. Tantas posibilidades únicas para un desafío que parecía tan preciso al principio. Lástima que solo puedo hacer +1 una vez. ;)
Kevin Cruijssen

Respuestas:


29

Python 2, 29 26 bytes

lambda n:10**n*97/30-1/n*9

Ejemplo:

>>> f(1)
23
>>> f(2)
323
>>> f(3)
3233

debes enviar 21 en el caso n = 1
DanielIndie

1
@DanielIndie :( arreglado pero ahora es feo.
orlp

Sigue siendo una solución muy creativa :)
flawr

1
@orlp lo siento :) pero sigue siendo una buena solución :)
DanielIndie

3
10**n*97/30-1/n*9guarda otro byte, dando f(5) == 323333etc.
Lynn

28

Python 3, 35 33 bytes

lambda N:'C'*(N>1)+'EC'+'C'*(N-2)

Editar: soltando f=para guardar 2 bytes, gracias al recordatorio de @dylnan .

Pruébalo en línea!

Para visualizarlo:

lambda N:'🚘'*(N>1)+'🚔🚘'+'🚘'*(N-2)

Salida:

1 🚔🚘
2 🚘🚔🚘
3 🚘🚔🚘🚘
4 🚘🚔🚘🚘🚘
5 🚘🚔🚘🚘🚘🚘
6 🚘🚔🚘🚘🚘🚘🚘

¡Prueba 🚔 en línea!

Python 3, 40 bytes

Una solución sencilla:

lambda N:str(10**N).replace('100','010')

Pruébalo en línea!


2
Creo que la solución 'sencillo' tiene espacios en blanco innecesarios despuéslambda N:
a alguien

@ Alguien no estaba al tanto de eso, gracias.
Guoyang Qin


14

Japt, 5 4 bytes

Usos qpara automóviles y +para el corredor.

ç¬iÄ

Intentalo

Gracias a Oliver, que jugó 4 bytes al mismo tiempo que yo.


Explicación

¡Una solución corta pero una explicación engañosa!

Lo más sencillo primero: el çmétodo, cuando se aplica a un número entero, repite su argumento de cadena ese número de veces. El imétodo toma 2 argumentos ( s& n) e inserta sen el índice nde la cadena a la que se aplica.

La expansión de los 2 accesos directos unicode utilizados nos da çq i+1, que, cuando se transpila a JS U.ç("q").i("+",1), se convierte en Ula entrada. Entonces estamos repitiendo q Utiempos y luego insertando un +en el índice 1.

El truco final es que, gracias al ajuste del índice de Japt, cuándo U=1, iinsertará el +índice at 0, sea cual sea el valor para el que lo alimente n.


Iba a publicar ç0 iQ1para 6 bytes, pero sería mejor si lo usaras.
Oliver

Gracias @ Oliver. Mientras tanto, lo bajé a 5 bytes.
Shaggy

1
ç¬iÅpor 4 bytes;) Nunca he abusado tanto de Japt.
Oliver

Estaba a punto de hacer lo mismo en Älugar de Å:)
Shaggy

7

R, 50 bytes

-11 gracias a Giuseppe!

pryr::f(cat("if"(x<2,12,c(21,rep(2,x-1))),sep=""))

Salidas 1 para pasillo de emergencia y 2 para carriles normales

Mi intento, 61 bytes

Nada lujoso para ver aquí, pero vamos a poner a R en el marcador =)

q=pryr::f(`if`(x<2,cat("EC"),cat("CE",rep("C",x-1),sep="")))

Uso:

q(5)
CECCCC

Ahorre 8 bytes usando 21 = 12 + 9 y forzando VERDADERO / FALSO a 1/0 sin un if tio.run/##K/r/v6CossjKKk0jObFEw1JLI8/…
JayCe


6

Python 2, 30 29 28 bytes

lambda n:`10/3.`[1/n:n-~1/n]

Imprimir en 3lugar de Cy en .lugar de E.

Explicación:

Pruébalo en línea.

lambda n:    # Method with integer parameter and string return-type
  `10/3.`    #  Calculate 10/3 as decimal (3.333333333) and convert it to a string
  [1/n       #   Take the substring from index 1 if `n=1`, 0 otherwise
   ,n-~      #   to index `n+1` +
       1/n]  #    1 if `n=1`, 0 otherwise

Python 2, 33 32 31 29 28 bytes

lambda n:1%n-1or'1-'+'1'*~-n

Imprime en 1lugar de Cy en -lugar de E.

-2 bytes gracias a @ovs .
-1 byte gracias a @xnor .

Explicación:

Pruébalo en línea.

lambda n:    # Method with integer parameter and string return-type
  1%n-1      #  If `n` is 1: Return '-1'
  or         #  Else:
    '1-'+    #   Return '1-', appended with:
    '1'*~-n  #   `n-1` amount of '1's

1
Tu 10/3falla a los 17 años
Jo King

1
@JoKing Acabo de aclarar con OP, y él dijo: " Usar un tipo de entero integrado es suficiente ", lo que significa que hasta n=16si su entero integrado es de 64 bits es suficiente, o en este caso n=16cuando el valor decimal puede ' Mantener más de 15 dígitos decimales por defecto es suficiente. (Lo mismo se aplica a muchas de las otras respuestas que usan idiomas con tamaños de números arbitrarios, como Java, C # .NET, etc.)
Kevin Cruijssen

5

Pyth, 10 9 8 bytes

Xn1Q*NQZ

Usos 0para denotar el corredor de emergencia y ".
Pruébalo aquí

Explicación

Xn1Q*NQZ
    *NQ     Make a string of <input> "s.
 n1Q         At index 0 or 1...
X      Z    ... Insert 0.

5

brainfuck , 42 bytes

,[[>]+[<]>-]>>[<]<[<]>+>+<[<-[--->+<]>.,>]

Pruébalo en línea!

Toma la entrada como código char y las salidas como Vcarriles normales y Wcomo el carril despejado. (Para probar fácilmente, recomiendo reemplazar el ,con una serie de +s)

Cómo funciona:

,[[>]+[<]>-] Turn input into a unary sequence of 1s on the tape
>>[<]<[<]    Move two cells left of the tape if input is larger than 1
             Otherwise move only one space
>+>+<        Add one to the two cells right of the pointer
             This transforms:
               N=1:  0 0' 1 0  -> 0 2' 1 0
               N>1:  0' 0 1 1* -> 0 1' 2 1*
[<-[--->+<]>.,>]  Add 86 to each cell to transform to Ws and Vs and print

5

Octava (MATLAB *), 31 30 28 27 22 bytes

@(n)'CE'(1+(n>1==0:n))

Pruébalo en línea!

El programa funciona de la siguiente manera:

@(n)                   %Anonymous function to take input
            n>1==0:n   %Creates [1 0] if n is 1, or [0 1 (0 ...)] otherwise
         1+(        )  %Converts array of 0's and 1's to 1-indexed
    'CE'(            ) %Converts to ASCII by addressing in string

El truco utilizado aquí es XNORar la matriz de semillas 0:ncon una comprobación de si la entrada es mayor que 1. El resultado es que n>1la semilla se convierte en una matriz lógica [0 1 (0 ...)]mientras que n==1la semilla se invierte [1 0], logrando la inversión necesaria.

El resto es simplemente convertir la semilla en una cadena con suficientes autos anexados.


(*) El enlace TIO incluye en los comentarios de pie de página una solución alternativa para el mismo número de bytes que funciona en MATLAB y en Octave, pero da como resultado una secuencia de '0' y '1' en lugar de 'E' y ' C'. Para completar, la alternativa es:

@(n)['' 48+(n>1==0:n)]

  • Se guardó 1 byte usando en n==1~=0:1lugar de 0:1~=(n<2). ~=tiene prioridad sobre <, de ahí los corchetes originales, pero parece que ~=y== son manejados por orden de aparición mediante la comparación con 1 podemos ahorrar un byte.

  • Se guardaron 2 bytes al cambiar dónde se realiza la negación de 2:n. Esto ahorra un par de paréntesis. También tenemos que cambiar el ~=para ==tener en cuenta el hecho de que se negará más adelante.

  • Se guardó 1 byte usando <nuevamente. Resulta que <tiene la misma precedencia que ==después de todo. Colocar el <cálculo antes del ==asegura el orden correcto de ejecución.

  • Ahorró 5 bytes al no crear dos matrices separadas. En cambio, confiando en el hecho de que la comparación XNOR convertirá un solo rango en lógicos de todos modos.


Muy inteligente :-)
Stewie Griffin

@StewieGriffin Gracias :). Se las arregló para eliminar otros 5 bytes más.
Tom Carpenter



4

Python 3, 32 bytes

lambda n:f"{'CE'[n<2:]:C<{n+1}}"

Pruébalo en línea!

Utiliza una expresión de cadena f para formatear 'E'o 'CE'rellenar a la derecha con 'C'lo que tiene ancho de n+1.

f"{          :       }    a Python 3 f-string expression.
   'CE'[n<2:]             string slice based on value of n.
             :            what to format is before the ':' the format is after.
              C           padding character
               <          left align
                {n+1}     minimum field width based on n

4

Brain-Flak , 100 66 bytes

{({}[()]<((((()()()()){}){}){}())>)}{}(({}<>)())<>{<>{({}<>)<>}}<>

Pruébalo en línea!

Usos "como el carril de emergencia y !como los carriles normales.


+1 por usar este lenguaje de todas las cosas. XD
Alex

2
@Alex, bueno, Brain-Flak es el idioma del mes de abril
Jo King

¿En serio o a finales de la broma de April Fool? ¿Dónde se eligen los idiomas del mes?
Alex

@Alex Nominaciones y votaciones aquí , y luego se hace una publicación específica para un mes como esta
Kamil Drakari

Oh, está en esta plataforma. Ya veo, gracias! :-)
Alex


4

05AB1E , 7 bytes

Î>∍1I≠ǝ

Pruébalo en línea!

0 es C y 1 es E.

Explicación

Î>          # Push 0 and input incremented            -- [0, 4]
  ∍         # Extend a to length b                    -- [0000]
   1I≠      # Push 1 and input falsified (input != 1) -- [0000, 1, 1] 
      ǝ     # Insert b in a at location C             -- [0100]
            # Implicit display

Oh, astuto zorro. $<×TìsiRfue como estaba pensando.
Magic Octopus Urn

@MagicOctopusUrn ¡Ese es un enfoque interesante! Me demoré sobre la construcción "if" también, pero requiere al menos 3 bytes, de ahí la necesidad de un enfoque diferente :-)
Kaldo

En la nueva versión de 05AB1E, 1Ise puede jugar al golf $.
Kevin Cruijssen

5 bytes (también funciona en la versión heredada).
Kevin Cruijssen

4

APL (Dyalog Unicode) , 21 17 16 bytes

(-≠∘1)⌽'E',⍴∘'C'

Pruébalo en línea!

Gracias a Erik por guardar 4 bytes y Adám por un byte adicional.

¿Cómo?

(-≠∘1)⌽'E',⍴∘'C'  Tacit function
           ⍴∘'C'  Repeat 'C', according to the input
       'E',       Then append to 'E'
                 And rotate
    1)            1
  ≠∘              Different from the input? Returns 1 or 0
(-                And negate. This rotates 0 times if the input is 1, and once if not.

1
(⍵>1)no necesita estar entre paréntesis. Y usted puede ahorrar 4 bytes con una función tácita: (⊢×1<⊢)⌽'E',⍴∘'C'.
Erik the Outgolfer

@EriktheOutgolfer gracias! No tuve tiempo de volverme tácito después de publicar porque tuve una clase hoy. Lo editaré cuando llegue a casa.
J. Sallé


15 bytes con ⎕io = 0:'CE'[1(≠=∘⍳+)⎕]
ngn

@ngn Ni siquiera puedo ... ¿puedes conseguirme un enlace TIO con los casos de prueba? Parece que no puedo hacer que funcione ...
J. Sallé

4

Haskell , 35 33 32 bytes

2 bytes guardados gracias a Angs, 1 byte guardado gracias a Lynn

(!!)$"":"EC":iterate(++"C")"CEC"

Pruébalo en línea!

Haskell , 32 30 29 bytes

Esto está indexado a cero por lo que no cumple con el desafío

g=(!!)$"EC":iterate(++"C")"CEC"

Pruébalo en línea!

Haskell , 30 bytes

Esto no funciona porque la salida debe ser una cadena

f 1=21
f 2=121
f n=10*f(n-1)+1

Pruébalo en línea!

Aquí usamos números en lugar de cadenas, 2para el corredor de emergencia, 1para los automóviles. Podemos agregar 1a al final multiplicando por 10 y sumando 1. Esto es más barato porque no tenemos que pagar por todos los bytes de concatenación y literales de cadena.

Sería más barato usarlo en 0lugar de hacerlo, 1pero necesitamos ceros iniciales, que terminan recortándose.


((blah)!!)puede llegar (!!)$blaha guardar un byte en sus dos primeras respuestas.
Lynn

@ Lynn ¡Gracias! Traté de hacer eso antes, pero debo haber contado mal los bytes.
Wheat Wizard

4

Python 3 , 30 29 bytes

lambda n:"CEC"[~n:]+"C"*(n-2)

Pruébalo en línea!

OK, ya hay muchas respuestas de Python, pero creo que este es el primer byter sub-30 entre los que todavía usan caracteres "E" y "C" en lugar de números.




3

Stax , 7 bytes

ü♣àj#F 

Ejecutar y depurarlo

Esto usa los caracteres "0" y "1". Esto funciona porque cuando gira una matriz de tamaño 1, no cambia.

Desempaquetado, sin golf y comentado, se ve así.

1]( left justify [1] with zeroes. e.g. [1, 0, 0, 0]
|)  rotate array right one place
0+  append a zero
$   convert to string

Ejecute este




3

Jalea , 6 bytes

⁵*ṾṙỊṙ

Muestra carriles de automóviles como 0 , el carril de emergencia como 1 .

Pruébalo en línea!

Cómo funciona

⁵*ṾṙỊṙ  Main link. Argument: n

⁵*      Compute 10**n.
  Ṿ     Uneval; get a string representation.
   ṙỊ   Rotate the string (n≤1) characters to the left.
     ṙ  Rotate the result n characters to the left.

3

De espacio en blanco , 141 104 103 bytes

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][S S S T  S N
_Push_2][T  S S T   _Subtract][S N
S _Duplicate_input-2][N
T   T   N
_If_negative_Jump_to_Label_-1][S S S T  N
_Push_1][S N
S _Duplicate_1][T   N
S T _Print_as_integer][S S T    T   N
_Push_-1][T N
S T _Print_as_integer][T    S S T   _Subtract][N
S S T   N
_Create_Label_LOOP][S N
S _Duplicate][N
T   T   S N
_If_negative_Jump_to_EXIT][S S S T  N
_Push_1][S N
S _Duplicate_1][T   N
S T _Print_as_integer][T    S S T   _Subtract][N
S N
T   N
_Jump_to_LOOP][N
S S N
_Create_Label_-1][T N
S T _Print_as_integer][N
S S S N
_Create_Label_EXIT]

Se agregaron letras S(espacio), T(tabulación) y N(nueva línea) solo como resaltado.
[..._some_action]agregado solo como explicación.

Imprime en 1lugar de Cy en -lugar de E.

-1 byte gracias a @JoKing al sugerir el uso de 1y en -1lugar de 0y 1.

Explicación en pseudocódigo:

Integer i = STDIN-input as integer - 2
If i is negative (-1):
  Print i (so print "-1")
Else:
  Print "1-1"
  Start LOOP:
    If i is negative:
      EXIT program
    Print "1"
    i = i-1
    Go to the next iteration of the LOOP

Ejecuciones de ejemplo:

Entrada: 1

Command   Explanation                 Stack      Heap    STDIN   STDOUT   STDERR

SSSN      Push 0                      [0]
SNS       Duplicate top (0)           [0,0]
TNTT      Read STDIN as integer       [0]        {0:1}   1
TTT       Retrieve heap at 0          [1]        {0:1}
SSSTSN    Push 2                      [1,2]      {0:1}
TSST      Subtract top two            [-1]       {0:1}
SNS       Duplicate input-2           [-1,-1]    {0:1}
NTSN      If neg.: Jump to Label_-1   [-1]       {0:1}
NSSN      Create Label_-1             [-1]       {0:1}
TNST      Print top as integer        []         {0:1}           -1
NSSSN     Create Label_EXIT           []         {0:1}
                                                                         error

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
Se detiene con error: Salida no definida.

Entrada: 4

Command   Explanation                   Stack      Heap    STDIN   STDOUT   STDERR

SSSN      Push 0                        [0]
SNS       Duplicate top (0)             [0,0]
TNTT      Read STDIN as integer         [0]        {0:4}   4
TTT       Retrieve heap at 0            [4]        {0:4}
SSSTSN    Push 2                        [4,2]      {0:4}
TSST      Subtract top two              [2]        {0:4}
SNS       Duplicate input-2             [2,2]      {0:4}
NTSN      If neg.: Jump to Label_-1     [2]        {0:4}
SSSTN     Push 1                        [2,1]      {0:4}
SNS       Duplicate top (1)             [2,1,1]    {0:4}
TNST      Print as integer              [2,1]      {0:4}           1
SSTTN     Push -1                       [2,1,-1]   {0:4}
TNST      Print as integer              [2,1]      {0:4}           -1
TSST      Subtract top two              [1]        {0:4}
NSSTN     Create Label_LOOP             [1]        {0:4}
 SNS      Duplicate top (1)             [1,1]      {0:4}
 NTTSN    If neg.: Jump to Label_EXIT   [1]        {0:4}
 SSSTN    Push 1                        [1,1]      {0:4}
 SNS      Duplicate top (1)             [1,1,1]    {0:4}
 TNST     Print as integer              [1,1]      {0:4}           1
 TSST     Subtract top two              [0]        {0:4}
 NSNTN    Jump to Label_LOOP            [0]        {0:4}

 SNS      Duplicate top (0)             [0,0]      {0:4}
 NTTSN    If neg.: Jump to Label_EXIT   [0]        {0:4}
 SSSTN    Push 1                        [0,1]      {0:4}
 SNS      Duplicate top (1)             [0,1,1]    {0:4}
 TNST     Print as integer              [0,1]      {0:4}           1
 TSST     Subtract top two              [-1]       {0:4}
 NSNTN    Jump to Label_LOOP            [-1]       {0:4}

 SNS      Duplicate top (-1)            [-1,-1]    {0:4}
 NTTSN    If neg.: Jump to Label_EXIT   [-1]       {0:4}
NSSSN     Create Label_EXIT             [-1]       {0:4}
                                                                            error

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
Se detiene con error: Salida no definida.


¿Sería más fácil imprimir el carril claro -al abusar de la impresión -1?
Jo King

@JoKing Desafortunadamente sería más largo. Pruébelo en línea 112 bytes. De hecho cambió push_0; print_as_integer; push_1; print_as_integera push_-1; print_as_integer, pero a cambio los dos push_0; print_as_integerson reemplazados por push_45; print_as_character, dóndepush_0 = SSSN, y push_45= SSSTSTTSTN. Y también push_45se debe agregar un adicional , porque para la entrada n=1ahora imprimo el duplicado 0que ya tenía en la pila, por lo que no tuve que presionar 0nuevamente porque 0ya estaba en la pila.
Kevin Cruijssen

Quise decir -como reemplazar 1y 1reemplazar 0. Entonces evitaría tener que presionar 45, y por lo que puedo decir, esto ahorraría en imprimir un número en la primera mitad del condicional, pero aumentaría ligeramente los costos al presionar 1 en lugar de 0. Verifique mi respuesta Gol> <> para quiero decir un ejemplo de la salida
Jo King

1
@JoKing Intenté implementarlo, pero terminé en 107 bytes (aquí está el mismo código con resaltado y explicación adicionales ). De hecho, ahorra en print_-1lugar de imprimir 0y 1, pero print_-1se necesita un adicional fuera del ciclo. EDITAR: pude reducirlo a 103 bytes cambiandosubtract_1; if_0_jump_to_ONE; push_-1; print_integerasubtract_2; if_negative_jump_to_ONE; print_integer, porque -1 ya está en la pila entonces. Así que gracias por -1 byte. :)
Kevin Cruijssen

3

AutoHotkey 32 bytes

Reemplaza la letra "C" con "EC" a menos que la cantidad de C> 1, luego envía "CEC" y sale de la aplicación.

::C::EC
:*:CC::CEC^c
^c::ExitApp

C => EC
CC => CEC luego sale del programa. Cualquier C adicional se ingresará después de que el programa salga.


3

APL + WIN, 20 16 bytes

4 bytes guardados gracias a Adám

Solicitudes de entero n:

(-2≠⍴n)⌽n←1⎕/⍕10

1 para pasillo de emergencia o para automóviles.


16:(-2≠⍴n)⌽n←1⎕/⍕10
Adám

@ Adám Gracias. Veo que el truco de ngn, 1⎕ / ⍕, es útil. ¿Uno para la lista de idiomas?
Graham

¿De qué lista idiomática estás hablando?
Adám

@ Adám Las dos listas de expresiones idiomáticas que uso con más frecuencia son Finnapl y APL2idioms
Graham,

No estoy seguro de qué es tan idiota aquí. Es solo golf. De todos modos, mi lista de idiomas puede interesarte.
Adám


3

MathGolf , 7 6 bytes

ú░\┴╜╪

Pruébalo en línea.

Salida 1por Ey 0para C.

Explicación:

ú         # 10 to the power of the (implicit) input
          #  i.e. 1 → 10
          #  i.e. 4 → 10000
         # Convert it to a string
          #  i.e. 10 → "10"
          #  i.e. 10000 → "10000"
  \       # Swap so the (implicit) input is at the top of the stack again
   ┴╜     # If the input is NOT 1:
         #  Rotate the string once towards the right
          #   i.e. "10000" and 4 → "01000"
          # Output everything on the stack (which only contains the string) implicitly
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.