Kita akan menghitung bintang

8

Tujuan Anda adalah mengambil multiline ASCII like

|  v  |
* * * *
 * * *

dan memiliki larik yang mencakup segala sesuatu yang bukan bintang yang diubah menjadi bintang (kecuali untuk spasi [lebar-lebar]) dan jumlah bintang yang disertakan dan jumlah bintang yang ada di dalamnya. Jadi output dari contoh saya adalah:

['*  *  *
* * * *
 * * *',7,10]

atau

["*  *  *\n* * * *\n * * *", 7, 10]

tergantung pada apa yang dilakukan kode bahasa Anda.

Ini adalah tantangan , sehingga byte terpendek menang!

Cilan
sumber
4
Bisakah Anda mengklarifikasi format input dan output? Bentuk kode apa yang harus dimiliki (program, fungsi)?
Heiko Oberdiek
1
@ HeikoOberdiek Oh, ya. Ini bisa menjadi keduanya, mana yang lebih pendek untuk Anda.
Cilan
1
@TheWobbuffet Bagaimana dengan format input / output? Bisakah itu hanya fungsi yang mengambil argumen dan mengembalikan array, misalnya? Atau apakah harus mencetak jawabannya (dan apa format yang diperlukan untuk itu)?
14mRh4X0r

Jawaban:

3

GolfScript, 30 karakter

.{.'
 '?)\42if}%.{@'*'/,(}2*]`

Mengambil input dari stdin. Contoh ( tes online ):

> |  v  |
> * * * *
>  * * *

["*  *  *\n* * * *\n * * *\n" 7 10]
Howard
sumber
3

Python - 58 66 karakter

Sooo ... usaha Code Golf pertamaku ...

Kode:

import re;p=re.sub(r'\S','*',i);print[p,i.count('*'),p.count('*')]

Keluaran:

['*  *  *\n* * * *\n * * *', 7, 10]

Variabel:

  • i - input string
  • p - pola
  • o- output - dihapus

Ketergantungan:

reModul python

Kode lengkap:

import re
i = '|  v  |\n* * * *\n * * *'    
p = re.sub(r'\S','*', i)
print [p, i.count('*'), p.count('*')]

Suntingan:

  • Ditambahkan import reke solusi
  • Diganti o=dengan cetak
  • r'[/\S/g]'diubah menjadi r'\S' (terima kasih @ 14mRh4X0r)
martynas
sumber
Hai, selamat datang di PPCG! Ini sebagian besar merupakan jawaban yang baik, jadi tolong jangan mengambil sisa posting ini secara pribadi: Ada beberapa hal yang salah dengan itu. Anda telah membuat daftar remodul sebagai dependensi, tetapi masih perlu untuk memasukkannya dalam jawaban dan skor. Program Anda juga tidak menampilkan hasil seperti yang seharusnya (namun, karena Anda tidak benar-benar menggunakan ovariabel untuk apa pun, Anda hanya bisa s/o=/print/dan hanya kehilangan tiga). Selain itu, ini terlihat bagus!
undergroundmonorail
1
Sebenarnya, ada satu hal kecil lainnya. iVariabel Anda mengandung | v | * * * * * * *alih-alih input tes yang sebenarnya (yang mencakup baris baru). Yang sedang berkata, program Anda masih berfungsi jika Anda memasukkan baris baru, sehingga program Anda tidak harus diubah sama sekali, hanya posting. :)
undergroundmonorail
1
Hai @undergroundmonorail - terima kasih atas umpan baliknya :) Saya akan memperbarui pos saya sekarang
martynas
1
Tidak masalah. Juga, saya belum menguji ini sama sekali, tetapi 14mRh4X0r dari chat mengatakan itu r'[/\S/g]'bisa diganti dengan r'\S'untuk menyimpan beberapa karakter.
undergroundmonorail
1
@undergroundmonorail dan dia benar :) terima kasih
martynas
2

Ruby 2.0, 53 karakter

p [r=gets($n).gsub(/\S/,?*),$_.count(?*),r.count(?*)]

Tidak yakin tentang format input / output yang dibutuhkan. Ini membutuhkan input pada STDIN dan memformat output seperti:

Memasukkan:

|  v  |
* * * *
 * * *

Keluaran:

["*  *  *\n* * * *\n * * *", 7, 10]
Paul Prestidge
sumber
2

JavaScript (ECMASCript 6) - 51 Karakter

i=j=0,[A.replace(/\S/g,x=>(j++,i+=x=='*','*')),i,j]

Asumsikan variabel Aberisi input ASCII multiline. Untuk mengambilnya dari pengguna lalu ganti Adengan prompt()(+7 karakter) atau sebagai fungsi (lagi +7 karakter):

f=A=>(i=j=0,[A.replace(/\S/g,y=>(j++,i+=y=='*','*')),i,j])

Output ke konsol.

Uji:

A='|  v  |\n* * * *\n * * *'
i=j=0,[A.replace(/\S/g,x=>(j++,i+=x=='*','*')),i,j]

Output:

["*  *  *
* * * *
 * * *", 7, 10]
MT0
sumber
1

PHP ≥ 5.5, 84 69 63 byte

$a=[preg_replace('/\S/','*',$s,-1,$n),substr_count($s,'*'),$n];

Tidak banyak yang bisa dikatakan tentang ini. Karena tidak ada spesifikasi untuk bagaimana menangani input / output, saya mengasumsikan penyimpanan variabel. Mengharapkan input dalam variabel $sdan menyimpan array dalam variabel $a. Sayang sekali nama-nama fungsi itu begitu panjang.

Martin Ender
sumber
1

Rebol, 84

c: s: 0 parse t[any["*"(++ s)|" "|"^/"| m: skip(change m"*" ++ c)]]reduce[t s s + c]

Setel tke teks seperti itu ....

t: {|  v  |
* * * *
 * * *}

dan ini akan kembali ...

["*  *  *^/* * * *^/ * * *" 7 10]

Versi tidak dikolomisasi dengan beberapa catatan:

c: s: 0    ;; "s" is star count before change, "c" is count of chars changed to stars

; so using single-char ANY rule to parse each character in "t"

parse t [
    any [                              ;; so "t" is made up of ANY...
        "*"     (++ s) |               ;; "*" (if so then increment s)
        " "            |               ;; or a space
        "^/"           |               ;; or a newline
        m: skip (change m "*"  ++ c)   ;; or anything else (skip) 
                                       ;;   (and so change to "*" & increment c)
    ]
]

reduce [t s s + c]      ;; return array with amended text (t) and counts
draegtun
sumber
1

Groovy: 96 92 karakter

s=System.in.text
t=s.replaceAll(/[^\*\s]/,/\*/)
println "['$t',${s.count"*"},${t.count"*"}]"

Menggunakan Groovy 2.2.1

Baca dari STDIN. IMHO, tidak terlalu pintar, tetapi cukup mudah dibaca (mengingat singkatnya)

Michael Easter
sumber
0

Dalam JavaScript / CoffeeScript - 66 Karakter

Seperti Contoh PHP, panjangnya adalah karena panjang nama fungsi

[x.replace(/\S/g,"*"),x.split("*").length-1,x.match(/\S/g).length]

Contoh Penggunaan (CoffeeScript):

((x="|  v  |\n* * * *\n * * *")->[x.replace(/\S/g,'*'),x.split('*').length-1,x.match(/\S/g).length])()
Zachary Boyd
sumber
1
3-char lebih pendek:[x.replace(r=/\S/g,s='*'),x.split(s).length-1,x.match(r).length]
Michael M.
0

C # - 116

Cara terpendek yang dapat saya pikirkan untuk mengembalikan array ..

object[]R(string a){var o=Regex.Replace(a,"\\S", "*");return new object[]{o,a.Count(x=>x=='*'),o.Count(x=>x=='*')};}
mnsr
sumber
0

Perl, 52 byte

$_=join'',<>;printf'["%s",%s,%s]',$_,tr/*//,s/\S/*/g

Mengambil input dari input standar, mencetak ke output standar.

Dengan asumsi format output seperti yang Anda jelaskan dalam pertanyaan Anda, dapat dibuat sedikit lebih pendek jika format output yang berbeda diizinkan.

14mRh4X0r
sumber
0

Javascript - 50 karakter

i.replace(/\S/g,'*').replace(/\n/g,':').split(':')

Uji

Memasukkan

var i = 'Lately I been, I been losing sleep\nDreaming about the things that we could be\nBut baby, I been, I been prayin\' hard';
i.replace(/\S/g,'*').replace(/\n/g,':').split(':')

Keluaran

["****** * ***** * **** ****** *****", "******** ***** *** ****** **** ** ***** **", "*** ***** * ***** * **** ******* ****"]
Cepat
sumber
Ini tidak benar-benar memenuhi spesifikasi. Lihat di sini sebagai contoh.
mulai
0

AWK, (terlalu panjang)

awk '{y+=gsub(/[^* ]/, "*"); x+=NF}NR>1{z=z "\n" $0} NR==1{z=z $0} END{print "[\x27"z (x-y) "," x "\x27]"}'

Saya bukan awkmaster jadi saya yakin itu bisa diperbaiki. Takeaway adalah saya senang menulisnya! Perjuangan datang dengan cara melestarikan newlinesdari input tetapi tidak menempatkan , 7,10]pada baris baru. Logika itu sedikit ( NR>1{z=z "\n" $0} NR==1{z=z $0}) menghabiskan banyak karakter. Saya tertarik melihat awkpendekatan lain di bagian depan itu.

Saya tidak memberikan file di akhir skrip, tetapi jelas penggunaannya awk '{<code>}' ascii.txt, di mana ascii.txtberisi "input" multisaluran.

Keluaran

 ['* * *
 * * * *
 * * *',7,10]
Origineil
sumber
0

Java, 199 byte

Golf:

class C{public static void main(String[]a){String i=a[0],o=i.replaceAll("\\S","*");System.out.println("["+o+","+g(i)+","+g(o)+"]");}static int g(String x){return x.replaceAll("[^\\*]","").length();}}

Tidak golf:

public class CountingStars {

    public static void main(String[] args) {
        String input = args[0];
        //replace all non-white-space char with *
        String output = input.replaceAll("\\S", "*");
        System.out.println("[" + output + "," + getStars(input) + "," + getStars(output) +"]");
    }

    static int getStars(String x) {
        //replace all non-* characters with empty-string and return length
        return x.replaceAll("[^\\*]", "").length();
    }
}

Jalankan online .

Hopper Hunter
sumber