To jest proste: wydrukuj wykres Gantta ASCII .
Biorąc pod uwagę zakresy zadań (czas rozpoczęcia - krotki czasu zakończenia), wydrukuj oś czasu Gantta w postaci -
znaków dla każdego czasu trwania zadania - każde zadanie w nowej linii.
Przykład
Powiedzmy, że moje zakresy zadań są następujące 28->35, 34->40, 39->44
, Gantt będzie wyglądał następująco:
-------
------
-----
Dane techniczne
- Możesz napisać pełny program, funkcję o nazwie lub funkcję anonimową.
- Twój program / funkcja powinna zaakceptować zadania przez STDIN lub jako argumenty .
- Każde zadanie powinno być reprezentowane jako ciąg liczb całkowitych
start->end
gdziestart
iend
są . Zadania są oddzielone spacjami lub przecinkami. Alternatywnie , możesz otrzymać go jako krotkę liczb całkowitych lub jako tablicę / kolekcję 2 liczb całkowitych. (Na przykład w JavaScript można go pobrać jako - jest to dozwolone).[start,end]
- Każda nieujemna liczba zadań (argumentów) powinna być obsługiwana.
Aby to wyjaśnić, pojedynczy argument kolekcji zadań jest niedozwolony. Możesz parsować pojedynczy argument ciągu lub obsługiwać argumenty zadań o zerowej lub większej liczbie zadań. Gdzie zadaniem jest krotka lub kolekcja wielkości 2.- Możesz założyć, że podane zostaną tylko prawidłowe dane wejściowe. Oznacza to, że każde zadanie ma pozytywny czas trwania.
- Zwracana wartość nie ma znaczenia, kod musi wydrukować oś czasu na STDOUT.
- Dane wyjściowe: na zadanie,
start
spacje(end-start)
i myślniki oraz a\n
. - Nie trzeba dodawać, że linie wyjściowe należy porządkować odpowiednio do kolejności wprowadzania (zadań).
- Końcowe spacje przed nimi
\n
są dozwolone, jeśli to ci pomoże.
Przypadki testowe
Input:
(empty)
Output:
(empty)
Input:
0->7,5->6,3->6
Output:
-------
-
---
Input:
5->20,5->20,2->10,15->19
Output:
---------------
---------------
--------
----
Zwycięski
- To jest golf golfowy, więc wygrywa najmniejsza długość kodu (w bajtach).
- Tradycyjnie remis jest wcześniejszy.
- „Standardowe luki nie są już śmieszne”.
-----
EDYTOWAĆ
Ponieważ wielu z was zrozumiało, że może istnieć pojedynczy argument kolekcji zadań, a ponieważ nie ma wiele różnic między tym a oryginalnym wymaganiem varargs , teraz można mieć pojedynczy argument kolekcji, jeśli nie chce się używać opcja varargs lub w przypadku, gdy Twój język nie obsługuje varargs.
To make it clear...
) nie jest wcale jasne.arguments
w obrębie funkcji, ale nie możesz zakładać, żearguments[0]
jest to tablica zadań.Odpowiedzi:
CJam,
1614 bajtówOczekuje to listy list jako danych wejściowych. Na przykład:
daje:
Jak to działa
Wypróbuj online tutaj
źródło
Python 2, 39 bajtów
Proste rozwiązanie wykorzystujące mnożenie ciągów :)
Akceptuje dane wejściowe sformatowane w następujący sposób:
Sprawdź to tutaj.
źródło
Brainfuck,
120115111 bajtówPrzynajmniej jest krótszy niż Java :) Dane wejściowe to lista bajtów, gdzie każda para jest pojedynczą linią w gantcie.
Spróbować
http://copy.sh/brainfuck/
Ustaw koniec wejścia na charwartość
\0
. Przykład wkład:\5\20\5\20\2\10\15\19
.Zauważ, że ustawienie wartości końca wejścia na
\0
spowoduje efekt uboczny polegający na tym, że nie będzie już czytany żaden sygnał wejściowy (a tym samym zatrzymanie programu), gdy na wejściu będzie liczba zero. W BF nie ma innej możliwości sprawdzenia, kiedy dane wejściowe są wyczerpane.Wyjaśnienie*
* (Nie będziesz mógł tego skompilować / uruchomić z powodu komentarzy)
źródło
<
i>
, i są idealnie zrównoważone.Pyth,
36221914 bajtówTo jest mój pierwszy program w języku Pyth. Jakube pomógł rozegrać 5 bajtów!
Oczekuje danych wejściowych w formularzu
[[5,20], [5,20], [2,10], [15,19]]
.Możesz spróbować online .
źródło
C ++ 14, 69 bajtów
Po raz pierwszy w golfa był to dobry problem na początek!
źródło
std::
nacin
icout
?K, 18 bajtów
Oczekuje listy par jako danych wejściowych:
I rozpakować każda (
'
) krotki stosując dot-apply (.
), dzięki czemu wewnątrz lambda mam dostęp do wartości początkowej i końcowej, jakx
iy
, odpowiednio. Następnie składam je w krotkę (początek, długość) (x,y-x
) i stosuję „gdzie” (&
). Daje mi to wynik:Następnie muszę po prostu zaindeksować tablicę 2-znakową za pomocą tej nierównej matrycy (
" -"@
) i wysłać wszystko do stdout (0:
).źródło
JavaScript ( ES6 ), 63
Edytuj 3 bajty zapisane thx @apsillers
63 bajty nie licząc przypisania do F jako dozwolona funkcja anonimowa.
Funkcja o zmiennej liczbie parametrów, zgodnie z żądaniem.Funkcja z listą zadań jako pojedynczym parametrem.
Przetestuj poniższy fragment kodu (tylko EcmaScript 6, tylko Firefox)
źródło
t[0]
go do globalnego (lub możesz go bezpiecznie przypisać,l
jeśli nie chcesz tworzyć globalnego). Ponadto specyfikacja zezwala na „nazwaną funkcję lub funkcję anonimową”, więc myślę, że można pominąćF=
liczbę bajtów.anonymous
myśli. DziękiScala,
676359 bajtówZastosowanie:
res0()
lubres0(Seq(28->35, 34->40, 39->44))
itp.Dzięki gilad za golenie 4 bajtów za pomocą wyrażenia!
źródło
Rubin: 35 znaków
Przykładowy przebieg:
Zaktualizowano, aby akceptować wiele tablic dwuelementowych, po jednym dla każdego zadania do wyświetlenia. (Myślę, że tego właśnie oczekuje zaktualizowany wymóg).
źródło
JavaScript (ES6), znaki 61/66
Moja odpowiedź jest prawie podobna do tej opublikowanej przez @ edc65, ale z pewnymi poprawkami. Ponieważ zadania w pojedynczej tablicy nie są dozwolone (więc funkcja będzie wywoływana w ten sposób
a([3,4], [7,15], [0,14], [10, 15])
:), poprawne byłoby to ( 66 znaków bez przypisania nazwy):A jeśli dozwolony jest jeden argument tablicowy (więc wywołanie fn w ten sposób:)
a([[3,4], [7,15], [0,14], [10, 15]])
, to byłoby ( 61 znaków bez przypisania):źródło
SWI-Prolog, 55 bajtów
Przykład:
a([[5,20],[5,20],[2,10],[15,19]]).
wyjściaźródło
Haskell, 76 bajtów
Format wejściowy to ciąg krotek oddzielonych przecinkami, np
"(1,2),(3,4)"
.Przykłady użycia:
Jak to działa: na wejściu parsowania Załączam ciąg wejściowy w
[
i]
i używać ojczystego Haskell zaread
funkcję list krotki całkowitych. Reszta jest łatwa: dla każdej krotki(s,e)
bierzs
spacje, a następniee-s
myślniki, a następnie nowy wiersz i łącz wszystkie w jeden ciąg. Wydrukować.Haskell, 59 bajtów
z łagodnym formatem wejściowym:
Teraz zajmuje listę krotek, np
f [(0,7),(5,6),(3,6)]
.Działa jak opisano powyżej, ale bez parsowania danych wejściowych.
źródło
Julia, 44 bajty
Tworzy to anonimową funkcję, która przyjmuje tablicę krotek jako dane wejściowe i drukuje do STDOUT.
Niegolfowane + wyjaśnienie:
Przykłady:
źródło
JavaScript (ES6),
106858068 bajtówZgodnie ze zaktualizowanymi wymaganiami, lista zadań jest teraz akceptowalna
Przyjmuje zero lub więcej argumentów: 80 bajtów
Oryginalna próba, 106 bajtów:
źródło
String.repeat()
?a
tak naprawdę nie pomaga. Miałem na myśli coś takiego()=>{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.
(i byłby też krótszy)C: 108 bajtów
Nie golfowany:
Jako parametr przyjmuje listę liczb całkowitych zakończonych przez
-1
. Na przykład:Służy
c
do przełączania między spacjami i myślnikami.źródło
*l>=0
jest taki sam jak ten,*l+1
który jest krótszy.c&&putchar
jest krótszy niż trójskładnikowy. W przypadku wymianyc=!c
zc^=13
(+1 bajt) można zmienićc?45:32
na32+c
(-3 bajtów). Przesunąćc
klapki zefor
na końcu pętli:(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 bajty.Perl:
4241 znakówWystarczy mieć co najmniej jedno rozwiązanie z analizowaniem łańcuchów.
Przykładowy przebieg:
źródło
Java 8,
280275246204195185180 180 bajtówMetoda, która pobiera rozdzielony przecinkami ciąg wejściowy i drukuje wynikowy wykres Gantta ascii na standardowe wyjście.
Dzięki durron597 i masterX244 za pomoc w oszczędzaniu 10 bajtów
źródło
Integer i=0;
możesz to zrobićfor(;i<i.parseInt;
, oszczędzając 8 znaków.t.split(",")
wyjątek).Java,
187181197183101 bajtówNiegolfowany (w pewnym sensie):
Akceptuje dane wejściowe jako tablicę 2d
int
s. Dzięki masterX244 za wskazanie, że jest to dozwolone przez reguły.źródło
Galaretka ,
139 bajtówWypróbuj online!
Pobiera dane wejściowe jako
[[5, 20], [5, 20], [2, 10], [15, 19]]
.-4 bajty dzięki Erikowi
źródło
APL (Dyalog Classic) , 12 bajtów
Wypróbuj online!
APL nie ma varargs, więc tutaj arg jest pojedynczą macierzą Nx2.
źródło
↑'-'\⍨¨≤∘⍳¨
JavaScript (ES8), 54 bajty
Wypróbuj online
źródło
PowerShell 3.0,
4836 bajtówDzięki Mazzy za uratowanie 12 z lepszym sposobem na przejście na listę
Stary kod i objaśnienie:
Traktuje argumenty jako listę krotek, np. (5,20), (5,20), (2,10), (15,19). Musiałem ustawić $ b na wartość, aby zająć się pustym łańcuchem, ponieważ jakoś wszedł do bloku foreach, gdy został wywołany bez danych wejściowych.
źródło
$args|%{" "*$_[0]+"-"*($_[1]-$_[0])}
. Zapisz jakoget-asciiGantt.ps1
. Skrypt testowy.\get-asciiGantt.ps1 (5,20) (5,20) (2,10) (15,19)
R ,
117 9075 bajtówWypróbuj online!
Giuseppe grał w golfa co najmniej 29 bajtów od mojej oryginalnej odpowiedzi!
The idea is straightforward: print as many
" "
as necessary followed by as many"-"
as required. Input is a2*L
matrix with L the number of pairs. The vectorized functiondiff
is used to get the number of "-".źródło
matrix
idea while using afor
loop... ty!y
to save a few more :)<
instead of*
and you can get this to 81 bytesVBA (Excel),
9990 bytesUsing Immediate Window and
[A1]
as input eg.0-1,2-5
Thanks to @TaylorSott for cutting some bytes.
źródło
a=[A1]:b=Split(a,",")
tob=Split([A1])
. Also, you can drop the space before theTo
in theFor
loop declaration.CoffeeScript,
10482, 65 bytesList of tasks (ES6): 65 bytes
List of tasks (ES5 variant): 82 bytes
Zero or more arguments: 104 bytes
Unminified:
źródło
Array.from(arguments)
instead of[].slice.call(arguments)
.arguments
any more.PHP,
9491 bytesTakes a list of tasks (e.g.
[[5,20],[5,20],[2,10],[15,19]]
). Thanks @IsmaelMiguel for the reminder of variable function names.Original attempt: 94 bytes
źródło
$R=str_repeat;foreach($G as$v)echo$R(' ',$v[0]),$R('-',$v[1]-$v[0]),'\n';
(replace the\n
with a real newline). For this to work, you need to send an array on the key$G
, over POST/GET/SESSION/COOKIE...GET
parameters count? And I think thatGET
uses STDIN.PHP, 89 characters (function body)
I was going to go for reading strings, but as a lot of the entries were taking arrays of integer pairs, I figured I would follow suit for the sake of brevity.
For each tuple
$a
in array$x
I echo a string of dashes repeated$a[1] - $a[0]
times, padded up to the larger number$a[1]
with spaces. Then the obligatory newline.źródło
printf()
seems shorter thanecho
+str_pad()
:function gantt($x){array_map(function($a){printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));},$x);}
(The ␊ in the code is for a literal newline: just wrap your code there.)foreach
is better:function g($x){foreach($x as$a)printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));}
And this is 79 characters including everything.Gema: 47 characters
Sample run:
źródło
PostgreSQL: 160 characters
Sample run:
źródło
J, 21 bytes
ungolfed
This is essentially just J's copy verb
#
, but its we're copying the space character head of list{.
number of times, and the hyphen character "2nd list element minus 1st list element" number of times:-~/
. Sadly this forces us to have to specify the rank"1
explictly, and we need to use Adverse::
to handle the empty case.Try it online!
źródło