Это просто: распечатайте диаграмму Гантта ASCII .
Для заданных диапазонов задач (время начала - время окончания), выведите временную шкалу Ганта в виде -
символов для каждой продолжительности задачи - каждая задача в новой строке.
пример
Скажем, мои задачи находятся в диапазоне 28->35, 34->40, 39->44
, Гантт будет выглядеть так:
-------
------
-----
Характеристики
- Вы можете написать полную программу, именованную функцию или анонимную функцию.
- Ваша программа / функция должна принимать задачи через STDIN или в качестве аргументов .
- Каждая задача должна быть представлена в виде строки,
start->end
гдеstart
иend
являются целыми числами . Задачи разделяются пробелами или запятыми. Кроме того , вы можете получить его как кортеж целых чисел или как массив / набор из 2 целых чисел. (Например, в JavaScript вы можете получить это как[start,end]
- это разрешено). - Любое неотрицательное количество задач (аргументов) должно поддерживаться.
Чтобы было понятно, один аргумент набора задач не допускается. Вы можете анализировать один строковый аргумент или поддерживать ноль или более аргументов задач. Где задача - это кортеж или коллекция размером 2.- Вы можете предполагать, что будет дан только верный ввод. Это означает, что каждая задача имеет положительную продолжительность.
- Возвращаемое значение не имеет значения, ваш код должен печатать временную шкалу на STDOUT.
- Вывод: за задачу,
start
пробелы, за которыми следуют(end-start)
тире и a\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.
To make it clear...
) не совсем понятно.arguments
внутри функции, но можете не предполагать, чтоarguments[0]
это массив задач.Ответы:
CJam,
1614 байтовЭто ожидает список списков в качестве входных данных. Например:
дает:
Как это работает
Попробуйте онлайн здесь
источник
Python 2, 39 байт
Простое решение с использованием умножения строк :)
Принимает входные данные, отформатированные так:
Проверьте это здесь.
источник
Brainfuck,
120115111 байтовПо крайней мере, это короче, чем Java :) Входные данные представляют собой список байтов, где каждая пара представляет собой одну строку в Гантте.
Проверять
http://copy.sh/brainfuck/
Установите конец ввода в charзначение
\0
. Пример входных данных:\5\20\5\20\2\10\15\19
.Обратите внимание, что установка значения конца ввода
\0
будет иметь побочный эффект, заключающийся в том, что больше входной сигнал не будет считываться (и, следовательно, останавливается программа), когда вход содержит нулевое число. В BF нет другого способа узнать, когда ввод исчерпан.Объяснение *
* (Вы не сможете скомпилировать / запустить это из-за комментариев)
источник
<
и>
, и они прекрасно сбалансированы.Pyth,
36221914 байтовЭто моя первая программа Pyth. Якуб помог вытащить 5 байтов!
Ожидает ввода в форме
[[5,20], [5,20], [2,10], [15,19]]
.Вы можете попробовать это онлайн .
источник
C ++ 14, 69 байт
В первый раз, играя в гольф, это была хорошая проблема для начала!
источник
std::
наcin
иcout
?К, 18 байт
Ожидается список пар в качестве входных данных:
Я распаковываю каждый
'
кортеж ( ) с помощью dot-apply (.
), чтобы внутри лямбды я имел доступ к начальному и конечному значению какx
иy
, соответственно. Затем я собираю их в кортеж (начало, длина) (x,y-x
) и применяю «где» (&
). Это дает мне вывод примерно так:Затем мне просто нужно проиндексировать 2-символьный массив с помощью этой рваной матрицы (
" -"@
) и отправить все это в stdout (0:
).источник
JavaScript ( ES6 ), 63
Редактировать сохраненные 3 байта thx @apsillers
63 байта, не считая присваивание F как анонимной функции.
Функция с переменным количеством параметров в соответствии с запросом.Функция со списком задач в качестве одного параметра.
Тестовый запуск фрагмента ниже (будь то EcmaScript 6, только Firefox)
источник
t[0]
глобальный (или вы можете безопасно назначить его,l
если вы не хотите создавать глобальный). Кроме того, спецификация допускает «именованную функцию или анонимную функцию», так что я думаю, что вы можете опуститьF=
счетчик байтов.anonymous
мысль. СпасибоScala,
676359 байтИспользование:
res0()
илиres0(Seq(28->35, 34->40, 39->44))
др.Спасибо Гиладу за бритье 4 байта, используя для выражения!
источник
Рубин: 35 символов
Образец прогона:
Обновлен, чтобы принимать несколько двухэлементных массивов, по одному для каждой задачи для отображения. (Я думаю, что именно этого ожидает обновленное требование.)
источник
Javascript (ES6), 61/66 символов
Мой ответ почти аналогичен тому, который опубликовал @ edc65, но с некоторыми улучшениями. Поскольку задачи в одном массиве недопустимы (поэтому функция будет вызываться так:)
a([3,4], [7,15], [0,14], [10, 15])
, правильной будет следующая ( 66 символов без присвоения имени):И если разрешен один аргумент массива (поэтому вызовите fn так:)
a([[3,4], [7,15], [0,14], [10, 15]])
, то это будет ( 61 символ без присваивания):источник
SWI-Пролог, 55 байт
Пример:
a([[5,20],[5,20],[2,10],[15,19]]).
выходыисточник
Haskell, 76 байт
Формат ввода - это строка кортежей, разделенных запятыми, например
"(1,2),(3,4)"
.Примеры использования:
Как это работает: для разбора ввода я заключаю входную строку в
[
и]
и использую встроеннуюread
функцию Haskell для списков целочисленных кортежей. Остальное легко: для каждого кортежа(s,e)
взятьs
пробелы, за которымиe-s
следуют тире, за которым следует новая строка, и объединить все в одну строку. Распечатать.Haskell, 59 байт
с расслабленным форматом ввода:
Теперь он принимает список кортежей, например
f [(0,7),(5,6),(3,6)]
.Работает, как описано выше, но без разбора ввода.
источник
Юлия, 44 байта
Это создает анонимную функцию, которая принимает массив кортежей в качестве входных данных и печатает в STDOUT.
Ungolfed + объяснение:
Примеры:
источник
JavaScript (ES6),
106858068 байтСогласно обновленным требованиям, список задач теперь приемлем
Принимает ноль или более аргументов: 80 байт
Исходная попытка, 106 байт:
источник
String.repeat()
?a
не очень помогает. Я имел в виду нечто подобное()=>{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.
(и тоже будет короче)C: 108 байтов
Ungolfed:
Принимает в качестве параметра список целых чисел, оканчивающихся на
-1
. Например:Используется
c
для переключения между написанием пробелов и тире.источник
*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 байта.Perl:
4241 символовПросто иметь хотя бы одно решение с разбором строк тоже.
Образец прогона:
источник
Ява 8,
280275246204195185180 байтМетод, который принимает разделенную запятыми входную строку и печатает результирующую диаграмму Ганта ascii в стандартный вывод.
Спасибо durron597 и masterX244 за помощь в экономии 10 байт
источник
Integer i=0;
можете сделатьfor(;i<i.parseInt;
, сохраняя 8 символов.t.split(",")
будет выдано исключение).Ява,
187181197183101 байтUngolfed (вроде):
Принимает ввод как 2d массив
int
s. Спасибо masterX244 за указание, что это разрешено правилами.источник
Желе ,
139 байтПопробуйте онлайн!
Принимает вход как
[[5, 20], [5, 20], [2, 10], [15, 19]]
.-4 байта благодаря Эрику
источник
APL (Dyalog Classic) , 12 байт
Попробуйте онлайн!
У APL нет переменных, поэтому аргумент здесь представляет собой одну матрицу Nx2.
источник
↑'-'\⍨¨≤∘⍳¨
JavaScript (ES8), 54 байта
Попробуйте онлайн
источник
PowerShell 3.0,
4836 байтСпасибо Mazzy за сохранение 12 с лучшим способом пройти в списке
Старый код и объяснение:
Принимает аргументы в виде списка кортежей, например (5,20), (5,20), (2,10), (15,19). Пришлось по умолчанию $ b к значению, чтобы позаботиться о пустой строке, потому что он каким-то образом вошел в блок foreach при вызове без ввода.
источник
$args|%{" "*$_[0]+"-"*($_[1]-$_[0])}
. Сохранить какget-asciiGantt.ps1
. Тестовый сценарий.\get-asciiGantt.ps1 (5,20) (5,20) (2,10) (15,19)
R ,
117 9075 байтПопробуйте онлайн!
Джузеппе проиграл не менее 29 байтов от моего первоначального ответа!
Идея проста: напечатать столько,
" "
сколько необходимо, а затем столько,"-"
сколько требуется. Вход представляет собой2*L
матрицу с L количеством пар. Векторизованная функцияdiff
используется для получения числа «-».источник
matrix
идеи, используяfor
цикл ... ты!y
чтобы сохранить еще несколько :)<
вместо,*
и вы можете получить это до 81 байтаVBA (Excel),
9990 байтИспользование немедленного окна и в
[A1]
качестве ввода, например.0-1,2-5
Спасибо @TaylorSott за сокращение байтов.
источник
a=[A1]:b=Split(a,",")
наb=Split([A1])
. Кроме того , вы можете оставить пространство передTo
вFor
объявлении цикла.CoffeeScript,
10482, 65 байтСписок задач (ES6): 65 байт
Список задач (вариант ES5): 82 байта
Ноль или более аргументов: 104 байта
Unminified:
источник
Array.from(arguments)
вместо[].slice.call(arguments)
.arguments
.PHP,
9491 байтПринимает список задач (например
[[5,20],[5,20],[2,10],[15,19]]
). Спасибо @IsmaelMiguel за напоминание имен переменных функций.Исходная попытка: 94 байта
источник
$R=str_repeat;foreach($G as$v)echo$R(' ',$v[0]),$R('-',$v[1]-$v[0]),'\n';
(замените\n
с реальной новой строки). Чтобы это работало, вам нужно отправить массив с ключом$G
через POST / GET / SESSION / COOKIE ...GET
параметры? И я думаю, чтоGET
использует STDIN.PHP, 89 символов (тело функции)
Я собирался пойти на чтение строк, но так как многие записи принимали массивы целочисленных пар, я решил, что для краткости последую примеру.
Для каждого кортежа
$a
в массиве$x
я повторяю строку из повторяющихся черточек$a[1] - $a[0]
, дополняемых до большего числа$a[1]
пробелами. Тогда обязательный перевод строки.источник
printf()
кажется корочеecho
+str_pad()
:function gantt($x){array_map(function($a){printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));},$x);}
(␊ в коде для буквального перехода на новую строку: просто оберните ваш код там.)foreach
лучше:function g($x){foreach($x as$a)printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));}
и это 79 символов, включая все.Гема : 47 символов
Образец прогона:
источник
PostgreSQL: 160 символов
Образец прогона:
источник
J, 21 байт
ungolfed
Это, по существу , просто копия глагол Джея
#
, но его мы копирование пространства символов голову списка{.
количества раз, и дефис «второй элемент списка минус первого элемент списка» количество раз:-~/
. К сожалению, это заставляет нас"1
явно указывать ранг , и нам нужно использовать Adverse::
для обработки пустого регистра.Попробуйте онлайн!
источник