ไม้บรรทัดช่วงเวลาโดยพลการ


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]

┌┐
│
│
│
│
╵

กฎ / หมายเหตุอื่น ๆ

  • อินพุตและเอาต์พุตสามารถใช้รูปแบบใดก็ได้ที่สะดวก
  • ไม้บรรทัดไม่จำเป็นต้องจบลงด้วยเห็บใหญ่
  • รายการช่วงเวลาอาจว่างเปล่า
  • ศูนย์ zeroth จะอยู่ในทุกช่วงเวลาเสมอ
  • คุณอาจถือว่าความยาวไม้บรรทัดและช่วงเวลาจะเป็นจำนวนเต็มบวกน้อยกว่า 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

Dyalog 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)⍴⍳⌽⍺การยอมรับในลำดับย้อนกลับได้รับอนุญาตอย่างชัดเจนในขณะนี้ดังนั้นคุณสามารถลบ
ngn

('┌┬┐'/⍨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อย่างไร


×Sสามารถи
Magic Octopus Urn

@ MagicOctopusUrn ตอนแรกฉันก็คิดอย่างนั้นเหมือนกัน แต่มันก็ไม่น่าเสียดาย (แค่ลองกับกรณีทดสอบอื่น ๆ ที่ไม่มีรายการว่าง) sиSทำงานได้ แต่น่าเสียดายที่มันเป็นไบต์นานกว่าแทนที่จะสั้นกว่า เป็นเพราะจำนวนเต็มอยู่บนสแต็กก่อนและหลังสตริง ด้วย×มันไม่ได้เรื่องไม่ว่าจะเป็นint,stringหรือstring,intแต่มีการคาดว่าи string,int
Kevin Cruijssen

โอ้ฉันเห็นแล้วผู้ชายคนนี้ทำให้สับสน เป็นงานที่ดีมากบอกตามตรงฉันใช้เวลา 10 นาทีแค่พยายามคิดว่าเกิดอะไรขึ้นพลาดเรื่องอาหารอันโอชะи! นั่นจะเป็นการดีที่จะรู้ว่าในอนาคตฉันไม่เคยเห็นมันมาก่อนคำตอบอื่นของคุณ
Magic Octopus Urn

2

ถ่าน 50 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด อักขระแบบกล่องวาดมีการแทนค่า 3 ไบต์ใน Charcoal ดังนั้นสตริงด้านบนมีความยาวเพียง 40 อักขระ คำอธิบาย:

≔EηΠ…η⊕κη

คำนวณผลิตภัณฑ์สะสมของช่วงเวลา

⪫┐┌×┬⊖θ↙

พิมพ์เครื่องหมายถูกในแถวแรก อักขระทางซ้ายและขวาเป็นวิธีที่ไม่ถูกต้องเนื่องจากผลลัพธ์จะปรากฏในภายหลัง

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

คำนวณจำนวนช่วงเวลาที่เป็นปัจจัยของเครื่องหมายแต่ละอัน สร้างสตริงที่มีความยาวครึ่งหนึ่งและเพิ่มความยาวคี่ พิมพ์แต่ละสตริงลงด้วยสตริงที่ตามมาในคอลัมน์ก่อนหน้าเช่นย้อนกลับ

สะท้อนทุกอย่างเพื่อให้ได้ผู้ปกครองตามลำดับจากซ้ายไปขวา



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

โปรแกรมเต็มรูปแบบ
ลองออนไลน์!

หรือดูชุดทดสอบ
หมายเหตุ: รหัสนี้ได้ถูกเปลี่ยนจากโปรแกรมเต็ม - ñ(ลิงค์ถัดไปเป็น dyad) ถูกแทนที่ด้วย(ลิงค์ที่ดัชนี 1 เป็น dyad) เพื่อให้สามารถเรียกมันได้หลายครั้งโดยส่วนท้าย .

อย่างไร?

‘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)]}*''}}

ลองออนไลน์!

ดูค่อนข้าง verbose กับทุกสิ่งที่ 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ขอบคุณ!
Laikoni

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

C # (Visual C # Interactive Compiler) , 204 ไบต์

a=>b=>{Write("┌"+"┐\n".PadLeft(++a,'┬'));for(int i=1;;i++,WriteLine())for(int j=0;j<a;){var m=b.Select((c,d)=>b.Take(d+1).Aggregate((e,f)=>e*f)).Count(c=>j++%c<1);Write(m<1|i>m?" ":m<2?"╵":"|");}}

ลองออนไลน์!

เอาท์พุท แต่ติดค้างอยู่ในวงวนไม่สิ้นสุด


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 โดยกำเนิด)

ทำงานโดยการสร้างบรรทัดแรกจากนั้นนำผลิตภัณฑ์ของส่วนนำหน้าของรายการที่ให้ไว้ในกลุ่มที่สองและตรวจสอบว่าเครื่องหมายใดที่จะวาดตามว่าผลิตภัณฑ์แบ่งตำแหน่งอักขระปัจจุบันหรือไม่

Ungolfed:

$ 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]
        ]
    ]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.