Chúng ta sẽ đếm những vì sao


8

Mục tiêu của bạn là lấy ASCII nhiều dòng như

|  v  |
* * * *
 * * *

và có một mảng bao gồm mọi thứ không phải là một ngôi sao được thay đổi thành một ngôi sao (ngoại trừ các khoảng trống [bất kỳ chiều rộng]) và số lượng sao mà nó bao gồm và số lượng sao hiện có. Vì vậy, đầu ra của ví dụ của tôi sẽ là:

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

hoặc là

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

tùy thuộc vào những gì ngôn ngữ mã của bạn làm.

Đây là một thử thách , vì vậy các byte ngắn nhất sẽ thắng!


4
Bạn có thể làm rõ các định dạng đầu vào và đầu ra, xin vui lòng? Dạng mã nào phải có (chương trình, hàm)?
Heiko Oberdiek

1
@HeikoOberdiek Ồ, vâng. Nó có thể là cả hai, cái nào ngắn hơn cho bạn.
Cilan

1
@TheWobbuffet Còn định dạng đầu vào / đầu ra thì sao? Nó có thể chỉ là một hàm lấy một đối số và trả về một mảng, ví dụ? Hoặc nó phải in ra câu trả lời (và định dạng bắt buộc cho điều đó) là gì?
14mRh4X0r

Câu trả lời:


3

GolfScript, 30 ký tự

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

Lấy đầu vào từ stdin. Ví dụ ( kiểm tra trực tuyến ):

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

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

3

Con trăn - 58 66 ký tự

Sooo ... lần thử Code Golf đầu tiên của tôi ...

Mã số:

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

Đầu ra:

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

Biến:

  • i - chuỗi đầu vào
  • p - mẫu
  • o- đầu ra - loại bỏ

Phụ thuộc:

reMô-đun Python

Mã đầy đủ:

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

Chỉnh sửa:

  • Đã thêm vào import regiải pháp
  • Thay thế o=bằng in
  • r'[/\S/g]'đã được đổi thành r'\S' (cảm ơn @ 14mRh4X0r)

Chào mừng bạn đến với PPCG! Đây chủ yếu là một câu trả lời hay, vì vậy xin vui lòng đừng xem phần còn lại của bài đăng này: Có một vài điều sai với nó. Bạn đã liệt kê remô-đun như một phần phụ thuộc, nhưng vẫn cần đưa nó vào câu trả lời và điểm số. Chương trình của bạn cũng không đưa ra kết quả như mong muốn (tuy nhiên, vì bạn không thực sự sử dụng obiến cho bất cứ điều gì, bạn chỉ có thể s/o=/print/và chỉ mất ba). Khác hơn thế, điều này có vẻ tốt!
ngầmmonorail

1
Thật ra, có một thứ rất nhỏ khác. iBiến của bạn chứa | v | * * * * * * *thay vì đầu vào kiểm tra thực tế (bao gồm các dòng mới). Điều đó đang được nói, chương trình của bạn vẫn hoạt động nếu bạn bao gồm các dòng mới, vì vậy chương trình của bạn hoàn toàn không phải thay đổi, chỉ là bài đăng. :)
ngầmmonorail

1
Xin chào @undergroundmonorail - cảm ơn bạn đã phản hồi :) Tôi sẽ cập nhật bài viết của mình ngay bây giờ
martynas

1
Không vấn đề gì. Ngoài ra, tôi chưa từng thử nghiệm điều này, nhưng 14mRh4X0r từ trò chuyện nói rằng r'[/\S/g]'có thể thay thế r'\S'để lưu một vài ký tự.
ngầmmonorail

1
@undergroundmonorail và anh ấy đúng :) cảm ơn
martynas

2

Ruby 2.0, 53 ký tự

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

Không chắc chắn về các định dạng đầu vào / đầu ra chính xác cần thiết. Điều này nhận đầu vào trên STDIN và định dạng đầu ra như vậy:

Đầu vào:

|  v  |
* * * *
 * * *

Đầu ra:

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

2

JavaScript (ECMASCript 6) - 51 ký tự

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

Giả sử biến Achứa đầu vào ASCII đa dòng. Để lấy nó từ người dùng, sau đó thay thế Abằng prompt()(+7 ký tự) hoặc dưới dạng hàm (một lần nữa là GMT ký tự):

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

Đầu ra là vào bàn điều khiển.

Kiểm tra:

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

Đầu ra:

["*  *  *
* * * *
 * * *", 7, 10]

1

PHP ≥ 5,5, 84 69 63 byte

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

Không có nhiều điều để nói về điều này. Vì không có thông số kỹ thuật nào về cách xử lý đầu vào / đầu ra, tôi giả sử lưu trữ biến. Yêu cầu đầu vào trong biến $svà lưu trữ mảng trong biến $a. Quá xấu những tên chức năng quá dài.


1

Nổi loạn, 84

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

Đặt tthành văn bản như vậy ....

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

và điều này sẽ trở lại ...

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

Phiên bản Ungolfed với một số ghi chú:

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

1

Groovy: 96 92 ký tự

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

Sử dụng Groovy 2.2.1

Đọc từ STDIN. IMHO, không đặc biệt thông minh, nhưng khá dễ đọc (với sự ngắn gọn của nó)


0

Trong JavaScript / CoffeeScript - 66 ký tự

Giống như ví dụ PHP, độ dài là do độ dài của các tên hàm

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

Cách sử dụng ví dụ (CoffeeScript):

((x="|  v  |\n* * * *\n * * *")->[x.replace(/\S/g,'*'),x.split('*').length-1,x.match(/\S/g).length])()

1
3-char ngắn hơn:[x.replace(r=/\S/g,s='*'),x.split(s).length-1,x.match(r).length]
Michael M.

0

C # - 116

Cách ngắn nhất tôi có thể nghĩ về điều đó trả về một mảng ..

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

0

Perl, 52 byte

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

Đưa đầu vào từ đầu vào tiêu chuẩn, in ra đầu ra tiêu chuẩn.

Giả sử định dạng đầu ra như bạn mô tả trong câu hỏi của bạn, có thể được thực hiện ngắn hơn một chút nếu định dạng đầu ra khác được cho phép.


0

Javascript - 50 ký tự

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

Kiểm tra

Đầu vào

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(':')

Đầu ra

["****** * ***** * **** ****** *****", "******** ***** *** ****** **** ** ***** **", "*** ***** * ***** * **** ******* ****"]

Điều này không thực sự đáp ứng các đặc điểm kỹ thuật. Nhìn vào đây để xem một ví dụ.
tomsmeding

0

AWK, (quá dài)

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

Tôi không có awkchủ nên tôi chắc chắn nó có thể được cải thiện. Việc mua là tôi đã vui vẻ viết nó! Cuộc đấu tranh đi kèm với cách bảo quản newlinesđầu vào nhưng không đặt , 7,10]trên một dòng mới. Đó là một chút logic ( NR>1{z=z "\n" $0} NR==1{z=z $0}) tiêu tốn của tôi rất nhiều nhân vật. Tôi muốn thấy bất kỳ awkcách tiếp cận nào khác trên mặt trận đó.

Tôi đã không cung cấp tệp ở cuối tập lệnh, nhưng rõ ràng cách sử dụng sẽ là awk '{<code>}' ascii.txtnơi ascii.txtchứa "đầu vào" nhiều dòng.

Đầu ra

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

0

Java, 199 byte

Chơi gôn

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

Chưa chơi gôn:

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

Chạy trực tuyến .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.