Ini sederhana: cetak grafik ASCII Gantt .
Rentang tugas yang diberikan (waktu mulai - Tupel waktu akhir), cetak garis waktu Gantt dalam bentuk -
karakter untuk setiap durasi tugas - setiap tugas di baris baru.
Contoh
Katakanlah rentang tugas saya adalah 28->35, 34->40, 39->44
, Gantt akan terlihat seperti ini:
-------
------
-----
Spesifikasi
- Anda dapat menulis program lengkap, fungsi bernama atau fungsi anonim.
- Program / fungsi Anda harus menerima tugas melalui STDIN atau sebagai argumen .
- Setiap tugas harus direpresentasikan sebagai string dari
start->end
manastart
danend
yang Integer . Tugas dipisahkan oleh spasi atau koma. Atau , Anda bisa mendapatkannya sebagai Tuple of Integer, atau sebagai Array / Collection of 2 Integer. (Misalnya, dalam JavaScript Anda dapat memperolehnya[start,end]
- ini diizinkan). - Sejumlah tugas (argumen) non-negatif harus didukung.
Untuk membuatnya lebih jelas, argumen tunggal pengumpulan tugas tidak diperbolehkan. Anda dapat menguraikan argumen string tunggal, atau mendukung argumen tugas nol atau lebih. Di mana tugas adalah tupel atau kumpulan ukuran 2.- Anda dapat mengasumsikan hanya input yang valid yang akan diberikan. Itu artinya, setiap tugas memiliki durasi positif.
- Nilai pengembalian tidak masalah, kode Anda harus mencetak timeline pada STDOUT.
- Output: per tugas,
start
spasi diikuti(end-start)
tanda hubung dan a\n
. - Tidak perlu dikatakan, jalur output harus dipesan sesuai dengan urutan input (tugas).
- Membuntuti spasi sebelum
\n
diizinkan, jika itu membantu Anda.
Uji kasus
Input:
(empty)
Output:
(empty)
Input:
0->7,5->6,3->6
Output:
-------
-
---
Input:
5->20,5->20,2->10,15->19
Output:
---------------
---------------
--------
----
Kemenangan
- Ini adalah kode-golf sehingga panjang kode paling sedikit (dalam byte) menang.
- Secara tradisional, tie breaker adalah posting sebelumnya.
- "Lubang standar tidak lagi lucu".
-----
EDIT
Seperti banyak dari Anda mengerti bahwa diperbolehkan untuk memiliki argumen pengumpulan tugas tunggal, dan karena tidak ada banyak perbedaan antara itu dan persyaratan vararg asli , sekarang diperbolehkan untuk memiliki argumen pengumpulan tunggal, jika Anda tidak ingin menggunakan opsi varargs, atau jika bahasa Anda tidak mendukung varargs.
To make it clear...
) tidak jelas sama sekali.arguments
di dalam fungsi, tetapi Anda mungkin tidak berasumsi bahwa ituarguments[0]
adalah array tugas.Jawaban:
CJam,
1614 byteIni mengharapkan daftar daftar sebagai input. Sebagai contoh:
memberi:
Bagaimana itu bekerja
Cobalah online di sini
sumber
Python 2, 39 Bytes
Solusi mudah menggunakan perkalian string :)
Menerima input yang diformat seperti ini:
Lihat disini.
sumber
Brainfuck,
120115111 byteSetidaknya lebih pendek dari Java :) Inputnya adalah daftar byte, di mana setiap pasangan adalah satu baris di gantt.
Mencoba
http://copy.sh/brainfuck/
Tetapkan end-of-input chardengan nilai
\0
. Contoh masukan:\5\20\5\20\2\10\15\19
.Perhatikan bahwa pengaturan nilai input akhir
\0
akan memiliki efek samping sehingga tidak ada lagi input yang akan dibaca (dan dengan demikian menghentikan program) ketika input berisi angka nol. Dalam BF tidak ada cara lain untuk mengetahui kapan input habis.Penjelasan*
* (Anda tidak dapat mengkompilasi / menjalankan ini karena komentar)
sumber
<
dan>
, dan semuanya seimbang sempurna.Pyth,
36221914 byteIni adalah program Pyth pertama saya. Jakube membantu golf 5 byte!
Ia mengharapkan input dalam formulir
[[5,20], [5,20], [2,10], [15,19]]
.Anda dapat mencobanya secara online .
sumber
C ++ 14, 69 byte
Pertama kali bermain golf, ini adalah masalah yang bagus untuk memulai!
sumber
std::
dicin
dancout
?K, 18 byte
Mengharapkan daftar pasangan sebagai masukan:
Saya membongkar setiap (
'
) tuple menggunakan dot-apply (.
) sehingga di dalam lambda saya memiliki akses ke nilai awal dan akhir sebagaix
dany
, masing-masing. Lalu saya pasang kembali ini menjadi (mulai, panjang) tuple (x,y-x
) dan menerapkan "di mana" (&
). Ini memberi saya output seperti:Maka saya hanya perlu mengindeks ke array 2-karakter menggunakan matriks kasar ini (
" -"@
) dan mengirim semuanya ke stdout (0:
).sumber
JavaScript ( ES6 ), 63
Edit 3 byte disimpan thx @apsillers
63 byte tidak termasuk tugas ke F sebagai fungsi anonim diperbolehkan.
Fungsi dengan jumlah parameter variabel, seperti yang diminta.Fungsi dengan daftar tugas sebagai parameter tunggal.
Tes menjalankan cuplikan di bawah ini (menjadi EcmaScript 6, hanya Firefox)
sumber
t[0]
global (atau Anda dapat dengan aman menetapkannyal
jika Anda tidak ingin membuat global). Selain itu, spesifikasi tersebut memungkinkan "fungsi yang dinamai atau fungsi anonim" jadi saya pikir Anda bisa menghilangkanF=
dalam jumlah byte Anda.anonymous
think. Terima kasihScala,
676359 bytePenggunaan:
res0()
ataures0(Seq(28->35, 34->40, 39->44))
dll.Terima kasih gilad untuk mencukur 4 byte menggunakan untuk ekspresi!
sumber
Ruby: 35 karakter
Contoh dijalankan:
Diperbarui untuk menerima beberapa array dua elemen, satu untuk setiap tugas untuk ditampilkan. (Saya pikir itulah yang diharapkan dari persyaratan yang diperbarui.)
sumber
Javascript (ES6), 61/66 karakter
Jawaban saya hampir mirip dengan yang diposting oleh @ edc65, tetapi dengan beberapa perbaikan. Karena tugas-tugas dalam array tunggal tidak diperbolehkan (jadi fungsi akan dipanggil seperti ini
a([3,4], [7,15], [0,14], [10, 15])
:), yang benar adalah ini ( 66 karakter tanpa penugasan nama):Dan jika satu argumen array diperbolehkan (jadi fn panggil seperti ini:)
a([[3,4], [7,15], [0,14], [10, 15]])
, maka itu akan menjadi ( 61 char tanpa penugasan):sumber
SWI-Prolog, 55 byte
Contoh:
a([[5,20],[5,20],[2,10],[15,19]]).
keluaransumber
Haskell, 76 byte
Format input adalah serangkaian tupel yang dipisahkan koma, mis
"(1,2),(3,4)"
.Contoh penggunaan:
Cara kerjanya: untuk penguraian input Saya lampirkan string input
[
dan]
dan gunakanread
fungsi asli Haskell untuk daftar tupel integer. Sisanya mudah: untuk setiap tupel,(s,e)
ambils
spasi diikutie-s
tanda hubung diikuti oleh baris baru dan gabungkan semuanya menjadi satu string tunggal. Mencetak.Haskell, 59 byte
dengan format input santai:
Sekarang dibutuhkan daftar tupel, mis
f [(0,7),(5,6),(3,6)]
.Bekerja seperti yang dijelaskan di atas, tetapi tanpa parsing input.
sumber
Julia, 44 byte
Ini menciptakan fungsi anonim yang menerima larik tupel sebagai input dan mencetak ke STDOUT.
Penjelasan + tidak dikumpulkan:
Contoh:
sumber
JavaScript (ES6),
106858068 byteSesuai persyaratan yang diperbarui, daftar tugas kini dapat diterima
Membawa nol atau lebih argumen: 80 byte
Upaya asli, 106 byte:
sumber
String.repeat()
?a
tidak terlalu membantu. Saya ada dalam pikiran sesuatu seperti()=>{for(i=0,s='';a=arguments[i++];)s+='_'.repeat(a[0])+'-'.repeat(a[1]-a[0])+"\n";return s}
.a=>a.reduce((p,v)=>p+=' '.repeat(z=v[0])+'-'.repeat(v[1]-z)+"\n",'')
Return value does not matter, your code must print the timeline on STDOUT.
(dan akan lebih pendek juga)C: 108 byte
Tidak Disatukan:
Mengambil sebagai parameter daftar bilangan diakhiri oleh
-1
. Sebagai contoh:Ini digunakan
c
untuk beralih antara ruang penulisan dan tanda hubung.sumber
*l>=0
sama dengan*l+1
yang lebih pendek.c&&putchar
lebih pendek dari ternary. Jika Anda menggantic=!c
denganc^=13
(+1 byte) Anda dapat mengubahc?45:32
ke32+c
(-3 byte). Pindahc
sandal darifor
ke akhir loop:(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 byte.Perl:
4241 karakterHanya untuk memiliki setidaknya satu solusi dengan penguraian string juga.
Contoh dijalankan:
sumber
Java 8,
280275246204195185180 byteMetode yang mengambil string input yang dipisah koma dan mencetak Ascii Gantt Chart yang dihasilkan ke stdout.
Terima kasih kepada durron597 dan masterX244 karena membantu saya menghemat 10 byte
sumber
Integer i=0;
dapat melakukannyafor(;i<i.parseInt;
, simpan 8 karakter.t.split(",")
akan mengeluarkan pengecualian).Java,
187181197183101 byteTidak disatukan (semacam):
Menerima input sebagai array 2d dari
int
s. Terima kasih kepada masterX244 untuk menunjukkan bahwa ini diizinkan oleh aturan.sumber
Jelly ,
139 byteCobalah online!
Mengambil input sebagai
[[5, 20], [5, 20], [2, 10], [15, 19]]
.-4 byte terima kasih kepada Erik
sumber
APL (Dyalog Classic) , 12 byte
Cobalah online!
APL tidak memiliki varargs, jadi arg di sini adalah matriks Nx2 tunggal.
sumber
↑'-'\⍨¨≤∘⍳¨
JavaScript (ES8), 54 byte
Cobalah online
sumber
PowerShell 3.0,
4836 BytesTerima kasih kepada Mazzy karena telah menyimpan 12 dengan cara yang lebih baik untuk lulus dalam daftar
Kode lama dan penjelasan:
Membawa argumen sebagai daftar tupel, misalnya (5,20), (5,20), (2,10), (15,19). Harus default $ b ke nilai untuk menjaga string kosong karena entah bagaimana memasuki blok foreach ketika dipanggil tanpa input.
sumber
$args|%{" "*$_[0]+"-"*($_[1]-$_[0])}
. Simpan sebagaiget-asciiGantt.ps1
. Script uji.\get-asciiGantt.ps1 (5,20) (5,20) (2,10) (15,19)
R ,
117 9075 byteCobalah online!
Giuseppe bermain golf setidaknya 29 byte dari jawaban asli saya!
Idenya langsung: cetak sebanyak yang
" "
diperlukan diikuti oleh sebanyak yang"-"
diperlukan. Input adalah2*L
matriks dengan L jumlah pasangan. Fungsi vektordiff
digunakan untuk mendapatkan jumlah "-".sumber
matrix
ide asli saya saat menggunakanfor
loop ... ty!y
untuk menyimpan lebih banyak :)<
sebagai ganti*
dan Anda bisa mendapatkan ini hingga 81 byteVBA (Excel),
9990 byteMenggunakan Window Segera dan
[A1]
sebagai input misalnya.0-1,2-5
Terima kasih kepada @TaylorSott untuk memotong beberapa byte.
sumber
a=[A1]:b=Split(a,",")
menjadib=Split([A1])
. Juga, Anda bisa drop ruang sebelumTo
diFor
deklarasi lingkaran.CoffeeScript,
10482, 65 byteDaftar tugas (ES6): 65 byte
Daftar tugas (varian ES5): 82 byte
Nol atau lebih argumen: 104 byte
Tidak dijinakkan:
sumber
Array.from(arguments)
bukan[].slice.call(arguments)
.arguments
lagi.PHP,
9491 byteMengambil daftar tugas (mis
[[5,20],[5,20],[2,10],[15,19]]
.). Terima kasih @IsmaelMiguel untuk pengingat nama fungsi variabel.Upaya asli: 94 byte
sumber
$R=str_repeat;foreach($G as$v)echo$R(' ',$v[0]),$R('-',$v[1]-$v[0]),'\n';
(ganti\n
dengan baris baru nyata ). Agar ini berfungsi, Anda perlu mengirim array pada kunci$G
, melalui POST / GET / SESI / COOKIE ...GET
parameter diperhitungkan? Dan saya pikir ituGET
menggunakan STDIN.PHP, 89 karakter (badan fungsi)
Saya akan pergi untuk membaca string, tetapi karena banyak entri mengambil array pasangan integer, saya pikir saya akan mengikuti untuk kepentingan singkatnya.
Untuk setiap tuple
$a
dalam array,$x
saya mengulangi deretan tanda hubung berkali-$a[1] - $a[0]
kali, diisi hingga lebih banyak$a[1]
dengan spasi. Maka baris baru wajib.sumber
printf()
tampaknya lebih pendek dariecho
+str_pad()
:function gantt($x){array_map(function($a){printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));},$x);}
(␊ dalam kode adalah untuk baris baru literal: cukup bungkus kode Anda di sana.)foreach
lebih baik:function g($x){foreach($x as$a)printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));}
Dan ini adalah 79 karakter termasuk semuanya.Gema : 47 karakter
Contoh dijalankan:
sumber
PostgreSQL: 160 karakter
Contoh dijalankan:
sumber
J, 21 byte
ungolfed
Ini pada dasarnya hanya J copy kata kerja
#
, tapi kita menyalin kepala karakter spasi daftar{.
beberapa kali, dan karakter tanda hubung "2 daftar elemen dikurangi 1 elemen daftar" beberapa kali:-~/
. Sayangnya ini memaksa kita untuk harus menentukan peringkat"1
secara eksplisit, dan kita perlu menggunakan Adverse::
untuk menangani kasing kosong.Cobalah online!
sumber