星を数えます


8

あなたの目的は、マルチラインASCIIを

|  v  |
* * * *
 * * *

そして、スター以外のすべてのもの([any-width]のスペースを除く)と、含まれているスターの数と現在含まれているスターの数を含む配列があります。したがって、私の例の出力は次のようになります。

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

または

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

コード言語が何をするかに応じて。

これは挑戦なので、最短バイトが勝ちます!


4
入力と出力の形式を明確にできますか?コードに必要な形式(プログラム、関数)
— Heiko Oberdiek、2014年

1
@HeikoOberdiekああ、そうです。どちらでもかまいません。
— Cilan 2014年

1
@TheWobbuffet入力/出力フォーマットはどうですか?たとえば、引数を取って配列を返す関数だけにすることはできますか?それとも答えを印刷する必要がありますか(そしてそのために必要な形式は何でしょうか)?
— 14mRh4X0r 2014年

回答:



3

Python- 58 66文字

すごい...私の最初のコードゴルフの試み...

コード:

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

出力:

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

変数:

  • i -入力文字列
  • p -パターン
  • o-出力- 削除

依存関係:

Python reモジュール

完全なコード:

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

編集:

  • import reソリューションに追加
  • o=プリントに置き換え
  • r'[/\S/g]'に変更されましたr'\S' (thanks @ 14mRh4X0r)

PPCGへようこそ!これは主に良い答えなので、この投稿の残りの部分を個人的に取り上げないでください。いくつかの問題点があります。reモジュールを依存関係としてリストしましたが、それでも回答とスコアに含める必要があります。また、プログラムは想定どおりの結果を出力しません(ただし、実際にoは何も変数を使用しないため、s/o=/print/3つだけ失う可能性があります)。それ以外は、よさそうです!
— 地下

1
実際には、他に小さなことが1つあります。あなたのi変数が含まれている| v | * * * * * * *(改行を含む)の代わりに、実際のテスト入力の。そうは言っても、改行を含めてもプログラムは機能するので、プログラムを変更する必要はなく、投稿だけです。:)
— 地下

1
こんにちは@undergroundmonorail-フィードバックに感謝します:)私は今私の投稿を更新します
— マーティナス

1
問題ない。また、私はこれをまったくテストしていませんが、チャットの14mRh4X0rは、いくつかの文字を節約するためにr'[/\S/g]'置き換えることができると言っていr'\S'ます。
— 地下

1
@undergroundmonorailと彼は正しい:)ありがとう
— マルティナス

2

Ruby 2.0、53文字

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

必要な正確な入力/出力形式がわからない。これはSTDINの入力を受け取り、次のように出力をフォーマットします。

入力:

|  v  |
* * * *
 * * *

出力:

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

2

JavaScript(ECMASCript 6)-51文字

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

変数Aに複数行のASCII入力が含まれていると想定します。これをユーザーから取得するには、Aをprompt()(+7文字)または関数として(ここでも+7文字)に置き換えます。

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

出力はコンソールです。

テスト:

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

出力:

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

1

PHP≥5.5、84の 69 63バイト

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

これについて言うことは多くありません。入力/出力の処理方法の仕様がないため、変数ストレージを想定しています。入力が変数である$sと想定し、配列を変数に格納します$a。それらの関数名が長すぎるのは残念です。


1

Rebol、84

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

tそのようにテキストに設定します...

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

そしてこれは戻るでしょう...

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

いくつかのメモ付きの非ゴルフバージョン:

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文字

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

Groovy 2.2.1を使用

STDINから読み取ります。私見、特に賢いわけではありませんが、かなり読みやすいです(簡潔さを考えると)


0

JavaScript / CoffeeScriptの場合-66文字

PHPの例と同様に、長さは関数名の長さによるものです。

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

使用例(CoffeeScript):

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

1
3文字短く:[x.replace(r=/\S/g,s='*'),x.split(s).length-1,x.match(r).length]
— Michael M.

0

C#-116

私が考えることができる最も短い方法は、配列を返します。

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バイト

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

標準入力から入力を受け取り、標準出力に出力します。

質問で説明したような出力形式を想定すると、別の出力形式が許可される場合は、かなり短くすることができます。


0

JavaScript-50文字

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

テスト

入力

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

出力

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

これは実際には仕様を満たしていません。例については、こちらをご覧ください。
— tomsmeding 2014年

0

AWK、(長すぎる)

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

私はawkマスターではないので、改善できると確信しています。テイクアウトは書いて楽しかったです!newlines入力からのを保持するが, 7,10]、新しい行に配置しない方法に苦労しました。その論理のビット(NR>1{z=z "\n" $0} NR==1{z=z $0})は私に多くの文字を費やしました。awkその前に他のアプローチがあるかどうか興味があります。

スクリプトの最後にファイルを提供しませんでしたが、明らかに使用方法は awk '{<code>}' ascii.txtでありascii.txt、マルチラインの「入力」が含まれています。

出力

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

0

Java、199バイト

ゴルフ:

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

ゴルフなし:

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

オンラインで実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.