Combien de neige avez-vous reçu?

12

Mes excuses pour la verbosité. Nous nous sommes amusés avec cela au travail dans notre golf interne, mais cela a nécessité quelques e-mails pour des éclaircissements, donc j'espère avoir capturé la plupart de cela la première fois.

PROBLÈME

Étant donné un instantané «simulé» des chutes de neige (sous forme de chaîne, de stdin ou de paramètre pour votre fonction / méthode), indiquez 4 valeurs: profondeur minimale, profondeur maximale, profondeur moyenne et durée.

Voici un exemple formaté pour illustrer l'entrée:

* * **     
** * ***    
** *  *    
*          
--------

Le «*» est un flocon de neige et le «-» est le sol. Imaginez tous ces «flocons de neige» tombant vers le sol. Voici le dernier «instantané»:

*      
*          
** * **    
********    
--------

Vous devez faire rapport sur:

  1. Profondeur minimale - comptez la «pile» la plus courte (1, dans l'exemple ci-dessus)
  2. Profondeur maximale - comptez le plus haut «tas» (4, dans l'exemple ci-dessus)
  3. Profondeur moyenne - nombre moyen de tous les «pieux» (1,9, dans l'exemple ci-dessus - arrondi aux dixièmes)
  4. Durée - (chaque «chute» = 1 seconde) - temps entre le premier instantané et le dernier instantané (3 secondes, dans l'exemple ci-dessus)

Un autre exemple de référence:

     * 
   *   *
      *
*      
--------

Instantané final:

*  * ***
--------

CONTRIBUTION

Le «snapshot» de départ aura 8 «lignes», 8 «colonnes» et sera délimité par des tuyaux (les tuyaux séparent les lignes). Par exemple (hors guillemets):

“        |        |        |        |     *  |   *   *|      * |*       |--------” 

PRODUCTION

Les 4 valeurs délimitées par des tuyaux sur une seule ligne: 0 | 1 | .6 | 3 ou 0 | 5 | 1 | 1

Steve
la source
Le sol peut-il avoir des hauteurs variables?
Nemo157
@ Nemo157 - ce n'était pas dans notre problème d'origine, donc pour les besoins ici, non. Ce serait une variation intéressante du problème.
Steve
Avez-vous besoin d'arrondir la moyenne?
Titus

Réponses:

1

Perl, 128 caractères

map{$d++;s/\*/$d{$-[0]}++;$t&&$t<$d or$t=$d/ge}split'\|',<>;map{$A+=$_/8}@m=sort values%d;printf"$m[0]|$m[-1]|%.1f|%d\n",$A,8-$t
ninjalj
la source
6

Python, 153 caractères

s=raw_input()
R=range(8)
C=[s[i::9].count('*')for i in R]
print"%d|%d|%.1f|%d"%(min(C),max(C),sum(C)/8.,max(8-s[i::9].find('*')-C[i]for i in R if C[i]))
Keith Randall
la source
1

Windows PowerShell, 180 189

$a=(0..7|%{$x=$_;-join(0..7|%{$s[$_*9+$x]})})
$b=$a-replace' '|%{$_.length}|sort
"{0}|{1}|{2:.0}|{3}"-f($b[-1..0]+(($b-join'+'|iex)/8),($a|%{($_-replace'^ +|\*').length}|sort)[-1])

L'entrée vient en tant que $s.

Histoire:

  • 10/02/2011 01:53 (189) - Première tentative.
  • 2011-02-10 02:03 (180) - Formatez la chaîne à la rescousse. Seul inconvénient: il génère des nombres au format régional, qui ne sont plus strictement conformes à la spécification de la tâche. Pourtant, c'est un problème partagé par la solution C # également, donc je suppose que ça va.
Joey
la source
0

Quelques autres langues résultent de notre golf interne:

C #, 188 caractères (facilement lisible)

int a = 0, b = 8, c = 0, d = 0, f, i, j, x;    
for (i = 0; i < 8; i++)    
{    
      f = x = 0;    
      for (j = 0; j < 8; )
            if (s[i + j++ * 9] == '*')    
            {    
                  x = x > 0 ? x : 9 - j;    
                  f++;    
            }         

      d += f;    
      a = f > a ? f : a;    
      b = f < b ? f : b;    
      c = x - f > c ? x - f : c;    
}

Console.Write("{0}|{1}|{2:.0}|{3}", b, a, d / 8f, c);

Ruby, 173 caractères

s=gets;n=8;a=o=l=0;8.times{|i|f=x=0;8.times{|j|if(s[i+j*9].chr=='*'):x=8-j if x==0;f+=1;end}
o+=f;a=f if f>a;n=f if f<n;l=x-f if x-f>l}
printf "%d|%d|%.1f|%d",n,a,o.to_f/8,l
Steve
la source
0

PHP, 139 octets

<?for(;$y<8;$y++)for($x=0;++$n[$x],$x<8;$x++)'!'>$argv[1][$y*9+$x]&&--$n[$x]?$b[$x]++:0;print_r([min($n),max($n),array_sum($n)/8,max($b)]);

pour chaque colonne, ne comptez pas. de flocons de neige et non. des espaces sous le premier flocon de neige, puis calculer
prend la chaîne comme argument à partir de la ligne de commande

étapes de ventilation et de golf

$i=$argv[1];
for(;$y<8;$y++)         # $y=row
{
    for($x=0;$x<8;$x++) # $x=column
    {
        // loop body: 32+26=58 bytes
        if('*'==$i[$p=$y*9+$x])$n[$x]++;# if snowflake: increase snowflakes count
        elseif($n[$x]+=0)$b[$x]++;      # elseif has snowflakes: increase blanks count
                                        # +=0: min needs a value in every column

        // -> golf if/elseif to ternaries, 16+9+25+1 = 51 (-7)
#       '*'==$i[$y*9+$x]
#           ? $n[$x]++
#           : (($n[$x]+=0)?$b[$x]++:0)
#       ;

        // golfing on the ternary, 15+23+9+1 = 48 (-3)
#       '!'>$i[$y*9+$x]                 # -1: char<'!' <=> char==' '
#           ? ($n[$x]+=0)?$b[$x]++:0    # -2: inverted condition -> eliminated parens
#           : $n[$x]++
#       ; # 15+23+9+1-2=46

        // increase snowflakes count in any case (initialization)
        // (needs curlies; elminate them by moving increase to the for condition)
        // decrease snowflakes count for blank
#       ++$n[$x];if('!'>$i[$y*9+$x]&&--$n[$x])$b[$x]++; # if: 47
#       ++$n[$x];'!'>$i[$y*9+$x]&&--$n[$x]?$b[$x]++:0;  # ternary: 46
    }
}
print_r([min($n),max($n),array_sum($n)/8,max($b)]); # calculate and print results

ajouter round(...,1)autour array_sum($n)/8pour arrondir (+9)

Titus
la source
0

Mathematica , ~ 115

"        \n        \n* * **  \n        \n** * ***\n** *  * \n*       \n--------"

Most/@ToCharacterCode@%~Partition~9/10-16/5
Min@#|Max@#|Mean@#~Round~.1|Position[#,1][[{-1,1},1]].{1,-1}-1&@Total@%
1 | 4 | 1.9 | 4

Dans ce post, j'ai dû recourir à la forme de chaîne échappée \ncar le copier-coller perd des espaces. Dans le frontal, je peux le saisir comme ceci:

entrez la description de l'image ici

Mr.Wizard
la source
0

JavaScript, 328 octets

Pas particulièrement court, mais c'est ce que j'ai.

var input = "        |        |        |* * **  |        |** * ***|** *  * |*       |--------";

(s=>{var l=s.split("|"),a=[0,0,0,0,0,0,0,0],o=[8,0,0,0],b;for(i=0;i<l.length;i++){if(!b&&l[i]!="        ")o[3]=7-i,b=1;for(j=0;j<l[i].length;j++){a[j]+=l[i][j]=="*"?1:0}}for(i=0;i<a.length;i++){if(a[i]<o[0])o[0]=a[i];if(a[i]>o[1])o[1]=a[i];o[2]+=a[i];}console.log(o[0]+"|"+o[1]+"|"+(o[2]/a.length).toFixed(1)+"|"+o[3]);})(input)

De-golfé:

var input = "        |        |        |        |     *  |   *   *|      * |*       |--------";

(s=>{
  var splits = s.split("|");
  var arr = [0,0,0,0,0,0,0,0];
  var b;
  var o=[8,0,0,0];
  for (var i = 0; i < splits.length; i++) {
    if (!b&&splits[i]!="        ") {
      o[3] = 7-i;b=1;
    }
    for (var j = 0; j < splits[i].length; j++) {
      arr[j]+=splits[i][j]=="*"?1:0;
    }
  }
  for (var i = 0; i < arr.length; i++) {
    if (arr[i]<o[0]) {
      o[0]=arr[i];
    }
    if (arr[i]>o[1]) {
      o[1]=arr[i];
    }
    o[2]+=arr[i];
  }
  console.log(o[0]+"|"+o[1]+"|"+(o[2]/arr.length).toFixed(1)+"|"+o[3]);
})(input)
Davis
la source