ASCII Gantt ง่าย ๆ


31

นี่คือหนึ่งที่ง่าย: พิมพ์ ASCII แผนภูมิแกนต์

กำหนดช่วงงาน '(เริ่มต้น - Tuples เวลาสิ้นสุด) พิมพ์ Gantt Timeline ในรูปแบบของ-ตัวละครสำหรับแต่ละระยะเวลางาน - แต่ละงานในบรรทัดใหม่

ตัวอย่าง

สมมติว่างานของฉันอยู่ในช่วง28->35, 34->40, 39->44Gantt จะมีลักษณะเช่นนี้:

                            -------
                                  ------
                                       -----

ข้อมูลจำเพาะ

  • คุณสามารถเขียนโปรแกรมเต็มฟังก์ชั่นที่มีชื่อหรือฟังก์ชั่นที่ไม่ระบุชื่อ
  • โปรแกรมของคุณ / ฟังก์ชั่นควรจะยอมรับงานผ่าน STDIN หรือเป็นข้อโต้แย้ง
  • งานแต่ละงานควรจะแสดงเป็นสตริงของstart->endที่startและendเป็นจำนวนเต็ม งานถูกคั่นด้วยช่องว่างหรือเครื่องหมายจุลภาค อีกวิธีหนึ่งคุณอาจได้รับเป็น Tuple of Integers หรือ Array / Collection 2 Integers (ตัวอย่างเช่นใน JavaScript คุณสามารถรับมัน[start,end]- เป็นสิ่งที่ได้รับอนุญาต)
  • ควรสนับสนุนจำนวนงานที่ไม่เป็นลบ (อาร์กิวเมนต์) ใด ๆ
  • เพื่อให้ชัดเจนไม่อนุญาตให้มีการรวบรวมอาร์กิวเมนต์งานเดียว คุณสามารถแยกอาร์กิวเมนต์สตริงเดี่ยวหรือสนับสนุนอาร์กิวเมนต์ของภารกิจที่มากกว่าหรือมากกว่าก็ได้ โดยที่ task คือ tuple หรือชุดของขนาด 2
  • คุณสามารถสันนิษฐานได้ว่าป้อนข้อมูลที่ถูกต้องเท่านั้น ซึ่งหมายความว่าแต่ละงานมีระยะเวลาบวก
  • ค่าส่งคืนไม่สำคัญรหัสของคุณจะต้องพิมพ์เส้นเวลาบน STDOUT
  • เอาท์พุท: ต่องานstartช่องว่างตามด้วยเครื่องหมายขีดกลางและ(end-start)\n
  • ไม่จำเป็นต้องพูดบรรทัดเอาท์พุทควรสั่งให้สอดคล้องกับคำสั่งอินพุต (งาน)
  • ต่อท้ายช่องว่างก่อนที่\nจะอนุญาตถ้านั่นช่วยคุณ

กรณีทดสอบ

Input:
(empty)

Output:
(empty)


Input:
0->7,5->6,3->6

Output:
-------
     -
   ---


Input:
5->20,5->20,2->10,15->19

Output:
     ---------------
     ---------------
  --------
               ----

การชนะ

  • นี่คือเพื่อให้ความยาวรหัสน้อยที่สุด (เป็นไบต์) ชนะ
  • ตามเนื้อผ้าไทเบรกเกอร์โพสต์ก่อนหน้านี้
  • "ช่องโหว่มาตรฐานไม่ตลกอีกต่อไป"

-----

แก้ไข

ตามที่คุณหลายคนเข้าใจว่ามันได้รับอนุญาตให้มีอาร์กิวเมนต์การรวบรวมงานเดี่ยวและเนื่องจากไม่มีความแตกต่างระหว่างความต้องการนั้นและความต้องการ varargsดั้งเดิมตอนนี้จึงอนุญาตให้มีอาร์กิวเมนต์การรวบรวมเดี่ยวหากคุณไม่ต้องการใช้ ตัวเลือก varargs หรือในกรณีที่ภาษาของคุณไม่รองรับ varargs


1
จุดที่ 3 ดูเหมือนชัดเจน แต่ piint 5 ( To make it clear...) ไม่ชัดเจนเลย
edc65

เอาล่ะผมขอใช้ถ้อยคำใหม่ว่า: คุณไม่สามารถเขียนฟังก์ชั่นที่ยอมรับอาร์กิวเมนต์หนึ่งตัวยกเว้นว่ามันเป็นสตริง หากเป็นสิ่งอันดับที่เรากำลังพูดถึงพวกเขาอาจถูกส่งไปยังฟังก์ชันของคุณเป็นอาร์กิวเมนต์ไม่ใช่ห่อในคอลเลกชัน ตัวอย่างเช่นใน JavaScript: คุณอาจทำซ้ำargumentsภายในฟังก์ชัน แต่คุณอาจไม่คิดว่าarguments[0]มันเป็นงานที่ต้องทำมากมาย
Jacob

8
ทำไมไม่อนุญาตให้ป้อนข้อมูลในแบบอาเรย์ / รายการ / เวกเตอร์ / อื่น ๆ สำหรับทุกภาษา? การตั้งค่าส่วนตัวดูเหมือนจะเป็นเหตุผลที่อ่อนแอ
Doorknob

1
Varargs เทียบกับรายชื่ออาร์กิวเมนต์เป็นความแตกต่างทางด้านวากยสัมพันธ์และทิ้งกฎของคำถามนี้ขึ้นอยู่กับระดับของการตีความที่ไม่จำเป็นและโดยพลการในความคิดของฉัน
JohnE

2
@Jacob ทำให้รู้สึก สำหรับความท้าทายในอนาคตฉันขอแนะนำให้ใช้ข้อมูลจำเพาะที่หละหลวมที่สุด: Mangling input ไม่ควรเป็นส่วนหนึ่งของความท้าทาย
อดัม

คำตอบ:


14

CJam, 16 14 ไบต์

q~{S.*~'-e]N}/

สิ่งนี้คาดว่าจะมีรายการของรายการเป็นอินพุต ตัวอย่างเช่น:

[[5 20] [5 20] [2 10] [5 19]]

ให้:

     ---------------
     ---------------
  --------
     --------------

มันทำงานอย่างไร

q~                      e# Read the input and parse it as a list of list
  {         }/          e# Go over each item in the list in a for loop
   S                    e# S is basically this string - " "
    .*                  e# Multiply each item of the first list with the corresponding index
                        e# item of the second list. This basically repeats the space
                        e# X times where X is the first number of the tuple. The second
                        e# number remains untouched as the second list was only 1 char long
      ~                 e# Unwrap the space string and second number containing list
       '-               e# Put character '-' on stack
         e]             e# Make sure that the space is filled with - to its right so as to
                        e# make the total length of the string equal to the second number
           N            e# Put a newline. After all iterations, the result is printed
                        e# automatically to STDOUT

ลองออนไลน์ได้ที่นี่


20

Python 2, 39 ไบต์

วิธีแก้ปัญหาตรงไปตรงมาโดยใช้การคูณสตริง :)

for x,y in input():print' '*x+'-'*(y-x)

ยอมรับอินพุตที่จัดรูปแบบดังนี้:

((5,20),(5,20),(2,10),(15,19))

ตรวจสอบที่นี่


11

Brainfuck, 120 115 111 ไบต์

อย่างน้อยก็สั้นกว่า Java :) อินพุตคือรายการของไบต์โดยที่แต่ละคู่เป็นบรรทัดเดียวในแกนต์

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

ลองดู

http://copy.sh/brainfuck/

ชุดที่สิ้นสุดของการป้อนข้อมูลจะมีมูลค่าchar \0ตัวอย่างอินพุต: \5\20\5\20\2\10\15\19.

โปรดทราบว่าการตั้งค่า end-of-input ให้เป็น\0จะมีผลข้างเคียงที่จะไม่มีการอ่านอินพุตเพิ่มเติม (และหยุดโปรแกรม) เมื่ออินพุตมีจำนวนศูนย์ ใน BF ไม่มีวิธีอื่นที่จะรู้ได้เมื่อข้อมูลหมด

คำอธิบาย *

++++[->++++++++<]>  #Store <space> at index 1                   
[->+>+<<]           #Move index 1 to index 2 and 3
++++++++++          #Increment index 1 to <newline>
>>                  #Move to index 3
+++++++++++++       #Increment index 3 to <dash>    
>                   #Move to (empty) index 4
+                   #Increment to start the main loop
[                   #Main loop
,                   #Read first number to index 4
[->+>+<<]>>[-<<+>>] #Copy index 4 to index 5 (index 5 can now be altered)
,                   #Read second number (the number pair is now stored at index 5 and 6)
<                   #Move to first number (index 5)
[->-<<<<.>>>]       #Decrement index 5 and 6 and print <space> until index 5 equals zero
>                   #move to second input (index 6)
[-<<<.>>>]          #Decrement index 6 and print <dash> until index 6 equals zero
<<<<<.>>>           #Print <newline> and move to index 4 (original first number)
]                   #End of main loop

* (คุณจะไม่สามารถรวบรวม / เรียกใช้เนื่องจากความคิดเห็น)


6
Brainfuck ที่สั้นกว่า Java => โลกจะสิ้นสุดลงในไม่ช้า
Alex A.

1
คำอธิบายควรทำงานได้ดี เพียงคำสั่ง BF ในมี<และ>และพวกเขากำลังมีความสมดุลอย่างสมบูรณ์แบบ
undergroundmonorail

@undergroundmonorail จับดีฉันไม่ได้ลองดูว่ามันมีความสมดุลหรือเปล่า)
Rolf ツ


5

C ++ 14, 69 ไบต์

[]{int a,b;for(;cin>>a>>b;){cout<<setw(b)<<string(b-a,'-')+'\n';}}();

การเล่นกอล์ฟเป็นครั้งแรกนี่เป็นปัญหาที่ดีในการเริ่มต้น!


2
คุณไม่จำเป็นต้องstd::บนcinและcout?
Alex A.

3

K, 18 ไบต์

`0:" -"@{&x,y-x}.'

คาดหวังรายการคู่เป็นอินพุต:

  `0:" -"@{&x,y-x}.'(0 7;5 6;3 6)
-------
     -
   ---
  `0:" -"@{&x,y-x}.'(5 20;5 20;2 10; 15 19)
     ---------------
     ---------------
  --------
               ----
  `0:" -"@{&x,y-x}.'()

ผมแกะแต่ละ ( ') tuple ใช้จุดใช้ ( .) เพื่อให้ภายในแลมบ์ดาฉันมีการเข้าถึงค่าเริ่มต้นและสิ้นสุดเป็นxและyตามลำดับ จากนั้นฉันรวมกันใหม่เหล่านี้เป็น tuple (เริ่มต้น, ความยาว) ( x,y-x) และใช้ "where" ( &) สิ่งนี้ทำให้ฉันชอบ:

  {&x,y-x}.'(0 7;5 6;3 6)
(1 1 1 1 1 1 1
 0 0 0 0 0 1
 0 0 0 1 1 1)

จากนั้นฉันก็ต้องทำดัชนีให้เป็นอาเรย์ 2 ตัวอักษรโดยใช้เมทริกซ์แบบ ragged ( " -"@) แล้วส่งมันทั้งหมดไปที่ stdout ( 0:)


3

JavaScript ( ES6 ), 63

แก้ไข 3 ไบต์บันทึก thx @apsillers
63 ไบต์ไม่นับการมอบหมายให้ F เนื่องจากอนุญาตให้ใช้ฟังก์ชันที่ไม่ระบุชื่อ

ฟังก์ชั่นที่มีจำนวนตัวแปรพารามิเตอร์ตามที่ร้องขอ
ฟังก์ชั่นที่มีรายการงานเป็นพารามิเตอร์เดียว

ทดสอบการเรียกใช้ตัวอย่างด้านล่าง (เป็น EcmaScript 6, Firefox เท่านั้น)

F=l=>l.map(t=>console.log(' '.repeat(l=t[0])+'-'.repeat(t[1]-l)))

// TEST

// for this test, redefine console.log to have output inside the snippet
console.log = (...x) => O.innerHTML += x + '\n';

console.log('* Empty'); F([]);
console.log('\n* [0,7],[5,6],[3,6]'); F([[0,7],[5,6],[3,6]])
console.log('\n* [5,20],[5,20],[2,10],[15,19]');F([[5,20],[5,20],[2,10],[15,19]]);
<pre id=O></pre>


บันทึกหนึ่งไบต์ด้วยการกำหนดให้t[0]กับโกลบอล (หรือคุณสามารถกำหนดให้กับมันได้อย่างปลอดภัยlหากคุณไม่ต้องการสร้างโกลบอล) นอกจากนี้สเป็คยังอนุญาตให้ "ฟังก์ชั่นที่ระบุชื่อหรือฟังก์ชั่นที่ไม่ระบุชื่อ" ดังนั้นฉันคิดว่าคุณสามารถละเว้นF=ในการนับไบต์ของคุณ
apsillers

@apsillers ฉันคิดถึงความanonymousคิด ขอบคุณ
edc65

3

สกาลา, 67 63 59 ไบต์

(r:Seq[(Int,Int)])⇒for((s,e)←r)(println(" "*s+"-"*(e-s)))

การใช้งาน: res0()หรือres0(Seq(28->35, 34->40, 39->44))อื่น ๆ

ขอบคุณ gilad สำหรับการโกน 4 ไบต์ใช้สำหรับนิพจน์!


2

Ruby: 35 ตัวอักษร

->*t{t.map{|s,e|puts' '*s+?-*(e-s)}

วิ่งตัวอย่าง:

irb(main):001:0> ->*t{t.map{|s,e|puts' '*s+?-*(e-s)}}.call [0,7], [5,6], [3,6]
-------
     -
   ---

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


2

Javascript (ES6), 61/66 ตัวอักษร

คำตอบของฉันใกล้เคียงกับคำตอบที่ @ edc65 แต่มีการปรับปรุงบางอย่าง เนื่องจากไม่อนุญาตให้ใช้งานในอาเรย์เดี่ยว (ดังนั้นจะมีการเรียกใช้ฟังก์ชันดังนี้a([3,4], [7,15], [0,14], [10, 15]):), แก้ไขให้ถูกต้อง ( 66 ตัวอักษรโดยไม่มีการกำหนดชื่อ):

a=(...x)=>x.map(([c,d])=>console.log(' '.repeat(c)+'-'.repeat(d-c)))

และถ้าอนุญาตให้ใช้อาร์กิวเมนต์อาเรย์หนึ่งตัว (ดังนั้น fn จะเรียกสิ่งนี้:) ดังนั้นa([[3,4], [7,15], [0,14], [10, 15]])มันจะเป็น ( 61 อักขระโดยไม่มีการมอบหมาย):

a=x=>x.map(([c,d])=>console.log(' '.repeat(c)+'-'.repeat(d-c)))

1

SWI-Prolog ขนาด 55 ไบต์

a([[A,B]|C]):-tab(A),writef("%r",[-,B-A]),nl,C=[];a(C).

ตัวอย่าง: a([[5,20],[5,20],[2,10],[15,19]]).ผลลัพธ์

     ---------------
     ---------------
  --------
               ----

ฉันขอโทษ แต่รูปแบบการป้อนข้อมูลในคำตอบนี้ไม่ตรงตามข้อกำหนด - แต่ละงานควรแสดงด้วยอาร์กิวเมนต์เดียวไม่ใช่สอง (ยกเว้นกรณีที่ฉันพลาดอะไรบางอย่างในไวยากรณ์ SWI-เปิดฉากซึ่งฉันไม่คุ้นเคยกับ ... )
จาค็อบ

@Jacob Yeah เมื่อทำการอ่านโพสต์ของคุณใหม่ฉันคิดว่าและเปลี่ยนรหัสของฉันเป็นบัญชี
ทำให้เสียชีวิต

1

Haskell, 76 ไบต์

(#)=replicate
f i=putStr$g=<<(read$'[':i++"]")
g(s,e)=s#' '++(e-s)#'-'++"\n"

รูปแบบอินพุตเป็นสตริงของจุลภาค tuples "(1,2),(3,4)"แยกออกจากกันเช่น

ตัวอย่างการใช้งาน:

*Main> f "(1,2),(3,4)" 
  -
    -

*Main> f "(0,7),(5,6),(3,6)" 
-------
     -
   ---

วิธีการทำงาน: สำหรับการแยกวิเคราะห์อินพุตฉันใส่สตริงอินพุต[และ]และใช้readฟังก์ชันดั้งเดิมของ Haskell สำหรับรายการของจำนวนเต็มทูเปิล ส่วนที่เหลือเป็นเรื่องง่าย: สำหรับแต่ละ tuple (s,e)ใช้sช่องว่างตามด้วยe-sเครื่องหมายขีดคั่นตามด้วยการขึ้นบรรทัดใหม่และต่อกันเป็นสตริงเดียว พิมพ์.

Haskell, 59 ไบต์

ด้วยรูปแบบอินพุตที่ผ่อนคลาย:

(#)=replicate
f=putStr.(g=<<)
g(s,e)=s#' '++(e-s)#'-'++"\n"

ตอนนี้ก็ใช้เวลารายการ tuples f [(0,7),(5,6),(3,6)]e กรัม

ทำงานตามที่อธิบายไว้ข้างต้น แต่ไม่มีการแยกวิเคราะห์อินพุต


1

จูเลีย 44 ไบต์

x->for t=x a,b=t;println(" "^a*"-"^(b-a))end

สิ่งนี้จะสร้างฟังก์ชั่นนิรนามที่ยอมรับอาร์เรย์ของสิ่งอันดับเป็นอินพุตและพิมพ์ไปยัง STDOUT

คำอธิบาย Ungolfed +:

function f(x)
    # Loop over the tasks (tuples) in x
    for t in x
        # Assign a and b to the two elements of t
        a,b = t

        # Print a spaces followed by b-a dashes on a line
        println(" "^a * "-"^(b-a))
    end
end

ตัวอย่าง:

julia> f([(5,20), (5,20), (2,10), (15,19)])
     ---------------
     ---------------
  --------
               ----

julia> f([(0,7), (5,6), (3,6)])
-------
     -
   ---

julia> f([])

แน่ใจ ขออภัยในความไม่สะดวก.
Jacob

@Jacob: ไม่สะดวก ความท้าทายที่ดี :)
อเล็กซ์ A.

1

JavaScript (ES6), 106 85 80 68 ไบต์

ตามข้อกำหนดที่อัปเดตแล้วรายการงานได้รับการยอมรับแล้ว

a=>a.reduce((p,v)=>p+=' '.repeat(z=v[0])+'-'.repeat(v[1]-z)+"\n",'')

ใช้ศูนย์หรือมากกว่าอาร์กิวเมนต์: 80 ไบต์

(...a)=>{s='';a.map(v=>s+=' '[r='repeat'](z=v[0])+'-'[r](v[1]-z)+"\n");return s}

ความพยายามเริ่มต้น 106 ไบต์:

(...a)=>{for(i=-1,s='',r='repeat';a.length>++i;){s+=' '[r](a[i][0])+'-'[r](a[i][1]-a[i][0])+"\n"}return s}

ถ้าเป็น ES6 แล้วทำไมString.repeat()ล่ะ
จัดการ

@manatwork ขอบคุณที่แสดงให้ฉันเห็นสิ่งใหม่ !! น่าเสียดายสำหรับ code golf แล้วที่จริงแล้วมันใช้งานได้นานกว่านั้น
rink.attendant.6

แท้จริงแล้วสองมิตินั้นaไม่ได้ช่วยอะไรจริงๆ ()=>{for(i=0,s='';a=arguments[i++];)s+='_'.repeat(a[0])+'-'.repeat(a[1]-a[0])+"\n";return s}ฉันมีบางสิ่งบางอย่างในใจเช่น
จัดการ

r = 'ทำซ้ำ'? ... สำหรับ 2 ครั้ง nah! a=>a.reduce((p,v)=>p+=' '.repeat(z=v[0])+'-'.repeat(v[1]-z)+"\n",'')
edc65

1
ไม่มีเอาต์พุต Return value does not matter, your code must print the timeline on STDOUT.(และก็จะสั้นลงเช่นกัน)
edc65

1

C: 108 ไบต์

void g(int*l){for(int c=0;*l>=0;c=!c,l++){if(!c)l[1]-=*l;while(l[0]-->0)putchar(c?45:32);c?putchar(10):0;}}

Ungolfed:

void gantt(int*l) {
    for (int c = 0; *l >= 0; c = !c, l++) {
        if (!c) l[1] -= *l;
        while (l[0]-- > 0) putchar(c? 45 : 32);
        c? putchar(10) : 0;
    }
}

-1ใช้เวลาเป็นพารามิเตอร์รายการของจำนวนเต็มยกเลิกโดย ตัวอย่างเช่น:

int list[] = {
    28, 35,
    34, 40,
    39, 44,
    -1
};
gantt(list);

มันใช้cเพื่อสลับระหว่างการเขียนช่องว่างและขีดกลาง


1
ทำให้ c คงที่ - คุณสามารถลดประเภทของมัน (มันจะเป็น int) และเริ่มต้น (มันจะเป็นศูนย์) *l>=0เหมือนกับ*l+1ที่สั้นกว่า c&&putcharสั้นกว่าแบบที่สาม หากคุณแทนที่c=!cด้วยc^=13(+1 ไบต์) คุณสามารถเปลี่ยนc?45:32เป็น32+c(-3 ไบต์) เลื่อนการcพลิกจากforไปยังจุดสิ้นสุดของลูป: (c^=13)||putchar(10);. c;void g(int*l){for(;*l+1;l++){l[1]-=c?0:*l;while(l[0]--)putchar(32+c);(c^=13)||putchar(10);}}- 94 ไบต์
aragaer

1

Perl: 42 41 ตัวอักษร

เพียงแค่มีวิธีแก้ปัญหาอย่างน้อยหนึ่งรายการด้วยการแยกสตริงด้วย

s!(\d+)->(\d+),?!$"x$1."-"x($2-$1).$/!ge

วิ่งตัวอย่าง:

bash-4.3$ perl -pe 's!(\d+)->(\d+),?!$"x$1."-"x($2-$1).$/!ge' <<< '0->7,5->6,3->6'
-------
     -
   ---

ที่จริงแล้วเรามีคำตอบ Java ตรงไปตรงมาที่แยกสตริง :) อย่างไรก็ตามขอบคุณสำหรับคนนี้เช่นกัน!
Jacob

ใช่ แต่ฉันเข้าใจว่าคาดว่าจะมีตัวเลขคั่นด้วยเครื่องหมายจุลภาคไม่ใช่รูปแบบที่ระบุในคำถาม
จัดการ

1

Java 8, 280 275 246 204 195 185 180 ไบต์

void g(String t){for(String s:t.split(",")){String[]a=s.split("->");s="";Integer i;for(i=0;i<i.valueOf(a[0]);i++)s+=" ";for(;i<i.valueOf(a[1]);i++)s+="-";System.out.println(s);};};

เมธอดที่รับสตริงอินพุตที่คั่นด้วยเครื่องหมายคอมม่าและพิมพ์แผนภูมิ ascant Gantt ที่เป็นผลลัพธ์ไปยัง stdout

ขอบคุณ durron597 และ masterX244 ที่ช่วยฉันประหยัด 10 ไบต์


ฉันคิดว่าคุณได้รับอนุญาตให้ใช้วิธีการแทน
lirtosiast

ได้รับอนุญาตถ้า if นี่เป็นวิธี (หรือ a) เพื่อสร้างฟังก์ชั่นที่ไม่ระบุชื่อใน Java8 ใช่ไหม?
จาค็อบ

เป็นสิ่งที่ใกล้เคียงที่สุดของ Java 8 ที่มีต่อคุณสมบัติดังกล่าว
SuperJedi224

หากคุณInteger i=0;สามารถทำได้for(;i<i.parseInt;ให้บันทึกอักขระ 8 ตัว
durron597

ฉันไม่สามารถได้รับมันจะรวบรวมใน Ideone แต่ปรากฏว่ามันจะไม่ยอมรับการป้อนข้อมูลที่ว่างเปล่าเป็นกฎระเบียบที่ต้องใช้ ( t.split(",")จะโยนข้อยกเว้น)
Nateowami

1

Java, 187 181 197 183 101 ไบต์

void g(int[][]g){for(int[]i:g)for(int j=0;j<i[1];System.out.print(j++<i[0]?" ":j==i[1]?"-\n":"-"));}

Ungolfed (เรียงลำดับ):

void g(int[][] g){
    for(int[] i : g)
        for(int j = 0; j < i[1]; System.out.print(j++ < i[0] ? " " : j == i[1] ? "-\n" : "-"));
}

รับข้อมูลเป็นอาร์เรย์ 2d ของints ขอบคุณmasterX244 ที่ชี้ให้เห็นว่าสิ่งนี้ได้รับอนุญาตตามกฎ


คุณสามารถทำให้ลูปสั้นลงได้ถ้าคุณใช้สัญลักษณ์แสดงข้อที่ 3 ของคำถามรุ่นปัจจุบันและ varargs สำหรับอินพุต
masterX244

@ masterX244 ขอบคุณฉันพลาดไป ดูเหมือนว่าฉันชอบที่จะมีการแยกวิเคราะห์ล่วงหน้า แต่ถ้าการโกงได้รับอนุญาต ... อะไรก็ตาม ฉันจะอัปเดตเมื่อฉันมีเวลา
Nateowami


1

APL (Dyalog Classic)ขนาด 12 ไบต์

↑('-'\⍨≤∘⍳)/

ลองออนไลน์!

APL ไม่มี varargs ดังนั้น arg ที่นี่คือเมทริกซ์ Nx2 เดียว


หากคุณสามารถใช้เวลาสองข้อโต้แย้ง (เริ่มต้นและสิ้นสุด) แล้ว↑'-'\⍨¨≤∘⍳¨
อดัม

ผู้เขียนท้าพูดว่าไม่
ก.ย.


1

PowerShell 3.0 4836 ไบต์

$args|%{" "*$_[0]+"-"*($_[1]-$_[0])}

ขอบคุณ Mazzy สำหรับการประหยัด 12 ด้วยวิธีที่ดีกว่าที่จะผ่านในรายการ

รหัสเก่าและคำอธิบาย:

&{param($b="")$b|%{" "*$_[0]+"-"*($_[1]-$_[0])}}

รับอาร์กิวเมนต์เป็นรายการของ tuples เช่น (5,20), (5,20), (2,10), (15,19) ต้องเริ่มต้น $ b เป็นค่าที่จะดูแลสตริงว่างเนื่องจากจะเข้าสู่บล็อก foreach อย่างใดเมื่อถูกเรียกโดยไม่มีอินพุต


36 $args|%{" "*$_[0]+"-"*($_[1]-$_[0])}ไบต์: get-asciiGantt.ps1บันทึกเป็น สคริปต์ทดสอบ.\get-asciiGantt.ps1 (5,20) (5,20) (2,10) (15,19)
mazzy

1

R , 117 90 75 ไบต์

function(y)for(i in 1:ncol(y))cat(" "<y[1,i],"-"<diff(y)[i],"
")
"<"=strrep

ลองออนไลน์!

จูเซปเป้เล่นกอล์ฟอย่างน้อย 29 ไบต์จากคำตอบเดิมของฉัน!

ความคิดที่จะตรงไปตรงมา: พิมพ์เป็นจำนวนมาก" "เท่าที่จำเป็นตามมาด้วยเป็นจำนวนมาก"-"ตามที่ต้องการ อินพุตเป็น2*Lเมทริกซ์ที่มี L จำนวนคู่ ฟังก์ชั่น vectorized diffจะใช้ในการรับจำนวน "-"


1
@Giuseppe นี่คือสิ่งที่ฉันพยายามพยายามยึดติดกับmatrixแนวคิดดั้งเดิมของฉันในขณะที่ใช้forลูป ... ty!
JayCe


@Giuseppe ถูกย้ายyไปเพื่อประหยัดอีกไม่กี่ :)
JayCe

ตอนนี้การทำดัชนี 1- จะประหยัด 4
JayCe

ดีใช้<แทน*และคุณจะได้รับนี้ถึง81 bytes
Giuseppe

1

VBA (Excel), 99 90 ไบต์

ใช้หน้าต่างทันทีและ[A1]ป้อนข้อมูลเช่น0-1,2-5

ขอบคุณ @TaylorSott สำหรับการตัดไบต์

b=Split([A1]):For x=0To Ubound(b):c=Split(b(x),"-"):?Spc(c(0)-0)String(c(1)-c(0),"-"):Next

1
ถ้าคุณเปลี่ยนรูปแบบการป้อนข้อมูลที่จะถูกคั่นด้วยพื้นที่แทนที่จะถูกคั่นด้วยจุลภาคคุณ Cang chage สองข้อแรกจากการa=[A1]:b=Split(a,",") b=Split([A1])นอกจากนี้คุณสามารถปล่อยช่องว่างก่อนหน้าToในการFor ประกาศลูป
Taylor Scott

ขอขอบคุณและสังเกต! : D
remoel

0

CoffeeScript, 104 82, 65 ไบต์

รายการงาน (ES6): 65 ไบต์

(a)->a.map (v)->console.log ' '.repeat(v[0])+'-'.repeat v[1]-v[0]

รายการงาน (ตัวแปร ES5): 82 ไบต์

(a)->a.map (v)->j=-1;s='';s+=(if j<v[0]then' 'else'-') while++j<v[1];console.log s

อาร์กิวเมนต์เป็นศูนย์หรือมากกว่า: 104 ไบต์

()->[].slice.call(arguments).map((v)->j=-1;s='';s+=(if j<v[0]then' 'else'-')while++j<v[1];console.log s)

Unminified:

() -> [].slice.call(arguments).map( # convert to array-like arguments to array and loop
 (v) ->
  j = -1 # counter
  s = '' # initialize string
  s += (if j < v[0] then ' ' else '-') while ++j < v[1]
  console.log s # print to STDOUT
)

ไม่แน่ใจว่าจากที่ซึ่งเป็น JavaScript, CoffeeScript และ ECMAScript ในคำตอบของคุณ แต่ใน ECMAScript คุณสามารถใช้แทนArray.from(arguments) [].slice.call(arguments)
จัดการ

@ manatwork อย่างที่คุณเห็นในคำตอบของฉัน (ทั้ง ES5 และ ES6 ใน CoffeeScript) ที่จัดการกับความต้องการที่เปลี่ยนแปลงซึ่งอนุญาตให้มีรายการงานฉันไม่จำเป็นต้องอ้างอิงargumentsอีกต่อไป
rink.attendant.6

0

PHP, 94 91 ไบต์

รับรายการของงาน (เช่น[[5,20],[5,20],[2,10],[15,19]]) ขอบคุณ @IsmaelMiguel สำหรับคำเตือนของชื่อฟังก์ชันตัวแปร

function x($a){$r=str_repeat;foreach($a as$v){echo$r(' ',$v[0]).$r('-',$v[1]-$v[0])."\n";}}

ความพยายามเริ่มต้น: 94 ไบต์

function x($a){foreach($a as$v){echo str_repeat(' ',$v[0]).str_repeat('-',$v[1]-$v[0])."\n";}}

73 ไบต์, PHP4: $R=str_repeat;foreach($G as$v)echo$R(' ',$v[0]),$R('-',$v[1]-$v[0]),'\n';(แทนที่\nด้วยnewline จริง ) เพื่อให้สิ่งนี้ใช้งานได้คุณต้องส่งอาเรย์บนกุญแจ$Gผ่าน POST / GET / SESSION / COOKIE ...
Ismael Miguel

@IsmaelMiguel ตามคำถามอินพุตต้องมาเป็นอาร์กิวเมนต์หรือมาจาก STDIN
rink.attendant.6

ไม่GETพารามิเตอร์นับ? และฉันคิดว่านั่นGETใช้ STDIN
Ismael Miguel

0

PHP, 89 ตัวอักษร (ฟังก์ชั่นร่างกาย)

function gantt($x){array_walk($x,function($a){echo str_pad(str_repeat('-',$a[1]-$a[0]),$a[1],' ',0)."\n";});}

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

สำหรับทูเปิลแต่ละตัว$aในอาเรย์$xฉันสะท้อนสตริงของเครื่องหมายขีดคั่นซ้ำหลาย$a[1] - $a[0]ครั้งเพิ่มจำนวนขึ้น$a[1]ด้วยช่องว่าง ขึ้นบรรทัดใหม่ที่จำเป็น


คุณสามารถทำให้ชื่อฟังก์ชั่นของคุณเป็นเพียงตัวอักษรเดียวเพื่อบันทึกไม่กี่ไบต์ หรือดีกว่านั้นถ้า PHP รองรับฟังก์ชั่นนิรนาม
Alex A.

1
โอ้ตอนนี้ฉันเห็นสิ่งที่คุณหมายถึงโดย "ฟังก์ชั่นร่างกาย" คุณต้องนับคำนิยามฟังก์ชั่นทั้งหมดในคะแนนของคุณไม่ใช่แค่อวัยวะภายใน
Alex A.

1
printf()ดูเหมือนว่าจะสั้นกว่าecho+ str_pad(): function gantt($x){array_map(function($a){printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));},$x);}(รหัส is สำหรับโค้ดขึ้นบรรทัดใหม่: เพียงแค่ห่อโค้ดของคุณไว้ที่นั่น)
จัดการ

1
อันที่จริงคนแก่foreachดีกว่า: function g($x){foreach($x as$a)printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));}และนี่คือ 79 ตัวอักษรรวมถึงทุกอย่าง
จัดการ

@AlexA อาฉันเคยเห็นกอล์ฟที่ผู้คนนับหรือลดส่วนหัวของฟังก์ชั่น ฉันไม่แน่ใจว่าจะต้องทำอะไรทำไมฉันจึงระบุว่าอะไรคือสิ่งที่นับ
JPMC


0

PostgreSQL: 160 ตัวอักษร

create function g(int[])returns text as
$$select string_agg(lpad(repeat('-',$1[x][2]-$1[x][1]),$1[x][2]),chr(10))from generate_subscripts($1,1)x$$
language sql;

วิ่งตัวอย่าง:

manatwork=# create function g(int[])returns text as
manatwork-# $$select string_agg(lpad(repeat('-',$1[x][2]-$1[x][1]),$1[x][2]),chr(10))from generate_subscripts($1,1)x$$
manatwork-# language sql;
CREATE FUNCTION

manatwork=# select g(array[[0,7],[5,6],[3,6]]);
-------
     -
   ---

0

J, 21 ไบต์

(' -'#~{.,-~/)"1 ::''

ungolfed

(' -' #~ {. , -~/)"1 ::''

นี้เป็นหลักเพียงคำกริยาสำเนาของเจ#แต่เรากำลังคัดลอกหัวอักขระช่องว่างของรายชื่อ{.จำนวนครั้งและยัติภังค์อักขระ "องค์ประกอบรายการที่ 2 ลบองค์ประกอบรายการที่ 1" -~/จำนวนครั้ง: น่าเศร้าที่บังคับให้เราต้องระบุอันดับอย่าง"1ชัดเจนและเราจำเป็นต้องใช้ Adverse ::เพื่อจัดการกับกรณีที่ว่างเปล่า

ลองออนไลน์!

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