Crea un corridoio di emergenza


46

In alcune nazioni ci sono raccomandazioni o leggi su come formare corridoi di emergenza su strade che hanno più corsie per direzione. (Di seguito consideriamo solo le corsie che vanno nella direzione in cui stiamo viaggiando.) Queste sono le regole che valgono in Germania:

  • Se c'è solo una corsia, tutti dovrebbero guidare a destra in modo che i veicoli di soccorso possano passare a sinistra.
  • Se ci sono due o più corsie, le auto sulla corsia più a sinistra dovrebbero guidare a sinistra e tutti gli altri dovrebbero spostarsi a destra.

Sfida

Dato il numero N>0di corsie regolari, emette il layout delle corsie quando si forma un corridoio di emergenza usando una stringa di N+1caratteri ASCII. Puoi usare due caratteri qualsiasi dal codice ASCII 33fino a 126, uno per indicare il corridoio di emergenza e uno per indicare le macchine. Sono ammessi spazi finali o iniziali, interruzioni di riga, ecc.

Esempi

Qui stiamo usando Eper il corridoio di emergenza e Cper le macchine.

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

18
Non mi innamorerò di questo! Stai solo cercando una corsia tutta tua per strisciare attraverso il tuo serpente subdolo.
orlp

16
@PmanAce Non credo davvero che Flawr abbia bisogno del nostro aiuto per questo: P
orlp

8
+1 perché in realtà funziona in Germania. Era nella situazione lo scorso fine settimana.
ElPedro

10
@ msh210 Penso che le immagini nella pagina tedesca del WP lo spieghino meglio.
flawr

9
Sai, all'inizio sembrava una sfida puntuale con Ce E, ma ci sono così tanti simpatici approcci possibili per questa sfida! Usare operazioni matematiche per C=1/ E=2o C=2/ E=3come fa la risposta migliore; usando C=0/ E=1con 10^(n-1); usando C=0/ E=.con formattazione decimale 0.0; utilizzando C=1/ E=-utilizzando -1; ecc. ecc. Tante possibilità uniche per una sfida che all'inizio sembrava così puntuale. Peccato che posso fare +1 solo una volta. ;)
Kevin Cruijssen,

Risposte:


29

Python 2, 29 26 byte

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

Esempio:

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

devi produrre 21 nel caso n = 1
DanielIndie

1
@DanielIndie :( risolto ma ora è brutto.
orlp

Ancora una soluzione molto creativa :)
flawr

1
@orlp sorry :) ma comunque un'ottima soluzione :)
DanielIndie

3
10**n*97/30-1/n*9salva un altro byte, dando f(5) == 323333ecc.
Lynn

28

Python 3, 35 33 byte

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

Modifica: rilasciando f=per salvare 2 byte, grazie al promemoria di @dylnan .

Provalo online!

Per visualizzarlo:

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

Produzione:

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

Prova 🚔 online!

Python 3, 40 byte

Una soluzione semplice:

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

Provalo online!


2
Penso che la soluzione "semplice" abbia uno spazio bianco non necessario dopolambda N:
qualcuno il

@someone Non ne ero a conoscenza, grazie.
Guoyang Qin


14

Japt, 5 4 byte

Usi qper automobili e +per il corridoio.

ç¬iÄ

Provalo

Ringraziamo Oliver che ha golfato 4 byte contemporaneamente a me.


Spiegazione

Una soluzione breve ma una spiegazione complicata!

Prima le cose semplici: il çmetodo, quando applicato a un numero intero, ripete il suo argomento stringa quel numero di volte. Il imetodo accetta 2 argomenti ( s& n) e inserisce snell'indice ndella stringa a cui è applicato.

Espandendo le 2 scorciatoie unicode utilizzate ci dà çq i+1, che, quando trasformato in JS diventa U.ç("q").i("+",1), dov'è Ul'input. Quindi ripetiamo i q Utempi e quindi inseriamo un +indice 1.

L'ultimo trucco è che, grazie al wrapping dell'indice di Japt, quando U=1, iverrà inserito l' +indice at 0, qualunque sia il valore per cui lo si nutre n.


Avevo intenzione di postare ç0 iQ1per 6 byte, ma sarebbe meglio se lo usassi.
Oliver,

Grazie, @Oliver. Nel frattempo, però, è arrivato a 5 byte.
Shaggy

1
ç¬iÅper 4 byte;) Non ho mai abusato di Japt così tanto.
Oliver,

Stavo per fare lo stesso con Äinvece di Å:)
Shaggy

7

R, 50 byte

-11 grazie a Giuseppe!

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

Uscite 1 per corridoio di emergenza e 2 per corsie normali

Il mio tentativo, 61 byte

Niente di speciale da vedere qui, ma prendiamo R sul tabellone =)

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

Uso:

q(5)
CECCCC

Salva 8 byte usando 21 = 12 + 9 e forzando TRUE / FALSE su 1/0 senza un if tio.run/##K/r/v6CossjKKk0jObFEw1JLI8/…
JayCe


6

Python 2, 30 29 28 byte

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

Stampa 3invece di Ce .invece di E.

Spiegazione:

Provalo online.

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 byte

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

Stampa 1invece di Ce -invece di E.

-2 byte grazie a @ovs .
-1 byte grazie a @xnor .

Spiegazione:

Provalo online.

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
Il tuo 10/3fallisce alle 17
Jo King,

1
@JoKing Ho appena chiarito con OP, e ha detto " Usare un tipo intero incorporato è sufficiente ", il che significa che n=16se il numero intero incorporato è 64-bit è sufficiente, o in questo caso n=16quando il valore decimale può ' t contenere più di 15 cifre decimali per impostazione predefinita è sufficiente. (Lo stesso vale per molte altre risposte che usano linguaggi con numeri numerici arbitrari, come Java, C # .NET, ecc.)
Kevin Cruijssen,

5

Pyth, 10 9 8 byte

Xn1Q*NQZ

Utilizza 0per indicare il corridoio di emergenza e ".
Provalo qui

Spiegazione

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

5

Brainfuck , 42 byte

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

Provalo online!

Accetta input come codice char e output come Vcorsie normali e Wcorsia libera. (Per testare facilmente, consiglio di sostituire il ,con un numero di +s)

Come funziona:

,[[>]+[<]>-] 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

Ottava (MATLAB *), 31 30 28 27 22 byte

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

Provalo online!

Il programma funziona come segue:

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

Il trucco usato qui è XNORing l'array di semi di 0:ncon un controllo se l'input è maggiore di 1. Il risultato è che per n>1il seme viene convertito in un array logico di [0 1 (0 ...)]mentre per n==1il seme viene invertito [1 0], ottenendo l'inversione necessaria.

Il resto sta semplicemente convertendo il seme in una stringa con sufficienti macchine aggiunte.


(*) Il collegamento TIO include nei commenti a piè di pagina una soluzione alternativa per lo stesso numero di byte che funziona in MATLAB e Octave, ma risulta in una sequenza di "0" e "1" anziché "E" e " C'. Per completezza, l'alternativa è:

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

  • Salvato 1 byte usando n==1~=0:1anziché 0:1~=(n<2). ~=ha la precedenza su <, quindi le parentesi originali, ma sembra che ~=e ==siano gestite in ordine di apparizione, quindi confrontando con 1 possiamo salvare un byte.

  • Salvato 2 byte modificando il punto in cui 2:nviene eseguita la negazione di . Questo salva un paio di parentesi. Dobbiamo anche modificare il ~=to ==per tenere conto del fatto che verrà negato in seguito.

  • Salvato 1 byte usando di <nuovo. Si scopre che <ha la stessa precedenza di ==dopotutto. Effettuare il <calcolo prima di ==garantire il corretto ordine di esecuzione.

  • 5 byte salvati non creando due array separati. Invece basandosi sul fatto che il confronto XNOR convertirà comunque un singolo intervallo in logici.


Molto intelligente :-)
Stewie Griffin,

@StewieGriffin Grazie :). Gestito per eliminare altri 5 byte in più.
Tom Carpenter,



4

Python 3, 32 byte

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

Provalo online!

Usa un'espressione f-string per formattare 'E'o 'CE'riempita a destra con 'C'quindi ha larghezza di 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 byte

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

Provalo online!

Utilizza "come corsia di emergenza e !come corsie normali.


+1 per l'utilizzo di questa lingua di tutte le cose. XD
Alex,

2
@Alex, Beh, Brain-Flak è la lingua del mese di aprile
Jo King,

Scherzo sul serio o alla fine di aprile? Dove vengono elette le lingue del mese?
Alex,

@Alex Nomine e votazioni qui , e quindi viene pubblicato un post specifico per un mese come questo
Kamil Drakari,

Oh, è su questa piattaforma. Vedo, grazie! :-)
Alex


4

05AB1E , 7 byte

Î>∍1I≠ǝ

Provalo online!

0 è C e 1 è E.

Spiegazione

Î>          # 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 volpe furba. $<×TìsiRera come stavo pensando.
Magic Octopus Urn

@MagicOctopusUrn Questo è un approccio interessante! Mi sono soffermato anche sulla costruzione "if" ma richiede almeno 3 byte, quindi la necessità di un approccio diverso :-)
Kaldo,

Nella nuova versione di 05AB1E, è 1Ipossibile giocare a golf $.
Kevin Cruijssen,

5 byte (funziona anche nella versione legacy).
Kevin Cruijssen l'

4

APL (Dyalog Unicode) , 21 17 16 byte

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

Provalo online!

Grazie a Erik per aver salvato 4 byte e Adám per un ulteriore byte.

Come?

(-≠∘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)non deve essere tra parentesi. Ed è possibile salvare 4 byte con una funzione tacita: (⊢×1<⊢)⌽'E',⍴∘'C'.
Erik the Outgolfer

@EriktheOutgolfer grazie! Non ho avuto il tempo di andare tacito dopo aver pubblicato perché avevo una lezione oggi. Modificherò quando torno a casa.
J. Sallé,


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

@ngn Non riesco nemmeno ... puoi farmi un link TIO con i casi di test? Non riesco a farlo funzionare ...
J. Sallé,

4

Haskell , 35 33 32 byte

2 byte salvati grazie ad Angs, 1 byte risparmiati grazie a Lynn

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

Provalo online!

Haskell , 32 30 29 byte

Questo è zero indicizzato, quindi non è conforme alla sfida

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

Provalo online!

Haskell , 30 byte

Questo non funziona perché l'output deve essere una stringa

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

Provalo online!

Qui usiamo i numeri anziché le stringhe, 2per il corridoio di emergenza, 1per le macchine. Possiamo aggiungere 1a alla fine moltiplicando per 10 e aggiungendo 1. Questo è più economico perché non dobbiamo pagare tutti i byte per la concatenazione e i letterali di stringa.

Sarebbe più economico da usare 0invece di 1ma abbiamo bisogno di zeri iniziali, che finiscono per essere eliminati.


((blah)!!)può diventare (!!)$blahper salvare un byte nelle prime due risposte.
Lynn,

@Lynn Grazie! Ho provato a farlo prima ma devo aver contato male i byte.
Wheat Wizard

4

Python 3 , 30 29 byte

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

Provalo online!

OK, ci sono già molte risposte a Python, ma penso che questo sia il primo sub-30 tra quelli che usano ancora i caratteri "E" e "C" piuttosto che i numeri.




3

Stax , 7 byte

ü♣àj#F 

Esegui ed esegui il debug

Questo utilizza i caratteri "0" e "1". Questo funziona perché quando si ruota un array di dimensioni 1, non cambia.

Disimballato, non golfato e commentato, sembra così.

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

Esegui questo




3

Gelatina , 6 byte

⁵*ṾṙỊṙ

Visualizza le corsie delle auto come 0 , la corsia di emergenza come 1 .

Provalo online!

Come funziona

⁵*ṾṙỊṙ  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

Spazio bianco , 141 104 103 byte

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

Lettere S(spazio), T(scheda) e N(nuova riga) aggiunti solo come evidenziazione.
[..._some_action]aggiunto solo come spiegazione.

Stampa 1invece di Ce -invece di E.

-1 byte grazie a @JoKing suggerendo l'uso di 1e -1invece di 0e 1.

Spiegazione in pseudo-codice:

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

Esempi di esecuzione:

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

Provalo online (solo con spazi non elaborati, schede e nuove righe).
Si interrompe con errore: uscita non definita.

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

Provalo online (solo con spazi non elaborati, schede e nuove righe).
Si interrompe con errore: uscita non definita.


Sarebbe più semplice stampare la corsia libera -abusando della stampa -1?
Jo King,

@JoKing Purtroppo sarebbe più lungo. Provalo online 112 byte. In effetti è cambiato push_0; print_as_integer; push_1; print_as_integera push_-1; print_as_integer, ma in cambio i due push_0; print_as_integersono sostituiti da push_45; print_as_character, dove push_0= SSSN, e push_45= SSSTSTTSTN. E push_45deve essere aggiunto anche un altro, perché per l'input n=1ora stampo il duplicato che 0avevo già nello stack, quindi non ho dovuto spingere di 0nuovo perché 0era già nello stack.
Kevin Cruijssen,

Intendevo -sostituire 1e 1sostituire 0. Quindi eviterai di dover premere 45, e per quanto posso dire questo risparmierebbe sulla stampa di un numero nella prima metà del condizionale, ma aumenterebbe leggermente i costi spingendo 1 invece di 0. Controlla il mio Gol> <> risposta per un esempio dell'output intendo
Jo King,

1
@JoKing Ho provato a implementarlo, ma ho finito con 107 byte (ecco lo stesso codice con evidenziazione e spiegazione aggiunte ). Effettivamente risparmia print_-1invece di stampare 0e 1, ma print_-1è necessario un ulteriore al di fuori del ciclo. EDIT: stato in grado di ridurlo a 103 byte cambiando subtract_1; if_0_jump_to_ONE; push_-1; print_integera subtract_2; if_negative_jump_to_ONE; print_integer, perché -1 è già in pila allora. Quindi grazie per -1 byte. :)
Kevin Cruijssen,

3

Tasto di scelta automatica di 32 byte

Sostituisce la lettera "C" con "EC" a meno che la quantità di C> 1, quindi invia "CEC" ed esce dall'app.

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

C => EC
CC => CEC quindi esce dal programma. Eventuali ulteriori C verranno inseriti dopo la chiusura del programma.


3

APL + WIN, 20 16 byte

4 byte salvati grazie ad Adám

Richiede il numero intero n:

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

1 per corridoio di emergenza o per auto.


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

@Adám Grazie. Vedo che il trucco di ngn, 1⎕ / ⍕, sta tornando utile. Uno per l'elenco dei modi di dire?
Graham,

Di quale elenco di idiomi stai parlando?
Adám,

@Adám Le due liste di idiomi che utilizzo più frequentemente sono Finnapl e APL2idioms
Graham,

Non sono sicuro di cosa sia così idiomatico qui. È solo da golf. Ad ogni modo, la mia lista di idiomi potrebbe interessarti.
Adám,


3

MathGolf , 7 6 byte

ú░\┴╜╪

Provalo online.

Uscita 1per Ee 0per C.

Spiegazione:

ú         # 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.