Berapa banyak salju yang kamu dapatkan?

12

Maafkan saya atas kelapangannya. Kami bersenang-senang melakukannya di golf internal kami, tetapi diperlukan beberapa email untuk klarifikasi, jadi saya harap saya menangkap sebagian besar dari itu pertama kali.

MASALAH

Diberikan snapshot salju "disimulasikan" (sebagai string, stdin atau parameter untuk fungsi / metode Anda), laporkan 4 nilai: kedalaman minimum, kedalaman maksimum, kedalaman rata-rata, dan durasi.

Berikut adalah contoh yang diformat untuk menggambarkan input:

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

'*' Adalah butiran salju dan '-' adalah tanah. Bayangkan semua "kepingan salju" yang jatuh ke tanah. Ini adalah "potret" terakhir:

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

Anda perlu melaporkan:

  1. Kedalaman minimum - hitung "tumpukan" terpendek (1, dalam contoh di atas)
  2. Kedalaman maksimum - hitung "tumpukan" tertinggi (4, dalam contoh di atas)
  3. Kedalaman rata-rata - jumlah rata-rata semua “tumpukan” (1.9, misalnya di atas - membulatkan ke sepersepuluh)
  4. Durasi - (setiap "jatuh" = 1 detik) - waktu dari foto pertama hingga foto terakhir (3 detik, contoh di atas)

Contoh lain untuk referensi:

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

Cuplikan terakhir:

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

MEMASUKKAN

"Snapshot" awal akan memiliki 8 "baris", 8 "kolom", dan dipisahkan oleh pipa (pipa memisahkan baris). Misalnya (tidak termasuk kutipan):

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

KELUARAN

Nilai 4 pipa-dibatasi pada satu baris: 0 | 1 | .6 | 3 atau 0 | 5 | 1 | 1

Steve
sumber
Bisakah tanah memiliki ketinggian yang bervariasi?
Nemo157
@ Nemo157 - itu tidak ada dalam masalah asli kami, jadi untuk keperluan di sini, tidak. Itu akan menjadi variasi yang menarik untuk masalah ini.
Steve
Apakah Anda memerlukan pembulatan rata-rata?
Titus

Jawaban:

1

Perl, 128 karakter

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
sumber
6

Python, 153 karakter

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
sumber
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])

Input masuk sebagai $s.

Sejarah:

  • 2011-02-10 01:53 (189) - Upaya pertama.
  • 2011-02-10 02:03 (180) - Memformat string untuk menyelamatkan. Satunya downside: Ini menghasilkan angka dalam format regional, tidak lagi benar-benar sesuai dengan spesifikasi tugas. Namun, itu adalah masalah yang dibagikan oleh solusi C # juga jadi saya kira itu tidak masalah.
Joey
sumber
0

Beberapa hasil bahasa lain dari golf internal kami:

C #, 188 karakter (mudah dibaca)

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 karakter

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
sumber
0

PHP, 139 byte

<?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)]);

untuk setiap kolom, hitung no. kepingan salju dan tidak. ruang di bawah kepingan salju pertama, kemudian hitung
mengambil string sebagai argumen dari baris perintah

langkah-langkah pemecahan dan 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

tambahkan round(...,1)sekitar array_sum($n)/8untuk pembulatan (+9)

Titus
sumber
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

Dalam posting ini saya harus beralih ke bentuk string yang lolos \nkarena menempel dan menyalin kehilangan spasi. Di Front End saya bisa memasukkannya seperti ini:

masukkan deskripsi gambar di sini

Tuan Wisaya
sumber
0

JavaScript, 328 Bytes

Tidak terlalu pendek, tapi itulah yang saya punya.

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
sumber