Wir werden Sterne zählen

8

Ihr Ziel ist es, mehrzeilige ASCII-ähnliche zu verwenden

|  v  |
* * * *
 * * *

und ein Array haben, das alles enthält, was kein Stern ist, der in einen Stern geändert wurde (außer Leerzeichen mit beliebiger Breite), sowie die Anzahl der darin enthaltenen Sterne und die Anzahl der Sterne, die es jetzt enthält. Die Ausgabe meines Beispiels wäre also:

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

oder

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

abhängig davon, was Ihre Codesprache tut.

Dies ist eine Herausforderung, also gewinnen die kürzesten Bytes!

Cilan
quelle
4
Können Sie bitte die Eingabe- und Ausgabeformate erläutern? Welche Form sollte der Code haben (Programm, Funktion)?
Heiko Oberdiek
1
@ HeikoOberdiek Oh ja. Es kann beides sein, je nachdem, was für Sie kürzer ist.
Cilan
1
@TheWobbuffet Was ist mit Eingabe- / Ausgabeformaten? Kann es nur eine Funktion sein, die ein Argument akzeptiert und beispielsweise ein Array zurückgibt? Oder muss die Antwort ausgedruckt werden (und welches Format wäre dafür erforderlich)?
14mRh4X0r

Antworten:

3

GolfScript, 30 Zeichen

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

Nimmt die Eingabe von stdin. Beispiel ( online testen ):

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

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

Python - 58 66 Zeichen

Sooo ... mein erster Code Golf Versuch ...

Code:

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

Ausgabe:

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

Variablen:

  • i - Eingabezeichenfolge
  • p - Muster
  • o- Ausgabe - entfernt

Abhängigkeiten:

Python - reModul

Vollständiger Code:

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

Bearbeitungen:

  • import reZur Lösung hinzugefügt
  • Durch o=Druck ersetzt
  • r'[/\S/g]'wurde geändert in r'\S' (danke @ 14mRh4X0r)
Martynas
quelle
Hey, willkommen bei PPCG! Dies ist meistens eine gute Antwort. Bitte nehmen Sie den Rest dieses Beitrags nicht persönlich: Es gibt ein paar Dinge, die daran falsch sind. Sie haben das reModul als Abhängigkeit aufgeführt, es ist jedoch weiterhin erforderlich, es in die Antwort und die Bewertung aufzunehmen. Ihr Programm gibt das Ergebnis auch nicht so aus, wie es soll (da Sie die oVariable jedoch für nichts verwenden, können Sie s/o=/print/nur drei verlieren). Davon abgesehen sieht das gut aus!
U-Bahn:
1
Eigentlich gibt es noch eine winzige andere Sache. Ihre iVariable enthält | v | * * * * * * *anstelle der eigentlichen Testeingabe (einschließlich Zeilenumbrüche). Davon abgesehen funktioniert Ihr Programm immer noch, wenn Sie die Zeilenumbrüche einfügen, sodass Ihr Programm überhaupt nicht geändert werden muss, sondern nur der Beitrag. :)
U-Bahn:
1
Hallo @undergroundmonorail - danke für das Feedback :) Ich werde meinen Beitrag jetzt aktualisieren
martynas
1
Kein Problem. Außerdem habe ich das überhaupt nicht getestet, aber 14mRh4X0r aus dem Chat sagt, dass r'[/\S/g]'dies durch ersetzt werden könnte r'\S', um ein paar Zeichen zu speichern.
U-Bahn:
1
@undergroundmonorail und er hat recht :) danke
martynas
2

Ruby 2.0, 53 Zeichen

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

Ich bin mir nicht sicher, welche genauen Eingabe- / Ausgabeformate erforderlich sind. Dies nimmt Eingaben in STDIN entgegen und formatiert die Ausgabe wie folgt:

Eingang:

|  v  |
* * * *
 * * *

Ausgabe:

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

JavaScript (ECMASCript 6) - 51 Zeichen

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

Angenommen, die Variable Aenthält den mehrzeiligen ASCII-Eingang. Um es dem Benutzer abzunehmen, ersetzen Sie es Adurch prompt()(+7 Zeichen) oder als Funktion (erneut +7 Zeichen):

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

Die Ausgabe erfolgt an die Konsole.

Prüfung:

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

Ausgänge:

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

PHP ≥ 5,5, 84 69 63 Bytes

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

Dazu gibt es nicht viel zu sagen. Da es keine Spezifikation für den Umgang mit Eingabe / Ausgabe gibt, gehe ich von variablem Speicher aus. Erwartet die Eingabe in Variable $sund speichert das Array in Variable $a. Schade, dass diese Funktionsnamen so lang sind.

Martin Ender
quelle
1

Rebol, 84

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

Stellen Sie tden Text so ein ....

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

und das würde zurückkehren ...

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

Ungolfed Version mit einigen Anmerkungen:

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
quelle
1

Groovy: 96 92 Zeichen

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

Verwendet Groovy 2.2.1

Liest von STDIN. IMHO, nicht besonders klug, aber ziemlich leicht zu lesen (aufgrund seiner Kürze)

Michael Ostern
quelle
0

In JavaScript / CoffeeScript - 66 Zeichen

Wie im PHP-Beispiel ist die Länge auf die Länge der Funktionsnamen zurückzuführen

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

Beispiel für die Verwendung (CoffeeScript):

((x="|  v  |\n* * * *\n * * *")->[x.replace(/\S/g,'*'),x.split('*').length-1,x.match(/\S/g).length])()
Zachary Boyd
quelle
1
3 Zeichen kürzer:[x.replace(r=/\S/g,s='*'),x.split(s).length-1,x.match(r).length]
Michael M.
0

C # - 116

Der kürzeste Weg, den ich mir vorstellen kann, gibt ein Array zurück.

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

Perl, 52 Bytes

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

Übernimmt Eingaben von der Standardeingabe und druckt auf die Standardausgabe.

Angenommen, das Ausgabeformat, wie Sie es in Ihrer Frage beschrieben haben, könnte erheblich verkürzt werden, wenn ein anderes Ausgabeformat zulässig wäre.

14mRh4X0r
quelle
0

Javascript - 50 Zeichen

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

Prüfung

Eingang

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

Ausgabe

["****** * ***** * **** ****** *****", "******** ***** *** ****** **** ** ***** **", "*** ***** * ***** * **** ******* ****"]
Spedwards
quelle
Dies entspricht nicht wirklich der Spezifikation. Schauen Sie hier für ein Beispiel.
Tomsmeding
0

AWK, (zu lang)

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

Ich bin kein awkMeister, also bin ich sicher, dass es verbessert werden kann. Zum Mitnehmen hatte ich Spaß beim Schreiben! Der Kampf kam mit der Frage, wie man newlinesdie Eingaben bewahrt, aber nicht , 7,10]auf eine neue Linie bringt. Dieses bisschen Logik ( NR>1{z=z "\n" $0} NR==1{z=z $0}) hat mich viele Charaktere gekostet. Es würde mich interessieren, andere awkAnsätze an dieser Front zu sehen.

Ich habe die Datei am Ende des Skripts nicht angegeben, aber offensichtlich wäre die Verwendung awk '{<code>}' ascii.txt, wo ascii.txtdie mehrzeilige "Eingabe" enthalten ist.

Ausgabe

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

Java, 199 Bytes

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

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

Online ausführen .

Hopper Hunter
quelle