Зробіть аварійний коридор


46

У деяких країнах існують рекомендації чи закони щодо формування аварійних коридорів на вулицях, які мають декілька смуг руху в одному напрямку. (Далі ми розглядаємо лише смуги, що йдуть у напрямку, в якому ми їдемо.) Це правила, які дотримуються в Німеччині:

  • Якщо є лише одна смуга руху, кожен повинен їхати праворуч, щоб рятувальні машини могли проїхати ліворуч.
  • Якщо є дві або більше смуг, автомобілі на самій лівій смузі повинні їхати ліворуч, а всі інші повинні рухатися праворуч.

Виклик

Враховуючи кількість N>0регулярних смуг, виведіть макет смуг, коли формується аварійний коридор, використовуючи рядок N+1символів ASCII. Ви можете використовувати будь-які два символи від коду ASCII 33до 126, один для позначення аварійного коридору, а другий для позначення автомобілів. Дозволені проміжки чи пробіли, розриви рядків тощо.

Приклади

Тут ми використовуємо і Eдля аварійного коридору, і Cдля автомобілів.

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

18
Я не впаду за це! Ви просто шукаєте власну смугу, щоб пролізти крізь вас підступну змію.
orlp

16
@PmanAce Я дійсно не думаю, що flawr потребує нашої допомоги з цього приводу: P
orlp

8
+1, оскільки насправді це працює в Німеччині. Був у ситуації минулих вихідних.
ElPedro

10
@ msh210 Я думаю, що зображення на німецькій сторінці WP найкраще пояснюють це.
недолік

9
Ви знаєте, на перший погляд це виглядало як виклик до-якій точці з Cі E, але є дуже багато хороших підходів можливо для цього завдання! Використання математичних операцій для C=1/ E=2або C=2/ E=3як відповідає головна відповідь; використання C=0/ E=1з 10^(n-1); використання C=0/ E=.за допомогою десяткового форматування 0.0; використання C=1/ E=-шляхом використання -1; тощо. Так багато унікальних можливостей для виклику, що спочатку виглядало так актуально. Шкода, що можу поставити +1 лише один раз. ;)
Кевін Крейссен

Відповіді:


29

Python 2, 29 26 байт

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

Приклад:

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

вам потрібно вивести 21 у випадку n = 1
DanielIndie

1
@DanielIndie :( виправлено, але зараз це некрасиво.
orlp

Все-таки дуже креативне рішення :)
недолік

1
@orlp вибачте :) але все-таки чудове рішення :)
DanielIndie

3
10**n*97/30-1/n*9зберігає ще один байт, надаючи f(5) == 323333і т.д.
Лінн

28

Python 3, 35 33 байт

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

Редагувати: відкидання, f=щоб зберегти 2 байти, завдяки нагадуванню @dylnan .

Спробуйте в Інтернеті!

Щоб візуалізувати його:

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

Вихід:

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

Спробуйте 🚔 онлайн!

Python 3, 40 байт

Просте рішення:

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

Спробуйте в Інтернеті!


2
Я думаю, що у "прямого" рішення з'явилося зайве пробіл післяlambda N:
хтось

@someone Я про це не знав, дякую.
Гоян Цінь


14

Japt, 5 4 байти

Використання qдля автомобілів та +для коридору.

ç¬iÄ

Спробуй це

Заслуга Оліверу, який займав 4 байти одночасно з мною.


Пояснення

Коротке рішення, але хитре пояснення!

Найперший матеріал: Перший: çметод, застосований до цілого числа, повторює свій рядковий аргумент стільки разів. iМетод приймає 2 аргументу ( s& n) і вставки sв індексі nрядки вона застосовується.

Розширення використаних 2 ярликів unicode дає нам çq i+1, що при перекладенні на JS стає U.ç("q").i("+",1), де Uвхід. Отже, ми повторюємо q Uрази, а потім вставляємо +атрибут 1.

Останній трюк полягає в тому, що, завдяки обробці індексу Japt, коли U=1, ви iбудете вставляти +індекс 0, незалежно від того, яке значення ви використовуєте n.


Я збирався розміщувати ç0 iQ1по 6 байт, але було б краще, якби ви його використовували.
Олівер

Дякую, @Oliver. Тим часом опустив його на 5 байт.
Кудлатий

1
ç¬iÅза 4 байти;) Я ніколи так не зловживав Japt.
Олівер

Я ось-ось збирався зробити те саме, Äа не Å:)
Shaggy

7

R, 50 байт

-11 дякую Джузеппе!

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

Виходи 1 для аварійного коридору та 2 для звичайних смуг

Моя спроба, 61 байт

Тут нічого фантазії не бачити, але давайте R на табло =)

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

Використання:

q(5)
CECCCC

Збережіть 8 байтів, використовуючи 21 = 12 + 9 і примушуючи TRUE / FALSE до 1/0 без а, якщо tio.run/##K/r/v6CossjKKk0jObFEw1JLI8/…
JayCe


6

Python 2, 30 29 28 байт

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

Друк 3замість Cі .замість E.

Пояснення:

Спробуйте в Інтернеті.

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 байт

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

Друкує 1замість Cі -замість E.

-2 байти завдяки @ovs .
-1 байт завдяки @xnor .

Пояснення:

Спробуйте в Інтернеті.

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
Ваша 10/3невдача о 17
Джо Кінг

1
@JoKing я просто освітлюють О.П., і він сказав : « Використовуючи вбудований цілочисельний тип досить. », Що означає , до , n=16якщо ваше число вбудованих 64-бітних досить, або в цьому випадку , n=16якщо значення десяткового може » t за замовчуванням утримується більше 15 десяткових цифр. (Те саме стосується багатьох інших відповідей, використовуючи мови з довільними розмірами чисел, наприклад, Java, C # .NET тощо)
Кевін Круїссен


5

мозковий ебать , 42 байти

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

Спробуйте в Інтернеті!

Вводить введення як кодовий код і виводить як Vзвичайні смуги та Wочищається смуга. (Щоб легко перевірити, рекомендую замінити число ,на кількість +s)

Як це працює:

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

Октава (MATLAB *), 31 30 28 27 22 байт

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

Спробуйте в Інтернеті!

Програма працює наступним чином:

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

Використовуваний тут трюк - це XNORing насіннєвого масиву 0:nз перевіркою, якщо вхідний показник більший за 1. Результат полягає в тому, n>1що насіння перетворюється на логічний масив, в [0 1 (0 ...)]той час n==1як насіння стає інвертованим [1 0], досягаючи необхідної інверсії.

Решта - це просто перетворення насіння в рядок з достатньою кількістю доданих машин.


(*) Посилання TIO включає в коментарі колонтитулу альтернативне рішення для тієї ж кількості байтів, що працює в MATLAB, а також в Octave, але це призводить до послідовності '0' і '1', а не 'E' і ' С '. Для повноти по черзі:

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

  • Збережено 1 байт за допомогою, n==1~=0:1а не 0:1~=(n<2). ~=має пріоритет над <, отже , оригінальні дужки, але , здається , що ~=і ==обробляються в порядку їх появи шляхом порівняння з 1 ми можемо зберегти байт.

  • Збережено 2 байти, змінивши місце виконання заперечення 2:n. Це економить пару дужок. Ми також повинні змінити ~=на, ==щоб врахувати той факт, що пізніше це буде відхилено.

  • <Знову збережено 1 байт . Виявляється, він <має такий же пріоритет, як і ==врешті-решт. Розміщення <розрахунку перед ==забезпеченням правильного порядку виконання.

  • Збережено 5 байт, не створюючи двох окремих масивів. Натомість покладайтеся на те, що порівняння XNOR так чи інакше перетворить один діапазон у логіку.


Дуже розумно :-)
Стюі Гріффін

@StewieGriffin Дякую :). Вдалося збити ще 5 байт.
Том Карпентер



4

Python 3, 32 байти

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

Спробуйте в Інтернеті!

Використовує вираз f-string для форматування 'E'або 'CE'вкладеного праворуч, 'C'щоб він мав ширину 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

Мозг-Флак , 100 66 байт

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

Спробуйте в Інтернеті!

Використовується "як аварийна смуга і !як звичайна смуга .


+1 за використання цією мовою всіх речей. XD
Алекс

2
@ Алекс, ну, Brain-Flak - мова місяця для квітня
Jo King,

Серйозно чи наприкінці квітня жарт Дурня? Де обираються мови місяця?
Олексій

@ Алекс тут пропонуються номінації та голосування , а потім відбувається посада, яка стосується конкретного місяця, як ця
Каміль Дракарі

О, це на цій платформі. Бачу, дякую! :-)
Олексій


4

05AB1E , 7 байт

Î>∍1I≠ǝ

Спробуйте в Інтернеті!

0 є C і 1 - E.

Пояснення

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

Ой ти хитра лисиця. $<×TìsiRяк я думав.
Чарівний восьминіг Урна

@MagicOctopusUrn Це цікавий підхід! Я затримався і над конструкцією "якщо", але для цього потрібно щонайменше 3 байти, отже, потреба в іншому підході :-)
Калдо

У новій версії 05AB1E 1Iможна пограти в гольф $.
Кевін Круїссен

5 байт (також працює у застарілій версії).
Кевін Кройсейсен

4

APL (Dyalog Unicode) , 21 17 16 байт

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

Спробуйте в Інтернеті!

Дякую Еріку за збереження 4 байтів, а Адаму - ще один байт.

Як?

(-≠∘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)не потрібно бути в дужках. І ви можете зберегти 4 байта з мовчазною функцією: (⊢×1<⊢)⌽'E',⍴∘'C'.
Ерік Аутгольфер

@EriktheOutgolfer дякую! У мене не було часу мовчати після публікації, оскільки я мав сьогодні заняття. Я редагую, коли повернусь додому.
Дж. Салле


15 байт з ⎕io = 0:'CE'[1(≠=∘⍳+)⎕]
пн.

@ngn Я навіть не можу ... чи можете ви мені зв’язати TIO із тестовими кейсами? Не можу зробити так, щоб це спрацювало ...
Дж. Салле

4

Haskell , 35 33 32 байт

2 байти збережено завдяки Angs, 1 байт збережено завдяки Lynn

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

Спробуйте в Інтернеті!

Haskell , 32 30 29 байт

Це нульове значення, тому воно не відповідає виклику

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

Спробуйте в Інтернеті!

Haskell , 30 байт

Це не працює, тому що для виводу повинен бути рядок

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

Спробуйте в Інтернеті!

Тут ми використовуємо цифри замість струн, 2для аварійного коридору, 1для автомобілів. Ми можемо додати а 1до кінця, помноживши на 10 і додавши 1. Це дешевше, оскільки нам не доведеться платити за всі байти за конкатенацію та рядкові букви.

Було б дешевше використовувати 0замість , 1але нам потрібні провідні нулі, які в кінцевому підсумку отримати обрізані.


((blah)!!)може стати (!!)$blahдля збереження байта у ваших перших двох відповідях.
Лінн

@Lynn Дякую! Я намагався зробити це раніше, але, мабуть, неправильно перерахував байти.
Пшеничний майстер




3

Стакс , 7 байт

ü♣àj#F 

Запустіть і налагоджуйте його

Для цього використовуються символи "0" та "1". Це працює, тому що, коли ви обертаєте масив розміром 1, він не змінюється.

Розпакований, неозорений та прокоментований, це виглядає приблизно так.

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

Виконати цей




3

Желе , 6 байт

⁵*ṾṙỊṙ

Показує автомобільні смуги як 0 , аварийну смугу - 1 .

Спробуйте в Інтернеті!

Як це працює

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

Пробіл , 141 104 103 байт

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

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Друкує 1замість Cі -замість E.

-1 байт завдяки @JoKing , пропонуючи використовувати 1та -1замість 0і 1.

Пояснення в псевдокоді:

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

Приклад виконання:

Вхід: 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

Спробуйте його в режимі он-лайн (лише з просторами, вкладками та новими рядками).
Зупиняється з помилкою: вихід не визначений.

Вхід: 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

Спробуйте його в режимі он-лайн (лише з просторами, вкладками та новими рядками).
Зупиняється з помилкою: вихід не визначений.


Чи було б простіше надрукувати чітку смугу, як -зловживати друком -1?
Джо Кінг

@JoKing На жаль, це було б довше. Спробуйте в Інтернеті 112 байт. Це дійсно змінилося push_0; print_as_integer; push_1; print_as_integerдо push_-1; print_as_integer, але в обмін на два push_0; print_as_integerзамінюються на push_45; print_as_character, де push_0= SSSN, і push_45= SSSTSTTSTN. І push_45ще потрібно додати ще одне , тому що для введення n=1я тепер друкую дублікат, який 0я вже мав у стеку, тому мені не довелося 0знову натискати, оскільки 0на стеці вже було.
Кевін Круїйсен

Я мав на увазі -як заміну 1і 1заміну 0. Тоді вам не вдасться натиснути 45, і наскільки я можу сказати, це дозволить заощадити на друкуванні номера в першій половині умовного, але трохи збільшить витрати на натискання 1 замість 0. Перевірте мій Gol> <> відповідь Приклад результату я маю на увазі
Джо Кінг

1
@JoKing Я спробував його реалізувати, але я закінчився 107 байтами (ось той самий код з додаванням виділення та пояснення ). Він дійсно економить print_-1замість друку 0та 1, але print_-1поза циклом потрібен додатковий . EDIT: змінено скоротити його до 103 байт шляхом зміни subtract_1; if_0_jump_to_ONE; push_-1; print_integerдо subtract_2; if_negative_jump_to_ONE; print_integer, тому що -1 вже є на стеці. Тож спасибі за -1 байт. :)
Кевін Круїссен

3

AutoHotkey 32 байти

Замінює букву "C" на "EC", якщо кількість C> 1 не надходить, тоді вона надсилає "CEC" і закриває додаток.

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

C => EC
CC => CEC виходить із програми. Будь-які подальші C будуть введені після закінчення програми.


3

APL + WIN, 20 16 байт

4 байти збережено завдяки Adám

Підказки до цілого n:

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

1 для аварійного коридору o для автомобілів.


16:(-2≠⍴n)⌽n←1⎕/⍕10
Адам

@ Adám Дякую Я бачу, що хитрість ngn, 1⎕ / ⍕, стає корисною. Один для списку ідіом?
Грем

Про який перелік ідіомів ви говорите?
Адам

@ Adám Два списки ідіоми, які я найчастіше використовую, - це Фіннапл і APL2idioms
Грем

Я не впевнений, що тут ідіоматичного. Це просто гольф. У будь-якому випадку мій список ідіомів може вас зацікавити.
Adám


3

MathGolf , 7 6 байт

ú░\┴╜╪

Спробуйте в Інтернеті.

Вихідні дані 1для Eта 0для C.

Пояснення:

ú         # 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.