Трикутники шестикутників


20

Припустимо нескінченну плитку шестикутників, складених |/\символами.

 / \ / \ / \ / \
|   |   |   |   |
 \ / \ / \ / \ /  etc.
  |   |   |   |
   \ / \ / \ /

З урахуванням введення n > 0, виведіть трикутну частину цієї плитки, як зображено на наведених нижче прикладах, прикріплених _до середини шестикутника:

n=1
\_/

n=2
\/ \/
 \_/

n=3
\  |  /
 \/ \/
  \_/

n=4
\/ \ / \/
 \  |  /
  \/ \/
   \_/

n=5
\  |   |  /
 \/ \ / \/
  \  |  /
   \/ \/
    \_/

n=6
\/ \ / \ / \/
 \  |   |  /
  \/ \ / \/
   \  |  /
    \/ \/
     \_/

n=7
\  |   |   |  /
 \/ \ / \ / \/
  \  |   |  /
   \/ \ / \/
    \  |  /
     \/ \/
      \_/

n=8
\/ \ / \ / \ / \/
 \  |   |   |  /
  \/ \ / \ / \/
   \  |   |  /
    \/ \ / \/
     \  |  /
      \/ \/
       \_/

and so on

Правила

  • Провідні / кінцеві нові рядки або інші пробіли необов’язкові, за умови, що символи розташовуються належним чином.
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Вихід може бути на консолі, збережений як зображення, повернутий як список рядків тощо.
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Якщо підрахувати кількість кінцевих точок уздовж верхньої частини результату, ви отримаєте A029578 (натуральні числа, переплетені з парними числами) зі зміщенням 4, 2 , 4 , 3 , 6 , 4 , 8 , 5 , 10 , 6 , 12 , 7 , 14 , ...
Інженер Тост

Що означає "збережений як образ"? це позначене мистецтво ascii?
tsh

@tsh Для таких речей, як HyperCard або щось подібне, де вихід на полотно є їх еквівалентом "stdout" виводу. Я не прискіпливий до того, як відображається вихід.
AdmBorkBork

Відповіді:


8

Python 2 , 86 байт

i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' /  |\  '[i%2::2])[:k-~i]+"_/"[i>0:]

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

Один з трюків Еріка дозволив мені пограти в 3 байти! Збережено 3 байти завдяки Джонатану Аллану.

Як це працює

По-перше, це отримує дані від STDIN і призначає його двом окремим змінним iі k. Тоді, коли змінна iє правдоподібною, ми її декрементуємо і відповідно генеруємо рядки; це скорочення для циклу від входу - 1 аж до 0.

Створення рядків

Я розділю це на кілька частин:

  • По-перше, отримання провідного інтервалу досягається за допомогою " "*(k+~i). Оскільки iвідображається через діапазон (input, 0] , ми повинні відняти його k(наш безпечно збережений вихідний вхід), decrement і повторити пробіл, який багато разів.

  • +"\\"- додає символу "\"до пробілів вище.

  • ' / |\ '[i%2::2]- Породжує наші два рядки, а саме, "/ \ "і " | "таким чином:

    • Якщо iце непарно, i% 2 дорівнює 1 , таким чином [i%2::2]повертається кожен 2 символу нашого більшого рядка, починаючи з індексу 1 (0-індексується).

    • Якщо iпарне, i% 2 дорівнює 1 , тому вищевказаний механізм робить те саме, за винятком того, що він починається з індексу 0 .

  • +~-i*- Повторює рядок, згенерований вище, або "/ \ "або " | ", i-1 раз, і додає його до інших рядків. Перевага побітового оператора ( ~- побітове доповнення, еквівалентне i віднімається від -1 ) полягає в тому, що він не потребує дужок в цьому контексті.

  • [:k-~i]- Отримує всі символи рядків, з'єднаних вище, поки індекс k- ~ i = k - (-1 - i) = k + 1 + i .

  • +"_/"[i>0:]- Це додає лише "/"якщо i ≥ 1 , інакше додається _/.

Повний приклад / деталі виконання

Давайте візьмемо приклад того, як все працює для введення 4 :

i=k=input()        # i and k are assigned to 4.
while i:           # Starts the loop. The initial value of i is 4.
i-=1;              # Decrement i. i is now 3.
" "*(k+~i)         # A space repeated k - 1 - i = 4 - 1 - 3 = 0 times.
+"\\"              # Plus the character "\". CS (Current string): "\".
' /  |\  '[i%2::2] # The string ' /  |\  '[3%2::2] = ' /  |\  '[1::2] = "/ \ ".
i*                 # ^ repeated i = 3 times: "/ \ / \ / \ ".
+                  # And concatenate. CS: "\/ \ / \ / \ "
[:k-~i]            # Get the characters of ^ up to index k + 1 + i = 4 + 1 + 3 = 8.
                   # CS: "\/ \ / \".
+"_/"[i>0:]        # Append "_/"[i>0:] = "_/"[3>0:] = "_/"[1:] = "/".
                   # CS: "\/ \ / \/".
print              # Output the result "\/ \ / \/".
while i:           # i is truthy (> 0), thus we loop again.
i-=1;              # Decrement i. i becomes 2.
" "*(k+~i)         # " " repeated 4 - 2 - 1 = 1 time. 
+"\\"              # Plus "\". CS: " \".
' /  |\  '[i%2::2] # ' /  |\  '[2%2::2] = ' /  |\  '[::2] = "  | ".
+i*                # Repeat i = 2 times and append: "  | ". CS: " \  |  |".
[:k-~i]            # CS up until k + 1 + i = 4 + 2 + 1 = 7. CS: " \  |  ".
+"_/"[i>0:]        # Append "/". CS: " \  |  /".
print              # Outputs the CS: " \  |  /".
while i:           # i is truthy (> 0), thus we loop again.
i-=1;              # Decrement i. i is now 1.
" "*(k+~i)         # " " repeated 4 - 1 - 1 = 2 times. 
+"\\"              # Plus "\". CS: "  \".
' /  |\  '[i%2::2] # ' /  |\  '[2%2::2] = ' /  |\  '[::2] = "/ \ ".
+i*                # Repeat i = 1 time and append: "/ \ ". CS: "  \/ \ ".
[:k-~i]            # CS up until k + i + 1 = 4 + 2 = 6. CS: "  \/ \".
+"_/"[i>0:]        # Append "/". CS: "  \/ \/".
print              # Outputs the CS: "  \/ \/".
while i:           # i is truthy (> 0), thus we loop again.
i-=1;              # Decrement i. i is now 0.
" "*(k+~i)         # " " repeated 4 - 1 - 0 = 3 times. 
+"\\"              # Plus "\". CS: "   \".
' /  |\  '[i%2::2] # ' /  |\  '[1%2::2] = ' /  |\  '[1::2] = "  | ".
+i*                # Repeat i = 0 times and append: "   \". CS: "   \".
[:k-~i]            # CS up until k + i + 1 = 4 + 0 + 1 = 5. CS: "   \".
+"_/"[i>0:]        # Append "_/" (because i > 0 is False since i == 0). CS: "  \_/".
print              # Outputs the CS: "  \_/".
while i:           # i == 0, hence the condition is falsy and the loop ends. 
                   # Program terminates.

Перемістіть на i-=1початок циклу та використовуйте дещо інше праворучне утворення, щоб зменшити його до 87 байт .
Джонатан Аллан

... насправді навіть краще в 86 байт, використовуючи щось на кшталт формування правої частини :)
Джонатан Аллан

@JonathanAllan ... Дякую! (Хоча переробляти пояснення буде ... важко! ... зітхання )
Містер Xcoder

@JonathanAllan Я знайшов альтернативу , яка не змінює порядок заяви про декремент.
Містер Xcoder






2

Python 2 , 123 112 110 109 100 98 96 байт

i=n=input()
while i:a=i%2;print' '*(n-i)+'\%s/'%['_',((-~i/2)*'/   \  |'[a::2])[a:~a]][i>1];i-=1

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

  • Збережено купу байтів, використовуючи введення та форматування рядків, як у відповіді Рода
  • Збережено 2 байти завдяки панові Xcoder

1
Ви можете зберегти 2 байти, замінивши -1-aна ~a(як я це зробив у своїй відповіді).
Містер Xcoder

@ Mr.Xcoder Спасибі :)
TFeld





0

Haskell, 101 99 байт

j 1=["\\_/"]
j n|r<-([1,3..n-1]>>)=('\\':cycle[init$r"/ \\ ",' ':r" |  "]!!n++"/"):map(' ':)(j$n-1)

Повертає список рядків.

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

Як це працює:

j 1=["\\_/"]               -- base case, n=1

j n                        -- for all other n
   |r<-([1,3..n-1]>>)      -- let r be the function that makes n/2 copies of
                           -- it's argument
   =                       -- the result is
      '\\':                --  a backslash, followed by
      cycle[  ]!!n         --  the inner part, which is
          init$r"/ \\ "    --    all but the last char of some copies of
                           --    "/ \ " for even line numbers, or
          ' ':r" |  "      --    some copies of " |  " prepended by a space
                           --    for odd line numbers
                           --    (chosen by indexing an infinite list of
                           --     both values alternating)   
      ++"/"                --  followed by a slash
    :                      --  and append a
               j$n-1        --  recursive call with n-1
      map(' ':)            --  where each line is prepended by a space

Редагувати: @Laikoni зберегло два байти. Спасибі!


([1,3..n-1]>>)можна використовувати замість ([1..div n 2]>>).
Лайконі



0

JavaScript (ES6), 89 85 байт

f=(y,s='\\')=>--y?s+(y&1?' / \\':' |  ').repeat(y).slice(~y-y)+`/
`+f(y,' '+s):s+'_/'

Демо




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