Довільна інтервальна лінійка


25

Створіть програму, яка займає довжину та список інтервалів та виводить лінійку такої довжини з довшими кліщами для кожного інтервалу, використовуючи символи малювання рядків ┌ ┬ ┐ │ ╵

  • Перший рядок виводу повинен починатися галочкою на 0 з і закінчуватися галочкою на довжину з , використовуючи для кожного символу між ними. Буде всьогоlength цьому першому рядку + 1 символ символів для малювання рядків.
  • Кліщ повинен бути подовжений вертикально з кроком на пів символів, використовуючи та на основі вхідних інтервалів.
  • Інтервали перераховані від найменшого до найбільшого відносно інтервалу перед ним. Розробити:
    • Перший інтервал показує, скільки базових кліщів (перший рядок - один символ на галочку) знаходиться у другому найменшому інтервалі (найменший інтервал - 1). Наприклад, [3] подовжить кожну третю галочку на пів символу.
    • Другий та наступні інтервали складаються з точки зору наступного найменшого інтервалу. Наприклад, [3, 5] подовжить кожну 15-ту основну галочку на повний символ, а [3, 5, 2] подовжить кожні 30-ту базову галочку на півтора символу.
    • Піддінтервал 1 є дійсним і фактично означає, що останні інтервальні рядки подовжуються повним символом замість напівсимволу.
  • Приклади тестових випадків повинні допомогти з’ясувати, як це працює.

Приклади / Випробування

3, []:

┌┬┬┐

9, [3]:

┌┬┬┬┬┬┬┬┬┐
╵  ╵  ╵  ╵

30, [5, 2]:

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│    ╵    │    ╵    │    ╵    │

32, [4, 2, 2, 2]:

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│   ╵   │   ╵   │   ╵   │   ╵   │
│               ╵               │

48, [5, 3, 2]

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│    ╵    ╵    │    ╵    ╵    │    ╵    ╵    │
╵                             ╵

24, [7, 3]

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│      ╵      ╵      │

17, [3, 2, 1]

┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
│  ╵  │  ╵  │  ╵
╵     ╵     ╵

1, [23, 19, 13, 11, 7, 5, 3, 2, 1]

┌┐
│
│
│
│
╵

Інші правила / примітки

  • Для введення та виводу можна використовувати будь-який зручний формат
  • Лінійці не потрібно закінчувати головну галочку
  • Список інтервалів може бути порожнім
  • Нульова галочка завжди знаходиться у всіх інтервалах.
  • Ви можете припустити, що довжина лінійки та інтервали завжди будуть додатними цілими числами, меншими ніж 120
  • Пробіл пробілів добре, але провідний пробіл - ні.
  • Будь-який фіксований єдиний широкий простір дозволений як пробільний символ, якщо ви з якоїсь причини хочете використовувати щось інше, ніж пробіли ASCII.

Щасливого гольфу!


Чи можу я роздрукувати перший рядок, а потім повернути список стовпців?
Втілення Невідомості

@EmbodimentofIgnorance, я скажу "ні". Вихід повинен бути узгодженим.
Beefster

Чи можемо ми взяти символи, що малюють коробки, з однобайтового кодування (за умови наявності одного, що містить необхідні)?
Οurous

" будь-який зручний формат " - чи можемо ми прийняти список інтервалів у зворотному порядку?
ngn

@ngn: Я не бачу, чому ні. Якщо це якимось чином допоможе вам, ідіть на це.
Beefster

Відповіді:



3

Perl 6 , 130 122 102 92 байт

-10 байт завдяки nwellnhof!

{'┌'~'┬'x$^a-1~'┐',|map {[~] <<' ' │>>[:1[$_ X%%@_]for 0..$a]},batch [\*] @^b: 2}

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

Ага так, набагато коротший, ніж мій попередній метод. Це блок анонімного коду, який повертає список рядків.

Пояснення:

{                                                   }   # Anonymous code block
 '┌'~'┬'x$^a-1~'┐',     # Return the first line
 |[\*] @^b          # Get the cumulative product of the input list
              .batch(2) # And split it into pairs
  .map:{                                      }  # Map each pair to
                                    for 0..$a    # For each interval
                        :1[$_ X%%@_]    # Whether it is divisible by none of the pair, one of the pair, or both
            <<' ' │>>[                     ]      # Map to a list of characters
        [~]        # And join

3

Діялог APL, 66 64 58 52 байти

{'┌┐'@0⍵@0⍉('┬│',⎕UCS 9589)/⍤11,⍉0 2⊤⊥¨⍨0=(⍵+1)⍴⍳⍺}

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

¯2 ¯8 ¯14 байт завдяки ngn !


∊'┌'(1↓⍵⍴'┬')'┐'->'┌┬┐'/⍨2⍵2-1
ngn

@ngn спасибі! Це види гольфів, які цілком зрозумілі, але я ніколи не знаю передбачити чи знаю використання
dzaima

нарешті, мені вдалося трохи скоротити праву частину ... +⌿0=(×\⍺)∘.|⍳1+⍵-> ⊥¨⍨0=(⍵+1)⍴⍳⌽⍺. прийняття в зворотному порядку був явно дозволено в даний час, так що ви можете також видалити
СПП

('┌┬┐'/⍨2⍵2-1)->'┌┬┐'[2,⍨×⍳⍵]
ngn

а ще краще: ('┌┬┐'/⍨2⍵2-1)⍪⍉->'┌┐'@0⍵@0⍉'┬',
ngn


2

05AB1E , 51 байт

ÝεyIηPÖO2‰•5·W4•2äç×SI¯Qiεõ}}•áΣ=Yô•3äçy¹QyĀ+èš}ζJ»

Не надто задоволений I¯Qiεõ}}як обхід для порожніх вхідних списків.

ПРИМІТКА: Використовуються стислі цілі числа, перетворені на потрібні символи, оскільки використання потрібних символів безпосередньо означає, що мені доведеться рахувати всю програму в UTF-8, збільшуючи її занадто багато для всіх вбудованих символів 05AB1E.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Ý             # Create a list in the range [0, first (implicit) input-integer]
 ε            # Map each value `y` to:
   Iη         #  Get the prefixes of the second input-list
     P        #  Get the product of each prefix
  y   Ö       #  Check for each if its evenly dividing the value `y`
       O      #  Take the sum of that
        2    #  And then the divmod 2
  5·W4      #  Push compressed integer 94749589
        2ä    #  Split into two equal-sized parts: [9474,9589]
          ç   #  Convert each to a character: ["│","╵"]
           ×  #  Repeat each based on the divmod 2 result
            S #  And convert it to a flattened list of characters
  I¯Qi   }    #  If the second input-list was empty:
      εõ}     #   Map each list to an empty string
              #   (for some reason `€õ` doesn't work here..)
  •áΣ=Yô•     #  Push compressed integer 948495169488
         3ä   #  Split into three equal-sized parts: [9484,9516,9488]
           ç  #  Convert each to a character: ["┌","┬","┐"]
  y¹Q         #  Check if the value `y` is equal to the first input-integer
              #  (1 if truthy; 0 if falsey)
     yĀ       #  Check if the value `y` is NOT 0 (1 if truthy; 0 if falsey)
       +      #  Add both checks together
        è     #  Use it to index into the list ["┌","┬","┐"]
         š    #  And prepend the result in front of the other characters
            # After the map: zip/transpose; swapping rows and columns (with space filler)
   J          # Join every inner list together to a single string
    »         # Join the lines with newline delimiter (and output implicitly)

Дивіться цей мінний наконечник 05AB1E (розділ Як стискати великі цілі числа? ), Щоб зрозуміти, чому •5·W4•це так 94749589і •áΣ=Yô•є 948495169488.



@MagicOctopusUrn Спочатку я теж так подумав, але це, на жаль, не слід (просто спробуйте це з одним із інших тестових випадків із не порожнім списком). sиSпрацює, але, на жаль, це байт довше, ніж коротший. Це тому, що цілі числа знаходяться на стеці спочатку, а рядки - після. З ×ним не має значення , чи є це int,stringабо string,int, але ивін очікує string,int.
Кевін Кройсейсен

О, я бачу, чоловік цей був бентежить ха-ха. Гарна робота на ньому, чесно кажучи, я витратив 10 хвилин, просто намагаючись зрозуміти, що відбувається, пропустив цей примх и! Це буде добре знати в майбутньому, я не бачив, щоб він використовувався раніше, ніж одна з ваших відповідей.
Чарівний восьминога Урна

2

Вугілля деревне , 50 байт

≔EηΠ…η⊕κη⪫┐┌×┬⊖θ↙↓EE⊕θΣEη¬﹪ιλ⁺×│⊘ι×╵﹪ι²‖

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Символи для малювання коробки мають 3-байтне зображення у вугільному вугіллі, тому вищевказана рядок має лише 40 символів. Пояснення:

≔EηΠ…η⊕κη

Обчисліть сукупний добуток інтервалів.

⪫┐┌×┬⊖θ↙

Роздрукуйте перший ряд галочок. Лівий і правий символи - це неправильний шлях, оскільки результат відображається пізніше.

↓EE⊕θΣEη¬﹪ιλ⁺×│⊘ι×╵﹪ι²

Обчисліть кількість інтервалів, які є коефіцієнтом кожної позначки. Створіть рядок s половини цієї довжини та додайте для непарних довжин. Друкуйте кожен рядок вниз, наступні рядки в попередніх стовпцях, тобто зворотній порядок.

Відобразити все, щоб перевести лінійку в порядку зліва направо.



2

Emacs Lisp , 303 байти

(defun f(a)(princ'┌)(dotimes(i(1-(car a)))(princ'┬))(princ'┐)(let((m 1))(while(cadr a)(let((q(caadr a))(w (cadadr a)))(princ"\n")(dotimes(i(1+(car a)))(cond((if w(= 0(mod i(* m q w))))(princ'│))((= 0(mod i (* m q)))(princ'╵))(t(princ" "))))(setq m(* m q(if w w 1)))(setcdr a`(,(cddadr a)))))))

Використовуйте цю функцію як (f '(30 (5 2))).

Краще читаема версія:

(defun f (a)
  (princ '┌)
  (dotimes (i (1- (car a)))
    (princ '┬))
  (princ '┐)
  (let ((m 1))
    (while (cadr a)
      (let ((q (caadr a)) (w (cadadr a)))
    (princ "\n")
    (dotimes (i (1+ (car a)))
      (cond ((if w (= 0 (mod i (* m q w))))
        (princ '│))
       ((= 0 (mod i (* m q)))
        (princ '╵))
       (t
        (princ " "))))
    (setq m (* m q (if w w 1)))
    (setcdr a `(,(cddadr a)))))))

2

Желе ,  42  41 байт

‘Rm×\}Ṭ€+2/
⁽!ṣ;“½¥÷I‘ÄỌṙ-;⁶
Ḷ¬;.Ḥ~W;ñị¢Y

Повна програма.
Спробуйте в Інтернеті!

Або подивіться тестовий набір
Примітка: цей код змінено з повної програми - ñ(наступне посилання як діада) замінено на (посилання в індексі 1 як діада), щоб дозволити його кілька разів викликати колонтитул .

Як?

‘Rm×\}Ṭ€+2/ - Link 1, lower interval tick types: length; intervals  e.g. 7; [3,2]
‘           - increment length                                           8
 R          - range                                                      [1,2,3,4,5,6,7,8]
     }      - use right argument for this monad as if it were a dyad:
   ×\       -   cumulative reduce by multiplication                      [3,6]
  m         - modulo slice (vectorises)                                  [[1,4,7],[1,7]]
      Ṭ€    - untruth €ach                               [[1,0,0,1,0,0,1],[1,0,0,0,0,0,1]]
        +2/ - pairwise reduce with addition                              [[2,0,0,1,0,0,2]]
            -   -- yielding a list of types for each row of characters below the first
            -      where 0 is a space, 1 is a short tick-mark and 2 is a long tick-mark

⁽!ṣ;“½¥÷I‘ÄỌṙ-;⁶ - Link 2, make character set: no arguments
⁽!ṣ              - literal 9474
    “½¥÷I‘       - list of code-page indices   = [10,4,28,73]
   ;             - concatenate              [9474,10,4,28,73]
          Ä      - cumulative addition      [9474,9484,9488,9516,9589]
           Ọ     - to characters            "│┌┐┬╵"
            ṙ-   - rotate left by -1        "╵│┌┐┬"
               ⁶ - literal space character  ' '
              ;  - concatenate              "╵│┌┐┬ "

Ḷ¬;.Ḥ~W;ñị¢Y - Main link: length, L; intervals, I
Ḷ            - lowered range         [ 0, 1, 2, ..., L-1]
 ¬           - logical Not           [ 1, 0, 0, ..., 0]
   .         - literal 0.5
  ;          - concatenate           [ 1, 0, 0, ..., 0, 0.5]
    Ḥ        - double                [ 2, 0, 0, ..., 0, 1]
     ~       - bitwise NOT           [-3,-1,-1, ...,-1,-2]
      W      - wrap that in a list  [[-3,-1,-1, ...,-1,-2]]
        ñ    - call next Link (1) as a dyad (f(L, I))
       ;     - (left) concatenated with (right)
          ¢  - call last Link (2) as a nilad (f())
         ị   - (left) index into (right)  (1-indexed and modular)
           Y - join with newline characters
             - implicit print

1

Рубін , 126 байт

->l,i{y=1;[?┌+?┬*~-l+?┐]+i.each_slice(2).map{|j,k|x=y*j;y=k&&x*k;(0..l).map{|z|'│╵ '[(z%x<=>0)+(k ?z%y<=>0:1)]}*''}}

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

Виглядає досить багатослівно з усім цим each_slice цими речами, але робити це поки що, якщо мені не вдасться знайти підхід для гравців.

Приймає введення як lдля довжини, так і iдля інтервалів, повертає масив рядків.


1

R , 175 170 байт

function(l,i,`&`=rep)rbind(c('┌','┬'&l-1,'┐'),if(i)sapply(rowSums(!outer(0:l,cumprod(i),`%%`)),function(j,x=j%/%2,y=j%%2)c('│'&x,'╵'&y,' '&(1+sum(1|i))/2-x-y)))

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

Приймає порожні інтервали як 0, повертає матрицю символів. TIO-посилання відображає вихід з симпатичним друком.


1

Haskell , 167 164 149 байт

n%l=unlines$("┌"++([2..n]>>"┬")++"┐"):[do p<-[0..n];let(j#a)b|1>p`rem`product(take j l)=a|1>0=b in(i-1)#(i#"│"$"╵")$" "|i<-[1,3..length l]]

Спробуйте в Інтернеті! Трохи гольф інший підхід від Οurous .


n%l|let c=take(n+1).cycle;m&(x:y:r)=c('│':init([1..y]>>(m*x)!" "++"╵"))++'\n':(m*x*y)&r;m&[x]=c$'╵':(m*x)!" ";m&e=[]='┌':n!"┬"++"┐\n"++1&l
n!s=[2..n]>>s

Спробуйте в Інтернеті! Є ще деякі надмірності, схожі на те, що їх можна було експлуатувати, але поки вони витримали всі подальші спроби гольфу.


Попереднє рішення 167 байтів відрізняється від обробки нового рядка і, ймовірно, трохи краще читається:

n%l=unlines$('┌':n!"┬"++"┐"):(take(n+1)<$>1&l)
n!s=[2..n]>>s
m&(x:y:r)=cycle('│':init([1..y]>>(m*x)!" "++"╵")):(m*x*y)&r
m&[x]=[cycle$'╵':(m*x)!" "]
m&e=[]

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


1
Різний підхід у 158 байт ( спробуйте це в Інтернеті! ), Ймовірно, можна скоротити трохи більше, оскільки я не розмовляю з Haskell добре.
Οurous

@ Οurous Спасибі!
Лайконі

1

PowerShell , 152 байти

param($t,$i)"┌$('┬'*--$t)┐"
$i|%{$s=++$s*$_-1;$p=".(.{$s}|.*$)"
if($r){$r-replace$p,'│$1';rv r}else{$r=' '*($t+2)-replace$p,'╵$1'}}
if($r){$r}

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

Розгорнуто:

param($ticks,$intervals)
"┌$('┬'*--$ticks)┐"                         # implicit output
$intervals|%{
    $step=++$step*$_-1
    $pattern=".(.{$step}|.*$)"
    if($row){
        $row-replace$pattern,'│$1'          # implicit output
        Remove-Variable row
    }else{
        $row=' '*($ticks+2)-replace$pattern,'╵$1'
    }
}
if($row){$row}                              # implicit output


1
Ти правий. 1) Я не бачив правила, яке дозволяє закінчити новий рядок в кінці. 2) і мені не подобається, що код іноді додає новий рядок в кінці, а іноді і не. :)
mazzy


0

Чисто , 221 201 195 162 байт

import StdEnv
$n l=[["┌":repeatn(n-1)"┬"]++["┐"]:[[if(?(i-1))if(?i&&l%(i,i)>[])"│""╵"" "\\p<-[0..n],let?j=1>p rem(prod(l%(0,j)))
]\\i<-[1,3..length l]]]

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

Повертає список списків символів UTF-8 (як рядки, оскільки Clean не має вродженої підтримки UTF-8).

Працює, генеруючи перший рядок, потім беручи добуток із префіксів списку, наданих у групи по дві, і перевіряє, яку позначку потрібно намалювати, виходячи з того, чи ділить продукт поточну позицію символів.

Безголівки:

$ n l
    = [
        ["┌": repeatn (n - 1) "┬"] ++ ["┐"]:
        [
            [
                if(? (i - 1))
                    if(? i && l%(i, i) > [])
                        "│"
                        "╵"
                    " "
                \\ p <- [0..n]
                , let
                    ? j = 1 > p rem (prod (l%(0, j)))
            ]
            \\ i <- [1, 3.. length l]
        ]
    ]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.