É simples: imprima um gráfico ASCII Gantt .
Dado o intervalo das tarefas (horário de início - Tuplas no horário de término), imprima uma linha do tempo de Gantt na forma de -
caracteres para cada duração de tarefa - cada tarefa em uma nova linha.
Exemplo
Digamos que meus intervalos de tarefas sejam 28->35, 34->40, 39->44
, o Gantt ficará assim:
-------
------
-----
Especificações
- Você pode escrever um programa completo, uma função nomeada ou uma função anônima.
- Seu programa / função deve aceitar as tarefas via STDIN ou como argumentos .
- Cada tarefa deve ser representada como uma sequência de
start->end
ondestart
eend
são Inteiros . As tarefas são separadas por espaços ou vírgulas. Como alternativa , você pode obtê-lo como uma tupla de números inteiros ou como uma matriz / coleção de 2 números inteiros. (Por exemplo, em JavaScript, você pode obtê-lo como[start,end]
- isso é permitido). - Qualquer número não negativo de tarefas (argumentos) deve ser suportado.
Para deixar claro, não é permitido um único argumento de coleta de tarefas. Você pode analisar um argumento de cadeia única ou oferecer suporte a zero ou mais argumentos de tarefas. Onde tarefa é uma tupla ou uma coleção de tamanho 2.- Você pode assumir que apenas dados válidos serão fornecidos. Isso significa que cada tarefa tem uma duração positiva.
- O valor de retorno não importa, seu código deve imprimir a linha do tempo em STDOUT.
- Saída: por tarefa,
start
espaços seguidos por(end-start)
traços e a\n
. - Desnecessário dizer que as linhas de saída devem ser ordenadas de acordo com a ordem de entrada (tarefas).
- Os espaços à direita antes do
\n
permitido são permitidos, se isso o ajudar.
Casos de teste
Input:
(empty)
Output:
(empty)
Input:
0->7,5->6,3->6
Output:
-------
-
---
Input:
5->20,5->20,2->10,15->19
Output:
---------------
---------------
--------
----
Ganhando
- Isso é código-golfe, então o menor comprimento de código (em bytes) vence.
- Tradicionalmente, o desempate é um post anterior.
- "As brechas padrão não são mais engraçadas".
-----
EDITAR
Como muitos de vocês entendem que é permitido ter um único argumento de coleção de tarefas, e como não há muito diferente entre isso e o requisito de varargs original , agora é permitido ter um único argumento de coleção, se você não quiser usar a opção varargs ou caso seu idioma não suporte varargs.
To make it clear...
) não está claro.arguments
na função, mas não pode presumir quearguments[0]
seja uma matriz de tarefas.Respostas:
CJam,
1614 bytesIsso espera uma lista de listas como entrada. Por exemplo:
dá:
Como funciona
Experimente online aqui
fonte
Python 2, 39 bytes
Solução simples usando multiplicação de cadeias :)
Aceita entrada formatada da seguinte forma:
Confira aqui.
fonte
BrainFuck,
120115111 bytesPelo menos é mais curto que Java :) A entrada é uma lista de bytes, em que cada par é uma única linha no Gantt.
Tente
http://copy.sh/brainfuck/
Defina o final da entrada como charcom valor
\0
. Exemplo de entrada:\5\20\5\20\2\10\15\19
.Observe que definir o valor de final de entrada como
\0
terá o efeito colateral de que nenhuma entrada será mais lida (e, portanto, interrompendo o programa) quando a entrada contiver o número zero. Em BF não há outra maneira de saber quando a entrada está esgotada.Explicação*
* (Você não poderá compilar / executar isso devido aos comentários)
fonte
<
e>
são perfeitamente equilibrados.Pitão,
36221914 bytesEste é o meu primeiro programa Pyth. Jakube ajudou a obter 5 bytes de golfe!
Espera entrada no formulário
[[5,20], [5,20], [2,10], [15,19]]
.Você pode experimentá-lo online .
fonte
C ++ 14, 69 bytes
Golfe pela primeira vez, este foi um bom problema para começar!
fonte
std::
decin
ecout
?K, 18 bytes
Espera uma lista de pares como entrada:
Descompacto cada
'
tupla ( ) usando dot-apply (.
) para que dentro do lambda eu tenha acesso ao valor inicial e final comox
ey
, respectivamente. Em seguida, remontei-as em uma tupla (início, comprimento) (x,y-x
) e apliquei "where" (&
). Isso me dá uma saída assim:Então, eu simplesmente tenho que indexar em uma matriz de 2 caracteres usando essa matriz irregular (
" -"@
) e enviar tudo para stdout (0:
).fonte
JavaScript ( ES6 ), 63
Edite 3 bytes salvos thx @apsillers
63 bytes sem contar a atribuição para F, pois é permitida uma função anônima.
Uma função com um número variável de parâmetros, conforme solicitado.Uma função com uma lista de tarefas como um único parâmetro.
Teste a execução do snippet abaixo (sendo EcmaScript 6, apenas Firefox)
fonte
t[0]
a um global (ou você pode atribuí-lo com segurançal
se não quiser tornar um global). Além disso, a especificação permite "uma função nomeada ou uma função anônima", então eu acho que você poderia omitir aF=
contagem de bytes.anonymous
pensamento. GraçasScala,
676359 bytesUso:
res0()
oures0(Seq(28->35, 34->40, 39->44))
etc.Obrigado gilad por barbear 4 bytes usando a para expressão!
fonte
Ruby: 35 caracteres
Exemplo de execução:
Atualizado para aceitar várias matrizes de dois elementos, uma para cada tarefa a ser exibida. (Acho que é isso que o requisito atualizado espera).
fonte
Javascript (ES6), 61/66 caracteres
Minha resposta é quase semelhante à postada por @ edc65, mas com algumas melhorias. Como tarefas em matriz única não são permitidas (a função seria chamada assim
a([3,4], [7,15], [0,14], [10, 15])
:), a correta seria essa ( 66 caracteres sem atribuição de nome):E se um argumento de matriz for permitido (então fn chame assim:)
a([[3,4], [7,15], [0,14], [10, 15]])
, seria ( 61 char sem atribuição):fonte
SWI-Prolog, 55 bytes
Exemplo:
a([[5,20],[5,20],[2,10],[15,19]]).
saídasfonte
Haskell, 76 bytes
O formato de entrada é uma sequência de tuplas separadas por vírgula, por exemplo
"(1,2),(3,4)"
.Exemplos de uso:
Como funciona: para entrada de analisar Estou anexando a cadeia de entrada em
[
e]
e usar natal de Haskellread
função para listas de tuplas inteiros. O resto é fácil: para cada tupla(s,e)
ocupes
espaços seguidos dee-s
traços seguidos por uma nova linha e concatene tudo em uma única sequência. Impressão.Haskell, 59 bytes
com formato de entrada relaxado:
Agora é preciso uma lista de tuplas, por exemplo
f [(0,7),(5,6),(3,6)]
.Funciona como descrito acima, mas sem análise de entrada.
fonte
Julia, 44 bytes
Isso cria uma função anônima que aceita uma matriz de tuplas como entrada e imprime em STDOUT.
Ungolfed + explicação:
Exemplos:
fonte
JavaScript (ES6),
106858068 bytesDe acordo com os requisitos atualizados, uma lista de tarefas agora é aceitável
Leva zero ou mais argumentos: 80 bytes
Tentativa original, 106 bytes:
fonte
String.repeat()
?a
não ajuda muito. Eu tinha em mente algo assim()=>{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.
(e seria mais curto também)C: 108 bytes
Ungolfed:
Toma como parâmetro uma lista de números inteiros terminados por
-1
. Por exemplo:Ele usa
c
para alternar entre escrever espaços e traços.fonte
*l>=0
é o mesmo*l+1
que é mais curto.c&&putchar
é mais curto que o ternário. Se você substituirc=!c
porc^=13
(+1 byte), poderá alterarc?45:32
para32+c
(-3 bytes). Moverc
aleta defor
para o fim do ciclo:(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 bytes.Perl:
4241 caracteresApenas para ter pelo menos uma solução com análise de string também.
Exemplo de execução:
fonte
Java 8,
280275246204195185180 bytesUm método que pega uma sequência de entrada separada por vírgula e imprime o gráfico de Gantt ascii resultante em stdout.
Obrigado a durron597 e masterX244 por me ajudarem a economizar 10 bytes
fonte
Integer i=0;
puderfor(;i<i.parseInt;
, salve 8 caracteres.t.split(",")
geraria uma exceção).Java,
187181197183101 bytesUngolfed (tipo de):
Aceita entrada como 2d array de
int
s. Agradecemos a masterX244 por apontar que isso é permitido pelas regras.fonte
Geléia ,
139 bytesExperimente online!
Toma entrada como
[[5, 20], [5, 20], [2, 10], [15, 19]]
.-4 bytes graças a Erik
fonte
APL (Dyalog Classic) , 12 bytes
Experimente online!
O APL não possui varargs, portanto, o argumento aqui é uma única matriz Nx2.
fonte
↑'-'\⍨¨≤∘⍳¨
JavaScript (ES8), 54 bytes
Experimente online
fonte
PowerShell 3.0,
48.36 bytesAgradecemos a Mazzy por salvar 12 com uma maneira melhor de passar na lista
Código antigo e explicação:
Toma argumentos como uma lista de tuplas, por exemplo, (5,20), (5,20), (2,10), (15,19). Teve que usar como padrão $ b em um valor para cuidar da cadeia vazia, porque de alguma forma entrou no bloco foreach quando chamado sem entrada.
fonte
$args|%{" "*$_[0]+"-"*($_[1]-$_[0])}
. Salvar comoget-asciiGantt.ps1
. Teste script.\get-asciiGantt.ps1 (5,20) (5,20) (2,10) (15,19)
R ,
117 9075 bytesExperimente online!
Giuseppe jogou pelo menos 29 bytes na minha resposta original!
A idéia é direta: imprima quantas forem
" "
necessárias, seguidas de quantas forem"-"
necessárias. Entrada é uma2*L
matriz com L o número de pares. A função vetorizadadiff
é usada para obter o número de "-".fonte
matrix
ideia original enquanto estiver usando umfor
loop ... ty!y
para salvar alguns mais :)<
em vez de*
e você pode chegar a este 81 bytesVBA (Excel),
9990 bytesUsando Janela Imediata e
[A1]
como entrada, por exemplo.0-1,2-5
Obrigado a @TaylorSott por cortar alguns bytes.
fonte
a=[A1]:b=Split(a,",")
parab=Split([A1])
. Além disso, você pode eliminar o espaço antes da declaraçãoTo
noFor
loop.CoffeeScript,
10482, 65 bytesLista de tarefas (ES6): 65 bytes
Lista de tarefas (variante ES5): 82 bytes
Zero ou mais argumentos: 104 bytes
Desminificado:
fonte
Array.from(arguments)
vez de[].slice.call(arguments)
.arguments
.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
fonte
$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.fonte
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:
fonte
PostgreSQL: 160 characters
Sample run:
fonte
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!
fonte