Faça um corredor de emergência

46

Em alguns países, existem recomendações ou leis sobre como formar corredores de emergência nas ruas que têm várias faixas por direção. (A seguir, consideramos apenas as faixas na direção em que estamos viajando.) Estas são as regras que existem na Alemanha:

  • Se houver apenas uma faixa, todos devem dirigir para a direita, de modo que os veículos de resgate possam passar à esquerda.
  • Se houver duas ou mais faixas, os carros na faixa mais à esquerda devem dirigir para a esquerda e todos os demais devem se mover para a direita.

Desafio

Dado o número N>0de faixas regulares, produza o layout das faixas quando um corredor de emergência é formado usando uma sequência de N+1caracteres ASCII. Você pode usar dois caracteres do código ASCII 33até 126, um para indicar o corredor de emergência e outro para indicar os carros. Espaços à direita ou à direita, quebras de linha etc. são permitidos.

Exemplos

Aqui estamos usando Eo corredor de emergência e Cos carros.

N  Output
1  EC
2  CEC
3  CECC
4  CECCC
5  CECCCC
6  CECCCCC
   etc
flawr
fonte
18
Eu não vou cair nessa! Você está apenas procurando uma pista para deslizar através de sua cobra sorrateira.
orlp
16
@PmanAce Eu realmente não acho que o flawr precise de nossa ajuda para isso: P
orlp 04/04
8
+1 porque realmente funciona na Alemanha. Estava na situação no último fim de semana.
ElPedro 04/04
10
@ msh210 Acho que as imagens na página WP alemã explicam melhor.
flawr
9
Você sabe, no começo isso parecia um desafio direto com Ce E, mas existem tantas abordagens legais possíveis para esse desafio! Usando operações matemáticas para C=1/ E=2ou C=2/ E=3como a resposta principal faz; usando C=0/ E=1com 10^(n-1); usando C=0/ E=.por formatação decimal 0.0; usando C=1/ E=-utilizando -1; etc. etc. Tantas possibilidades únicas para um desafio que parecia tão direto ao ponto. Pena que só posso marcar uma vez com +1. ;)
Kevin Cruijssen

Respostas:

29

Python 2, 29 26 bytes

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

Exemplo:

>>> f(1)
23
>>> f(2)
323
>>> f(3)
3233
orlp
fonte
você precisa para a saída 21 no n = 1 caso
DanielIndie
1
@DanielIndie :( fixo, mas agora é feio.
orlp
Ainda uma solução muito criativa :)
flawr
1
@orlp pena :) mas ainda uma solução bem :)
DanielIndie
3
10**n*97/30-1/n*9salva outro byte, dando f(5) == 323333etc.
Lynn
28

Python 3, 35 33 bytes

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

Editar: soltar f=para salvar 2 bytes, graças ao lembrete de @dylnan .

Experimente online!

Para visualizá-lo:

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

Resultado:

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

Experimente 🚔 online!

Python 3, 40 bytes

Uma solução simples:

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

Experimente online!

Guoyang Qin
fonte
2
Acho que a solução 'simples' tem espaços em branco desnecessários depoislambda N:
alguém
@ alguém que eu não sabia disso, obrigado.
Guoyang Qin
14

Japonês, 5 4 bytes

Usos qpara carros e +para o corredor.

ç¬iÄ

Tente

Os meus agradecimentos a Oliver, que jogou 4 bytes ao mesmo tempo que eu.


Explicação

Uma solução curta, mas uma explicação complicada!

O material direto primeiro: o çmétodo, quando aplicado a um número inteiro, repete seu argumento de string esse número de vezes. O imétodo recebe 2 argumentos ( s& n) e insere sno índice nda string à qual é aplicado.

Expandir os 2 atalhos unicode usados ​​nos dá çq i+1, o que, quando transpilado para JS se torna U.ç("q").i("+",1), onde Uestá a entrada. Então, estamos repetindo os q Utempos e inserindo um +no índice 1.

O truque final é que, graças ao empacotamento do índice de Japt, quando U=1, io +índice at será inserido 0, seja qual for o valor que você alimente n.

Shaggy
fonte
Eu ia postar ç0 iQ1por 6 bytes, mas seria melhor se você o usasse.
Oliver
Obrigado, @ Oliver. Entretanto, reduzimos para 5 bytes.
Shaggy
1
ç¬iÅpor 4 bytes;) Eu nunca abusei tanto do Japt.
Oliver
Eu estava prestes a fazer o mesmo com Äem vez de Å:)
Shaggy
7

R, 50 bytes

11 graças a Giuseppe!

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

Saídas 1 para corredor de emergência e 2 para faixas normais

Minha tentativa, 61 bytes

Nada demais para ver aqui, mas vamos colocar R no placar =)

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

Uso:

q(5)
CECCCC
Punintended
fonte
Guardar 8 bytes utilizando 21 = 12 + 9 e forçando / FALSE TRUE para 1/0 sem se tio.run/##K/r/v6CossjKKk0jObFEw1JLI8/...
jayce
6

Python 2, 30 29 28 bytes

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

Imprimir em 3vez de Ce em .vez de E.

Explicação:

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

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

Imprime em 1vez de Ce em -vez de E.

-2 bytes graças a @ovs .
-1 byte graças a @xnor .

Explicação:

Experimente 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
Kevin Cruijssen
fonte
1
Seu 10/3um falha aos 17
Jo King
1
@JoKing Eu só clarificado com OP, e ele disse " usando um construído em tipo inteiro é suficiente. ", O que significa até n=16se o seu inteiro built-in é de 64-bit é suficiente, ou neste caso, n=16quando o valor decimal pode' t manter mais de 15 dígitos decimais por padrão é suficiente. (O mesmo se aplica a uma série de outras respostas usando linguagens com tamanhos número arbitrário, como Java, C # .NET, etc.)
Kevin Cruijssen
5

Pitão, 10 9 8 bytes

Xn1Q*NQZ

Usa 0para indicar o corredor de emergência e ".
Experimente aqui

Explicação

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

brainfuck , 42 bytes

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

Experimente online!

Recebe a entrada como código de caracteres e as saídas como Vfaixas normais e Wcomo faixa limpa. (Para testar facilmente, recomendo substituir o ,número por +s)

Como 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
Brincadeira
fonte
5

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

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

Experimente online!

O programa funciona da seguinte maneira:

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

O truque usado aqui é XNORing a matriz de sementes 0:ncom uma verificação se a entrada for maior que 1. O resultado é que, para n>1a semente, ela é convertida em uma matriz lógica [0 1 (0 ...)]enquanto n==1a semente é invertida [1 0], obtendo a inversão necessária.

O resto está apenas convertendo a semente em uma string com carros anexados suficientes.


(*) O link TIO inclui nos comentários do rodapé uma solução alternativa para o mesmo número de bytes que funciona no MATLAB e no Octave, mas resulta em uma sequência de '0' e '1' em vez de 'E' e ' C '. Para completar, a alternativa é:

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

  • Economizou 1 byte usando em n==1~=0:1vez de 0:1~=(n<2). ~=tem precedência sobre <, portanto, os colchetes originais, mas parece que ~=e ==são tratados na ordem da aparência, comparando com 1, podemos salvar um byte.

  • Salva 2 bytes, alterando onde a negação de 2:né realizada. Isso economiza um par de colchetes. Também temos que mudar o ~=para ==dar conta do fato de que será negado mais tarde.

  • Salvo 1 byte usando <novamente. Acontece que <tem a mesma precedência de ==tudo. Colocar o <cálculo antes de ==garantir a ordem correta de execução.

  • Economizou 5 bytes ao não criar duas matrizes separadas. Em vez disso, confie no fato de que a comparação XNOR converterá um único intervalo em lógica de qualquer maneira.

Tom Carpenter
fonte
Muito inteligente :-)
Stewie Griffin
@StewieGriffin Thanks :). Conseguiu derrubar outros 5 bytes a mais.
Tom Carpenter
4

C (gcc), 39 bytes

f(n){printf("70%o"+!n,7|(1<<3*--n)-1);}

Experimente online!

Emprestou e adaptou o truque printf da resposta de ErikF .

kwc
fonte
2
Bem-vindo ao site e bom primeiro post!
você precisa saber é o seguinte
4

Python 3, 32 bytes

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

Experimente online!

Usa uma expressão de f-string para formatar 'E'ou 'CE'preenchida à direita com 'C'a largura 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
RootTwo
fonte
4

Flak cerebral , 100 66 bytes

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

Experimente online!

Usa "como faixa de emergência e !como faixas normais.

Brincadeira
fonte
+1 por usar esse idioma de todas as coisas. XD
Alex
2
@Alex, Bem, Brain-Flak é a língua do mês para abril
Jo rei
Sério ou a piada do final de abril? Onde os idiomas do mês são eleitos?
Alex
@Alex Nomeações e votar aqui , e, em seguida, um post específico do mês é feito como um presente
Kamil Drakari
Oh, está nesta plataforma. Entendo obrigado! :-)
Alex
4

05AB1E , 7 bytes

Î>∍1I≠ǝ

Experimente online!

0 é C e 1 é E.

Explicação

Î>          # 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
Kaldo
fonte
Oh sua raposa manhosa. $<×TìsiREra assim que eu estava pensando.
Magic Octopus Urn
@MagicOctopusUrn Essa é uma abordagem interessante! I permaneceu sobre o "se" construção bem mas requer, pelo menos, 3 bytes, portanto, a necessidade de uma abordagem diferente :-)
Kaldo
Na nova versão do 05AB1E, você 1Ipode jogar golfe $.
21718 Kevin Kevin Kurtzssen
5 bytes (também funciona na versão herdada).
Kevin Cruijssen
4

APL (Dyalog Unicode) , 21 17 16 bytes

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

Experimente online!

Agradecemos a Erik por salvar 4 bytes e a Adám por mais um byte.

Quão?

(-≠∘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.
J. Sallé
fonte
1
(⍵>1)não precisa estar entre parênteses. E você pode salvar 4 bytes com uma função tácito: (⊢×1<⊢)⌽'E',⍴∘'C'.
Erik the Outgolfer
@EriktheOutgolfer thanks! Eu não tive tempo de ficar tácito depois de postar, porque eu tinha uma aula hoje. Vou editar quando chegar em casa.
J. Sallé 04/04
15 bytes com ⎕io = 0:'CE'[1(≠=∘⍳+)⎕]
ngn 06/04/19
@ngn Eu não posso nem ... você pode me conseguir um link TIO com os casos de teste? Parece que não consegue fazê-lo funcionar ...
J. Sallé
4

Haskell , 35 33 32 bytes

2 bytes salvos graças a Angs, 1 byte salvo graças a Lynn

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

Experimente online!

Haskell , 32 30 29 bytes

O índice é zero, portanto não cumpre o desafio

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

Experimente online!

Haskell , 30 bytes

Isso não funciona porque a saída precisa ser uma string

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

Experimente online!

Aqui usamos números em vez de cordas, 2para o corredor de emergência, 1para os carros. Podemos adicionar 1a ao final multiplicando por 10 e adicionando 1. Isso é mais barato, porque não precisamos pagar por todos os bytes para concatenação e literais de string.

Seria mais barato usar em 0vez de, 1mas precisamos de zeros à esquerda, que acabam sendo cortados.

Assistente de Trigo
fonte
((blah)!!)pode (!!)$blahsalvar um byte nas duas primeiras respostas.
Lynn
@Lynn Thanks! Eu tentei fazer isso antes, mas devo ter contado incorretamente os bytes.
Assistente de trigo
4

Python 3 , 30 29 bytes

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

Experimente online!

OK, já existem muitas respostas em Python, mas acho que este é o primeiro sub-30 byter entre aqueles que ainda usam caracteres "E" e "C" em vez de números.

Kirill L.
fonte
3

Stax , 7 bytes

ü♣àj#F 

Execute e depure

Isso usa os caracteres "0" e "1". Isso funciona porque quando você gira uma matriz de tamanho 1, ela não muda.

Descompactado, não jogado e comentado, parece com isso.

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

Execute este

recursivo
fonte
3

Perl 5 -p , 27 20 19 bytes

$_=1x$_;s/1?\K1/E1/

Experimente online!

Economizou um byte usando 1para os carros e Epara o corredor de emergência.

Xcali
fonte
3

Gelatina , 6 bytes

⁵*ṾṙỊṙ

Exibe faixas de carro como 0 , a faixa de emergência como 1 .

Experimente online!

Como 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.
Dennis
fonte
3

Espaço em branco , 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]

Letras S(espaço), T(tabulação) e N(nova linha) adicionadas apenas como destaque.
[..._some_action]adicionado apenas como explicação.

Imprime em 1vez de Ce em -vez de E.

-1 byte graças a @JoKing , sugerindo o uso de 1e em -1vez de 0e 1.

Explicação em pseudo-có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

Exemplo é executado:

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

Experimente online (apenas com espaços brutos, guias e novas linhas).
Para com erro: Saída não 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

Experimente online (apenas com espaços brutos, guias e novas linhas).
Para com erro: Saída não definida.

Kevin Cruijssen
fonte
Seria mais fácil imprimir a faixa clara como -abusando da impressão -1?
Jo rei
@JoKing Infelizmente, seria mais longo. Experimente online 112 bytes. Isso realmente mudou push_0; print_as_integer; push_1; print_as_integerpara push_-1; print_as_integer, mas em troca dos dois push_0; print_as_integersão substituídos por push_45; print_as_character, onde push_0= SSSNe push_45= SSSTSTTSTN. Além disso, push_45é necessário adicionar um adicional, porque, para entrada n=1, agora imprimo o duplicado 0que já tinha na pilha, para que não precisei pressionar 0novamente porque o 0já estava na pilha.
Kevin Cruijssen
Eu quis dizer -como substituir 1e 1substituir 0. Você evitaria pressionar 45 e, até onde eu sei, economizaria na impressão de um número na primeira metade do condicional, mas aumentaria ligeiramente os custos ao pressionar 1 em vez de 0. Verifique minha resposta Gol> <> para um exemplo da saída quero dizer
Jo rei
1
@JoKing Eu tentei implementá-lo, mas acabei com 107 bytes (aqui está o mesmo código com destaque e explicação ). Na verdade, ele economiza em print_-1vez de imprimir 0e 1, mas print_-1é necessário um adicional fora do loop. EDIT: Foi capaz de reduzi-lo para 103 bytes , alterando subtract_1; if_0_jump_to_ONE; push_-1; print_integerpara subtract_2; if_negative_jump_to_ONE; print_integer, porque -1 já está na pilha então. Então, obrigado por -1 byte. :)
Kevin Cruijssen
3

AutoHotkey 32 bytes

Substitui a letra "C" por "EC", a menos que C> 1, envie "CEC" e saia do aplicativo.

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

C => EC
CC => CEC sai do programa. Quaisquer outros Cs serão inseridos após a saída do programa.

nelsontruran
fonte
3

APL + WIN, 20 16 bytes

4 bytes salvos graças a Adám

Solicita o número inteiro n:

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

1 para o corredor de emergência o para carros.

Graham
fonte
16:(-2≠⍴n)⌽n←1⎕/⍕10
Adám 01/05/19
@ Adám Obrigado. Vejo que o truque de ngn, 1⎕ / ⍕, está sendo útil. Um para a lista de idiomas?
Graham
De que lista de idiomas você está falando?
Adám 01/05/19
@ Adám As duas listas idiom que eu uso com mais frequência são a Finnapl e APL2idioms
Graham
Não tenho certeza do que há de tão idiomático aqui. É apenas golfe. De qualquer forma, minha lista de idiomas pode lhe interessar.
Adám
3

MathGolf , 7 6 bytes

ú░\┴╜╪

Experimente online.

Saída 1para Ee 0para C.

Explicação:

ú         # 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
Kevin Cruijssen
fonte