Gantt ASCII simple

31

C'est simple: imprimez un diagramme de Gantt ASCII .

En fonction des plages de tâches (tuples de début et de fin), imprimez une chronologie de Gantt sous forme de -caractères pour chaque durée de tâche - chaque tâche dans une nouvelle ligne.

Exemple

Disons que mes plages de tâches sont 28->35, 34->40, 39->44, le Gantt ressemblera à ceci:

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

Caractéristiques

  • Vous pouvez écrire un programme complet, une fonction nommée ou une fonction anonyme.
  • Votre programme / fonction doit accepter les tâches via STDIN ou comme arguments .
  • Chaque tâche doit être représentée comme une chaîne de start->endstartet endsont des entiers . Les tâches sont séparées par des espaces ou des virgules. Alternativement , vous pouvez l'obtenir en tant que Tuple de nombres entiers, ou en tant que tableau / collection de 2 nombres entiers. (Par exemple, en JavaScript, vous pouvez l'obtenir sous la forme [start,end]- cela est autorisé).
  • Tout nombre non négatif de tâches (arguments) doit être pris en charge.
  • Pour être clair, un seul argument de la collecte des tâches n'est pas autorisé. Vous pouvez soit analyser un seul argument de chaîne, soit prendre en charge zéro ou plusieurs arguments de tâches. Où la tâche est un tuple ou une collection de taille 2.
  • Vous pouvez supposer que seule une entrée valide sera donnée. Cela signifie que chaque tâche a une durée positive.
  • La valeur de retour n'a pas d'importance, votre code doit imprimer la chronologie sur STDOUT.
  • Sortie: par tâche, startespaces suivis de (end-start)tirets et a \n.
  • Inutile de dire que les lignes de sortie doivent être ordonnées en conséquence avec l'ordre d'entrée (tâches).
  • Les espaces de fin avant le \nsont autorisés, si cela vous aide.

Cas de test

Input:
(empty)

Output:
(empty)


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

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


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

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

Gagnant

  • Il s'agit de donc la plus petite longueur de code (en octets) l'emporte.
  • Traditionnellement, le bris d'égalité est un post antérieur.
  • "Les failles standard ne sont plus drôles".

-----

MODIFIER

Comme beaucoup d'entre vous ont compris qu'il est autorisé d'avoir un seul argument de collection de tâches, et comme il n'y a pas beaucoup de différence entre cela et l' exigence varargs d' origine , il est désormais autorisé d'avoir un seul argument de collection, si vous ne souhaitez pas utiliser l'option varargs, ou dans le cas où votre langue ne prend pas en charge varargs.

Jacob
la source
1
Le point 3 semble clair. Mais piint 5 ( To make it clear...) n'est pas clair du tout.
edc65
D'accord, permettez-moi de reformuler cela: vous ne pouvez pas écrire une fonction qui accepte exactement un argument, sauf s'il s'agit d'une chaîne. S'il s'agit d'un tas de tuples dont nous parlons, ils peuvent être envoyés à votre fonction sous forme d'arguments, non enveloppés dans une collection. Par exemple, en JavaScript: vous pouvez itérer argumentsdans la fonction, mais vous ne pouvez pas supposer qu'il arguments[0]s'agit d'un tableau de tâches.
Jacob
8
Pourquoi ne pas simplement autoriser la saisie sous forme de tableau / liste / vecteur / etc. pour toutes les langues? La préférence personnelle semble être une raison assez faible.
Poignée de porte
1
Varargs versus une liste d'arguments est une distinction purement syntaxique et laisse les règles de cette question à un degré d'interprétation inutile et arbitraire, à mon avis.
JohnE
2
@Jacob est logique. Pour les défis futurs, je recommanderais une spécification d'entrée aussi laxiste que possible: la gestion des entrées ne devrait pas faire partie du défi.
Adám

Réponses:

14

CJam, 16 14 octets

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

Cela attend une liste de listes en entrée. Par exemple:

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

donne:

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

Comment ça marche

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

Essayez-le en ligne ici

Optimiseur
la source
20

Python 2, 39 octets

Solution simple utilisant la multiplication de chaînes :)

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

Accepte une entrée formatée comme suit:

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

Vérifiez le ici.

Kade
la source
11

Brainfuck, 120 115 111 octets

Au moins, c'est plus court que Java :) L'entrée est une liste d'octets, où chaque paire est une seule ligne dans le gantt.

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

Essaie

http://copy.sh/brainfuck/

Définissez la fin de l'entrée sur charavec une valeur \0. Exemple de saisie \5\20\5\20\2\10\15\19.

Notez que la définition de la valeur de fin d'entrée \0aura pour effet secondaire qu'aucune autre entrée ne sera lue (et donc arrêtera le programme) lorsque l'entrée contient le numéro zéro. Dans BF, il n'y a pas d'autre moyen de savoir quand l'entrée est épuisée.

Explication*

++++[->++++++++<]>  #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

* (Vous ne pourrez pas compiler / exécuter cela à cause des commentaires)

Rolf ツ
la source
6
Brainfuck plus court que Java => monde va bientôt se terminer.
Alex A.
1
L'explication devrait en fait fonctionner correctement. Les seules commandes bf présentes sont <et >, et elles sont parfaitement équilibrées.
undergroundmonorail
@undergroundmonorail Belle prise, je n'ai même pas essayé de voir s'ils étaient équilibrés;)
Rolf
8

Pyth, 36 22 19 14 octets

Ceci est mon premier programme Pyth. Jakube a aidé à jouer au golf sur 5 octets!

FNQ<s*V" -"NeN

Il attend une entrée dans le formulaire [[5,20], [5,20], [2,10], [15,19]].

Vous pouvez l' essayer en ligne .

Alex A.
la source
5

C ++ 14, 69 octets

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

Pour la première fois au golf, c'était un bon problème pour commencer!

patate douce
la source
2
N'avez-vous pas besoin std::de cinet cout?
Alex A.
3

K, 18 octets

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

Attend une liste de paires en entrée:

  `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}.'()

Je déballe chaque ( ') en utilisant tuple dot-appliquer ( .) de sorte que l' intérieur de la lambda je accès au début et à la fin comme valeur xet y, respectivement. Ensuite, je les rassemble dans un tuple (début, longueur) ( x,y-x) et applique "où" ( &). Cela me donne une sortie comme ça:

  {&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)

Ensuite, je dois simplement indexer dans un tableau à 2 caractères en utilisant cette matrice irrégulière ( " -"@) et envoyer tout cela à stdout ( 0:).

JohnE
la source
3

JavaScript ( ES6 ), 63

Modifier 3 octets enregistrés thx @apsillers
63 octets sans compter l'affectation à F comme fonction anonyme est autorisé.

Une fonction avec un nombre variable de paramètres, comme demandé.
Une fonction avec une liste de tâches en tant que paramètre unique.

Testez l'exécution de l'extrait ci-dessous (étant EcmaScript 6, Firefox uniquement)

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>

edc65
la source
Enregistrez un octet en l'attribuant t[0]à un global (ou vous pouvez l'affecter en toute sécurité lsi vous ne voulez pas créer un global). De plus, la spécification autorise "une fonction nommée ou une fonction anonyme", donc je pense que vous pouvez omettre le F=nombre d'octets.
apsillers
@apsillers J'ai raté la anonymousréflexion. Merci
edc65
3

Scala, 67 63 59 octets

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

Utilisation: res0()ou res0(Seq(28->35, 34->40, 39->44))etc.

Merci gilad d'avoir rasé 4 octets en utilisant une expression!

Jacob
la source
2

Ruby: 35 caractères

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

Échantillon échantillon:

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

Mis à jour pour accepter plusieurs tableaux à deux éléments, un pour chaque tâche à afficher. (Je pense que c'est ce que l'exigence mise à jour attend.)

homme au travail
la source
2

Javascript (ES6), 61/66 caractères

Ma réponse est presque similaire à celle publiée par @ edc65, mais avec quelques améliorations. Comme les tâches dans un seul tableau ne sont pas autorisées (donc la fonction serait appelée comme ceci a([3,4], [7,15], [0,14], [10, 15]):), la bonne serait la suivante ( 66 caractères sans attribution de nom):

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

Et si un argument de tableau est autorisé (donc appel fn comme ceci:) a([[3,4], [7,15], [0,14], [10, 15]]), alors ce serait ( 61 caractères sans affectation):

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

SWI-Prolog, 55 octets

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

Exemple: a([[5,20],[5,20],[2,10],[15,19]]).sorties

     ---------------
     ---------------
  --------
               ----
Fataliser
la source
Je suis désolé, mais le format d'entrée dans cette réponse ne répond pas aux spécifications - chaque tâche doit être représentée dans un argument, pas dans deux. (Sauf si j'ai raté quelque chose dans la syntaxe SWI-Prolog que je ne connais pas ...)
Jacob
@Jacob Ouais, en relisant votre message, je me suis dit que j'avais déjà changé mon code pour en tenir compte.
Fatalize
1

Haskell, 76 octets

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

Le format d'entrée est une chaîne de tuples séparés par des virgules, par exemple "(1,2),(3,4)".

Exemples d'utilisation:

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

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

Comment ça marche: Je joins pour analyser la chaîne d' entrée d'entrée [et ]et utiliser natif de Haskell readfonction pour les listes de tuples entières. Le reste est simple: pour chaque tuple, (s,e)prenez des sespaces suivis de e-stirets suivis d'une nouvelle ligne et concaténez le tout en une seule chaîne. Impression.

Haskell, 59 octets

avec un format d'entrée détendu:

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

Maintenant, il faut une liste de tuples, par exemple f [(0,7),(5,6),(3,6)].

Fonctionne comme décrit ci-dessus, mais sans analyse d'entrée.

nimi
la source
1

Julia, 44 octets

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

Cela crée une fonction anonyme qui accepte un tableau de tuples en entrée et imprime sur STDOUT.

Ungolfed + explication:

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

Exemples:

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

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

julia> f([])
Alex A.
la source
Sûr. Désolé pour le dérangement.
Jacob
@Jacob: Aucun inconvénient. Beau défi. :)
Alex A.
1

JavaScript (ES6), 106 85 80 68 octets

Conformément aux exigences mises à jour, une liste de tâches est désormais acceptable

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

Prend zéro ou plusieurs arguments: 80 octets

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

Tentative d'origine, 106 octets:

(...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}
rink.attendant.6
la source
Si c'est ES6, pourquoi pas String.repeat()?
manatwork
@manatwork Merci de m'avoir montré quelque chose de nouveau !! Malheureusement pour le golf de code, il est en fait plus long d'utiliser cela
rink.attendant.6
En effet, ce bidimensionnel an'aide pas vraiment. Je pensais à quelque chose comme ()=>{for(i=0,s='';a=arguments[i++];)s+='_'.repeat(a[0])+'-'.repeat(a[1]-a[0])+"\n";return s}.
manatwork
r = «répéter»? ... pour 2 fois? non! a=>a.reduce((p,v)=>p+=' '.repeat(z=v[0])+'-'.repeat(v[1]-z)+"\n",'')
edc65
1
Il n'y a pas de sortie. Return value does not matter, your code must print the timeline on STDOUT.(et serait plus court aussi)
edc65
1

C: 108 octets

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;
    }
}

Prend comme paramètre une liste d'entiers se terminant par -1. Par exemple:

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

Il permet cde basculer entre les espaces d'écriture et les tirets.

Functino
la source
1
Rendre c statique - vous pouvez supprimer son type (il sera int) et son initialisation (ce sera zéro). *l>=0est le même que celui *l+1qui est plus court. c&&putcharest plus courte que ternaire. Si vous remplacez c=!cpar c^=13(+1 octet), vous pouvez passer c?45:32à 32+c(-3 octets). Déplacer la cmédaille de forla fin de la boucle: (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 octets.
aragaer
1

Perl: 42 41 caractères

Juste pour avoir au moins une solution avec l'analyse des chaînes aussi.

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

Échantillon échantillon:

bash-4.3$ perl -pe 's!(\d+)->(\d+),?!$"x$1."-"x($2-$1).$/!ge' <<< '0->7,5->6,3->6'
-------
     -
   ---
homme au travail
la source
En fait, nous avons déjà la réponse Java simple qui analyse une chaîne :) Quoi qu'il en soit, merci aussi pour celle-ci!
Jacob
Oui, mais si je comprends bien, attend des nombres séparés par des virgules, pas le format spécifié dans la question.
manatwork
1

Java 8, 280 275 246 204 195 185 180 octets

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);};};

Une méthode qui prend une chaîne d'entrée séparée par des virgules et imprime le diagramme de Gantt ascii résultant sur stdout.

Merci à durron597 et masterX244 pour m'avoir aidé à économiser 10 octets

SuperJedi224
la source
Je pense que vous êtes autorisé à utiliser une méthode à la place.
lirtosiast
Il est autorisé si c'est la (ou la) manière de créer une fonction anonyme en Java8. Est ce
Jacob
C'est ce que Java 8 a de plus proche d'une telle fonctionnalité.
SuperJedi224
Si vous le faites, Integer i=0;vous pouvez le faire for(;i<i.parseInt;, en sauvant 8 caractères.
durron597
Je n'ai pas pu le compiler sur Ideone, mais il semble qu'il n'accepterait pas d'entrée vide, comme les règles l'exigent ( t.split(",")lèverait une exception).
Nateowami
1

Java, 187 181 197 183 101 octets

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":"-"));}

Non golfé (en quelque sorte):

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" : "-"));
}

Accepte l'entrée comme un tableau 2D de ints. Merci à masterX244 d' avoir souligné que cela est autorisé par les règles.

Nateowami
la source
vous pouvez raccourcir les boucles si vous utilisez le 3ème point de la version actuelle de la question et les varargs pour l'entrée
masterX244
@ masterX244 Merci, j'ai raté ça. Il me semble que je triche pour l'avoir pré-analysé, mais si la tricherie est autorisée ... peu importe. Je le mettrai à jour quand j'aurai le temps.
Nateowami
1

APL (Dyalog Classic) , 12 octets

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

Essayez-le en ligne!

APL n'a pas de varargs, donc l'argument ici est une seule matrice Nx2.

ngn
la source
Si vous pouvez prendre deux arguments (commence et se termine), alors↑'-'\⍨¨≤∘⍳¨
Adám
l'auteur du défi dit non
ngn
1

PowerShell 3.0, 4836 octets

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

Merci à Mazzy d'avoir économisé 12 avec une meilleure façon de passer dans la liste

Ancien code et explication:

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

Prend les arguments comme une liste de tuples, par exemple (5,20), (5,20), (2,10), (15,19). J'ai dû par défaut $ b sur une valeur pour prendre soin de la chaîne vide, car il est entré en quelque sorte dans le bloc foreach lorsqu'il a été appelé sans entrée.

Veska
la source
36 octets: $args|%{" "*$_[0]+"-"*($_[1]-$_[0])}. Enregistrer sous get-asciiGantt.ps1. Script de test.\get-asciiGantt.ps1 (5,20) (5,20) (2,10) (15,19)
mazzy
1

R , 117 90 75 octets

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

Essayez-le en ligne!

Giuseppe a joué au moins 29 octets sur ma réponse d'origine!

L'idée est simple: imprimer autant " " que nécessaire, puis autant "-"que nécessaire. L'entrée est une 2*Lmatrice avec L le nombre de paires. La fonction vectorisée diffest utilisée pour obtenir le nombre de "-".

JayCe
la source
1
@Giuseppe c'est ce que j'obtiens en essayant de coller à mon matrixidée originale tout en utilisant une forboucle ... ty!
JayCe
86 octets
Giuseppe
@Giuseppe Transposé ypour en sauver quelques autres :)
JayCe
Maintenant, 1 indexé économiserait 4
JayCe
Bien, utilisez <plutôt *et vous pouvez obtenir ceci à 81 octets
Giuseppe
1

VBA (Excel), 99 90 octets

Utilisation de la fenêtre immédiate et [A1]comme entrée, par exemple.0-1,2-5

Merci à @TaylorSott d'avoir coupé quelques octets.

b=Split([A1]):For x=0To Ubound(b):c=Split(b(x),"-"):?Spc(c(0)-0)String(c(1)-c(0),"-"):Next
remoel
la source
1
Si vous modifiez le format d'entrée pour qu'il soit délimité par des espaces plutôt que délimité par des virgules, vous pouvez modifier les deux premières clauses de a=[A1]:b=Split(a,",")à b=Split([A1]). En outre, vous pouvez supprimer l'espace avant la Todans la For déclaration en boucle.
Taylor Scott
Merci et noté! : D
remoel
0

CoffeeScript, 104 82, 65 octets

Liste des tâches (ES6): 65 octets

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

Liste des tâches (variante ES5): 82 octets

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

Zéro ou plusieurs arguments: 104 octets

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

Non minée:

() -> [].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
)
rink.attendant.6
la source
Vous ne savez pas d'où et où se trouvent JavaScript, CoffeeScript et ECMAScript dans vos réponses, mais dans ECMAScript, vous pouvez utiliser à la Array.from(arguments)place de [].slice.call(arguments).
manatwork
@manatwork Comme vous pouvez le voir dans mes réponses (ES5 et ES6, dans CoffeeScript) concernant l'exigence modifiée permettant une liste de tâches, je n'ai plus besoin de faire référence arguments.
rink.attendant.6
0

PHP, 94 91 octets

Prend une liste de tâches (par exemple [[5,20],[5,20],[2,10],[15,19]]). Merci @IsmaelMiguel pour le rappel des noms de fonctions variables.

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

Tentative d'origine: 94 octets

function x($a){foreach($a as$v){echo str_repeat(' ',$v[0]).str_repeat('-',$v[1]-$v[0])."\n";}}
rink.attendant.6
la source
73 octets, PHP4: $R=str_repeat;foreach($G as$v)echo$R(' ',$v[0]),$R('-',$v[1]-$v[0]),'\n';(remplacez le \npar une vraie nouvelle ligne). Pour que cela fonctionne, vous devez envoyer un tableau sur la clé $G, via POST / GET / SESSION / COOKIE ...
Ismael Miguel
@IsmaelMiguel Selon la question, l'entrée doit provenir d'un argument ou de STDIN.
rink.attendant.6
Les GETparamètres comptent-ils? Et je pense que cela GETutilise STDIN.
Ismael Miguel
0

PHP, 89 caractères (corps de fonction)

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

J'allais aller lire des chaînes, mais comme beaucoup d'entrées prenaient des tableaux de paires entières, j'ai pensé que je ferais de même pour des raisons de concision.

Pour chaque tuple $adans le tableau, $xje fais écho à une chaîne de tirets répétée $a[1] - $a[0], complétée au plus grand nombre $a[1]avec des espaces. Puis la nouvelle ligne obligatoire.

JPMC
la source
Vous pouvez faire votre nom de fonction juste une seule lettre pour économiser quelques octets. ou mieux encore, si PHP prend en charge les fonctions anonymes, omettez simplement un nom de fonction.
Alex A.
1
Oh, je vois maintenant ce que vous entendez par "corps fonctionnel". Vous devez compter toute la définition de la fonction dans votre score, pas seulement les entrailles.
Alex A.
1
printf()semble plus court que echo+ str_pad(): function gantt($x){array_map(function($a){printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));},$x);}(Le ␊ dans le code est pour une nouvelle ligne littérale: il suffit d'envelopper votre code là-bas.)
manatwork
1
En fait, un bon vieux foreachc'est mieux: function g($x){foreach($x as$a)printf("%$a[1]s␊",str_repeat('-',$a[1]-$a[0]));}et c'est 79 caractères tout compris.
manatwork
@AlexA. ah, j'ai vu des golfs où les gens comptent ou remettent les en-têtes de fonction. Je ne savais pas trop quoi faire, d'où la raison pour laquelle j'ai spécifié quel compte était quoi.
JPMC
0

Gema : 47 caractères

<D>-\><D><y>=@left{$1;}@repeat{@sub{$2;$1};-}\n

Échantillon échantillon:

bash-4.3$ gema '<D>-\><D><y>=@left{$1;}@repeat{@sub{$2;$1};-}\n' <<< '0->7,5->6,3->6'
-------
     -
   ---
homme au travail
la source
0

PostgreSQL: 160 caractères

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;

Échantillon échantillon:

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]]);
-------
     -
   ---
homme au travail
la source
0

J, 21 octets

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

non golfé

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

Ceci est essentiellement juste verbe copie de J #, mais son nous copient la tête de caractère d'espace de liste {.nombre de fois, et le caractère de trait d' union « 2ème élément de la liste moins 1er élément de la liste » nombre de fois: -~/. Malheureusement, cela nous oblige à spécifier explicitement le rang "1, et nous devons utiliser Adverse ::pour gérer le cas vide.

Essayez-le en ligne!

Jonas
la source