Diese Herausforderung ist NinjaBearMonkeys Preis für den Gewinn meiner Block Building Bot Flocks! Herausforderung mit dem Black Knight Submission. Glückwunsch NinjaBearMonkey!
Die Herausforderung ist hier relativ einfach, es gibt jedoch eine Vielzahl möglicher Ansätze. Die Geschichte besagt, dass es in der Welt der isometrischen Illusionen 6 verschiedene Arten von Kreaturen gibt:
- Ninjas, abgekürzt
N
- Bären, abgekürzt
B
- Affen, abgekürzt
M
- NinjaBears, abgekürzt
NB
- BearMonkeys, abgekürzt
BM
- NinjaBearMonkeys, abgekürzt
NBM
( NinjaBearMonkey ist natürlich der letzte, mächtigste Typ.)
Ihre Aufgabe ist es, eine Zählung dieser Kreaturen durchzuführen, wenn sie nebeneinander aufgereiht sind, dh wenn ihre Abkürzungszeichenfolgen verkettet sind. Die Einschränkung ist, dass Sie darauf achten müssen, die Teile einiger Kreaturen nicht als separate Kreaturen zu überzählen, die zufällig ähnlich aussehen. Die Kreaturen richten sich so aus, dass:
- Jede Instanz von
NBM
ist 1 NinjaBearMonkey und 0 andere Kreaturen. - Jede Instanz von
NB
nicht gefolgt vonM
ist 1 NinjaBear und 0 andere Kreaturen. - Jede Instanz von, der
BM
keine vorangestelltN
ist, ist 1 BearMonkey und 0 andere Kreaturen. - Andernfalls sind Instanzen von
N
,B
undM
einzelne Ninjas, Bären bzw. Affen.
Die Zeile wird von links nach rechts gelesen.
So gibt es zum Beispiel in der Reihe der Kreaturen NBMMBNBNBM
0 Ninjas, 1 Bär, 1 Affe, 1 NinjaBär, 0 BearMonkeys und 2 NinjaBearMonkeys.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion , die in einer Reihe von Zeichen nimmt N
, B
und M
, und druckt oder gibt , wie viele von jedem der sechs Arten von Lebewesen in ihm vorhanden sind.
Die Ausgabe sollte die Form haben
#N #B #M #NB #BM #NBM
wobei die jeweilige Kreaturenzahl jedes #
Zeichen ersetzt. Alle 6 Zählungen müssen durch Leerzeichen getrennt angezeigt werden, auch wenn sie 0 sind. Sie können jedoch in beliebiger Reihenfolge angegeben werden (z. B. #NBM
können sie an erster Stelle stehen).
Ebenfalls:
- Die Eingabezeichenfolge enthält nur die Zeichen
N
,B
undM
. - Wenn die leere Zeichenfolge eingegeben wird, sind alle Zählwerte 0.
- Die Ausgabe kann optional ein einzelnes führendes und / oder nachfolgendes Leerzeichen und / oder eine einzelne nachfolgende Newline enthalten.
Die kürzeste Übermittlung in Bytes gewinnt.
Beispiele
Eingabe: NB
Ausgabe:0N 0B 0M 1NB 0BM 0NBM
Eingabe: NBM
Ausgabe:0N 0B 0M 0NB 0BM 1NBM
Eingabe: NBMMBNBNBM
(Beispiel von oben)
Ausgabe:0N 1B 1M 1NB 0BM 2NBM
Eingabe: MBNNBBMNBM
Ausgabe:1N 1B 1M 1NB 1BM 1NBM
Eingabe: NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
Ausgabe:17N 6B 14M 5NB 8BM 3NBM
NBMNBM
wäre eine völlig gültige Eingabe. Beim Lesen von links nach rechts gibt es eindeutig 2 NinjaBearMonkeys.Antworten:
Pyth, 22 Bytes
Ein ziemlich hackiger Weg, um 1 Byte zu sparen, dank @Jakube.
Pyth, 23 Bytes
Demonstration.
Druckt in umgekehrter Reihenfolge mit einem Leerzeichen und ohne Zeilenumbruch.
.:"NBM")
Sind alle Teilzeichenfolgen vorhanden, werden_
sie in die richtige Reihenfolge gebracht,/zN
Vorkommen gezählt und=:zNd
an Ort und Stelle durch ein Leerzeichen ersetzt.quelle
JavaScript ES6, 86 Byte
(Ich musste das nur beantworten.) Es durchläuft jeden Teilstring von
NBM
, beginnend mit den längeren, die eine höhere Priorität haben. Es sucht nach jedem Vorkommen dieser bestimmten Zeichenfolge und entfernt sie (in diesem Fall wird sie durch die aktuelle Anzahl ersetzt, damit sie nicht erneut abgeglichen wird). Schließlich wird jede Teilzeichenfolge durch die Anzahl + die Zeichenfolge ersetzt.Dieses Stack-Snippet ist in der ES5-Entsprechung des obigen Codes geschrieben, um das Testen in jedem Browser zu vereinfachen. Es ist auch etwas ungolfed Code. Die Benutzeroberfläche wird bei jedem Tastendruck aktualisiert.
quelle
'NBM<newline>BM<newline>...<newline>N'.replace(/./g, ...)'
, in dem das<newline>
s wörtliche Zeilenumbrüche und das'
s Backticks sind und eine ES6-Vorlagenzeichenfolge bilden? Speichert zwei Bytes im.
regulären Ausdruck ( entspricht nicht den Zeilenumbrüchen).Python 2, 78
Eine Variante der Antwort von Vioz . Spaß mit Python 2-Zeichenfolgendarstellungen!
Zählt Vorkommen des Teilstrings indirekt, indem es aufgeteilt, die Teile gezählt und 1 subtrahiert wird. Anstatt die Teilstrings durch ein Füllersymbol zu ersetzen, wird der String durch die
split
erzeugte Liste ersetzt . Wenn wir dann die Zeichenfolgendarstellung nehmen, werden die Teile durch Leerzeichen und Kommas getrennt.quelle
Ruby,
166807268 ZeichenErläuterung:
Die Zählung erfolgt in umgekehrter Reihenfolge. Dies liegt daran, dass die längeren Ninjas, Bären und Affen Vorrang vor den kürzeren haben.
Für
NBM
,BM
undNB
sind die Sequenzengsub!
außerhalb des ursprünglichen Strings mit einem Block versehen, um zu zählen, wie viele dieser Sequenzen existieren (ja, die Funktion ändert ihr Argument).BNBMM
würde als gezählt wirdNBM
undBM
stattB
,NBM
undM
(weil , wenn dasNBM
entfernt werden würde, wäre es das setzenB
undM
zusammen , und es gäbe keine Möglichkeit , sie zu unterscheiden). Ursprünglich habe ich eine einzelne Zeichenfolge (.gsub!('NBM'){c+=1;?|}
) zurückgegeben, aber ich habe festgestellt, dass ich nur das Ergebnis der zurückgeben kann+=
(das ist eine Zahl, von der es also keine geben kannN
B
M
).FürJetzt ist es eine Schleife (ich weiß nicht, warum ich das überhaupt nicht gedacht habe), also werden diese auf die gleiche Weise durchgeführt.M
,,B
undN
kann ich nurcount
wie viele von ihnen in der Zeichenfolge sind (keine Notwendigkeit, sie über zu entfernengsub!
).Ähnliche Lösung in Strauß ,
5451 Zeichen :Leider keine gültige Lösung, da es in der aktuellen Ostrich-Version einen Fehler gibt (der jetzt behoben ist, aber nachdem diese Challenge gepostet wurde).
quelle
%w(NBM BM NB M B N)
und die Teilung entfernen.Java,
166,162Und mit ein paar Zeilenumbrüchen:
Es funktioniert ziemlich einfach. Führen Sie einfach eine Schleife über die Token, ersetzen Sie sie durch Punkte und zählen Sie, solange die Eingabe einige enthält. Zählt zuerst die Großen, damit die Kleinen es nicht vermasseln.
Ich habe ursprünglich versucht, alles auf einmal zu ersetzen und den Längenunterschied zu zählen, aber es hat ein paar Zeichen mehr gedauert :(
quelle
println
Aussage allein ist größer als das. Ich bin aber zufrieden damit: DString q[]=
String[]q=
CJam,
363231 BytesVielen Dank an @Optimizer für das Golfen ab 1 Byte.
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
N*
->`
sollte reichenR
153134118Das wurde sehr schnell länger, aber hoffentlich kann ich mich ein paar mal rasieren. Der Eingang ist STDIN und der Ausgang ist STDOUT.
Bearbeiten Kehrtwende. Hab die gespaltene Saite losgeworden und Teile gezählt. Jetzt ersetze ich die Teile durch einen String, der kürzer ist als der Teil. Die Differenz zwischen den Stringlängen wird für die Ausgabe gesammelt.
Erläuterung
Testlauf
quelle
Pyth, 19 Bytes
Dies ist eine Mischung aus @ isaacgs Pyth-Lösung und @ xnors unglaublichem Python-Trick.
Probieren Sie es online aus: Vorführ- oder Testgeschirr
Erläuterung
quelle
Julia,
10697 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe verwendet und das Ergebnis mit einem einzelnen nachgestellten Leerzeichen und ohne nachgestellte Zeilenumbrüche an STDOUT ausgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=b->...
.Ungolfed + Erklärung:
Beispiele:
quelle
Python 2,
93888984 BytesEinfacher Ansatz.
Rufen Sie wie folgt an:
Die Ausgabe ist wie folgt:
quelle
in
.SAS,
144 142 139129Verwendung (7 Bytes für sysparm hinzugefügt):
oder
Verwendung:
Ergebnis:
quelle
cats('s/',z,'/x/')
anstelle von speichern's/'||strip(z)||'/x/'
.macro a i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%
data;i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;
. Da Sie bereits von lesensysparm
, können Sie es auch einfach als Datenschritt ausführen. Und wenn Sie im Stapelbetrieb arbeiten, brauchen Sie nichtrun;
.%macro a(i);i="&i";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%mend;
PHP4.1, 92 Bytes
Nicht die kürzeste, aber was würden Sie sonst noch von PHP erwarten?
Um es zu benutzen, lege einen Schlüssel auf ein COOKIE, POST, GET, SESSION ...
Der Ansatz ist grundlegend:
Einfach richtig?
quelle
JavaScript,
108116 BytesNur ein direkter Ansatz, nichts Besonderes
quelle
All 6 counts must be shown, separated by spaces, even when they are 0.
. Testfall:N
Perl, 46
quelle
SpecBAS - 164
Verwendet den gleichen Ansatz wie viele andere. Zeile 4 durchläuft weiterhin die Zeichenfolge (von der größten zuerst) und ersetzt sie, wenn sie gefunden wird.
SpecBAS hat einige nette Details über Original ZX / Sinclair BASIC (Listen durchlaufen, Zeichen finden), die ich noch herausfinde.
quelle
C
205186184 BytesEin etwas anderer Ansatz basiert auf der Zustandsmaschine. Wo
t
ist der Staat?Erweitert
Testfunktion
quelle
for(;;*s++){...}
stattdessendo{...}while(*s++);
einige Bytes speichern? Außerdem benötigen Sie das Zeilenumbruchzeichen in derprintf
.for(;*s;s++)
. Aber ich musste mit dem letzten Nullzeichen eine Schleife machen. Guter Aufruf zum Speichern der\n
, was nicht erforderlich ist.C 146
quelle
Haskell - 177 Bytes (ohne Importe)
(Entschuldigung für die Internet-Nekromantie hier.)
Auf der Haskell-Plattform gibt es keine Zeichenfolgensuche ohne Import, und ich wollte die Tatsache demonstrieren und ausnutzen, dass die gesuchten Zeichenfolgen alle Teilzeichenfolgen einer Zeichenfolge sind (ohne Wiederholungen) folge einander, was
f
hier der Fall ist.Ich brauche am
l
Ende noch die vollständige Liste , um die Gleichheit zu überprüfen und genau wie erforderlich anzuzeigen, hätte aber nicht die Herausforderung bestanden, nur die Anzahl der möglichen Vorkommenwords
in beliebiger Reihenfolge zu melden .quelle
Bash - 101
Übergeben Sie die Zeichenfolge als erstes Argument.
Ein bisschen erklärt:
quelle
RS , 275 Bytes
Live-Demo und Tests.
Die Arbeitsweise ist einfach, aber ein bisschen seltsam:
Dies verwendet kreativ Gruppen, um Eingaben wie folgt umzuwandeln:
in
Die nächste Zeile:
Dadurch werden die Folgen von Großbuchstaben durch Unterstriche ersetzt.
Hiermit wird einfach ein Nummernzeichen am Zeilenanfang eingefügt.
Dies ist der erste coole Teil. Grundsätzlich werden die Folgen von Kleinbuchstaben und Unterstrichen in Großbuchstaben umgewandelt, gruppiert und vor dem eingegebenen Pfund platziert. Das Pfund dient dazu, die bereits verarbeiteten Sequenzen zu verwalten.
Das Pfund wird am Zeilenanfang neu eingefügt.
Die Großbuchstaben werden durch ihre Textäquivalente mit den zugehörigen Zählungen ersetzt. Aufgrund eines Fehlers in rs (ich wollte nicht riskieren, ihn zu reparieren und disqualifiziert zu werden) werden die leeren Sequenzen in konvertiert
(^^)
, die in der vorletzten Zeile durch eine 0 ersetzt werden. Die allerletzte Zeile entfernt einfach das Pfund.quelle
KDB (Q), 76 Bytes
Erläuterung
Prüfung
quelle
Haskell: 244 Bytes
quelle
p
unds
nur einmal, daher ist es nicht erforderlich, ihm einen Namen zu geben (->a#[]=[]:a#"NBM"
, dasselbe fürp
). Übrigens:words"N B M NB BM NBM"
Anstelle der Liste der Zeichenfolgen werden zusätzliche Bytes gespeichert. Dasimport
ist nur fürintercalate
, es ist kürzer, um es neu zu implementieren:...putStrLn.tail.((' ':)=<<)$map...
und das loszuwerdenimport
. Setzen Sie die alle Wachen|
in der Definition von#
in einer einzigen Zeile und verwenden Sie1<2
anstelle vonTrue
:...#(b:m)|a==b=...l#m|1<2=[]...
...?
kann kürzer mit einer Liste Verständnis definiert werden:c?t=sum[1|x<-c,x==t]
. Auch hier verwenden Sie?
nur einmal, also direkt den Körper zu benutzen...show(sum[1|x<-l#[],x==t])
.