Herausforderung
Schreiben Sie ein Programm, das bei einer Zeichenfolge mit einer x
Länge von 10 Zeichen und einem Zeichen die y
Häufigkeit ausgibt, mit der Zeichen y
in Zeichenfolgen vorkommen x
.
Das kürzeste Programm in Bytes gewinnt.
Beispiel
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
Antworten:
Pyth, 3 Bytes
Beispiellauf:
Natürlich kann der Benutzer bei der ersten Eingabe mehr oder weniger als 10 Buchstaben eingeben, aber wir müssen uns keine Gedanken darüber machen, was passiert, wenn der Benutzer die Spezifikation verletzt.
quelle
/
zählt nur die Anzahl der Vorkommen in der ersten Eingabezeichenfolge der zweiten Eingabezeichenfolge.w
nimmt eine Eingabezeile.Pyth - 3 Bytes
Eine andere, weniger offensichtliche Pyth-Antwort derselben Größe. Es klappt über die Eingabe zu zählen.
Test Suite .
quelle
JavaScript, 32
quelle
Bash, 24 Zeichen
Probelauf:
quelle
Retina , 12 Bytes
Einfach ein regulärer Ausdruck, der einem Zeichen entspricht, das dem letzten Zeichen in der Eingabe entspricht (außer sich selbst). Bei einem einzelnen regulären Ausdruck gibt Retina einfach die Anzahl der Übereinstimmungen zurück.
quelle
Labyrinth ,
32292724 BytesDies liest zuerst das einzelne Zeichen, gefolgt von der Zeichenfolge, in der gezählt werden soll, und geht davon aus, dass die Zeichenfolge keine Nullbytes enthält.
Erläuterung
Der Code beginnt mit
),}
: Er setzt den unteren Rand des Stapels auf1
, liest das erste Zeichen und verschiebt es zur zukünftigen Verwendung in den Zusatzstapel. Das1
wird unser Zähler sein (der Versatz von 1 wird später abgebrochen und ist notwendig für die IP der erforderlichen Umdrehungen zu nehmen).Die IP bewegt sich jetzt nach unten, um das erste Zeichen der Suchzeichenfolge mit zu lesen
,
. Der Wert wird mit negiert`
, um wieder das richtige Drehverhalten zu erhalten. Während wir Zeichen aus STDIN lesen, folgt die IP nun dieser Schleife:{:}
erstellt eine Kopie des gespeicherten Zeichencodes und+
fügt ihn dem aktuellen Wert hinzu. Wenn das Ergebnis ist0
(dh das aktuelle Zeichen ist das, nach dem wir suchen), bewegt sich die IP geradeaus: Entfernt-
einfach das0
,)
erhöht den Zähler,{}
ist ein No-Op.Wenn das Ergebnis danach
+
jedoch ungleich Null ist, möchten wir das aktuelle Zeichen nicht zählen. Die IP biegt also stattdessen nach rechts ab. Das ist eine Sackgasse, so dass dort Code zweimal ausgeführt wird, einmal vorwärts und einmal rückwärts. Das heißt, der tatsächliche Code wird in diesem Fall);___;)+-){}
. beseitigt nur die);
Differenz ungleich Null,___
drückt 3 Nullen,;
verwirft aber eine von ihnen.)
Inkrementiert eine der beiden verbleibenden zwei Nullen,+
addiert sie zu einer einzelnen1
,-
subtrahiert sie vom Zähler und)
inkrementiert den Zähler. Mit anderen Worten, wir haben ein sehr aufwändiges No-Op erstellt.Wenn wir EOF drücken,
,
drückt das-1
, und die IP`
biegt nach1
rechts ab.-
subtrahiert den1
vom Zähler (Aufheben des Anfangsoffsets).!
druckt den Zähler aus und@
beendet das Programm.quelle
Python 3, 29 Bytes
Meh, das war einfach. Angenommen, es handelt sich bei der Eingabe um eine Zeichenfolge mit zehn Buchstaben.
quelle
f=lambda x,y:x.count(y)
kürzer sein? (Sorry, wenn dies nicht funktioniert, ich bin auf dem Handy und kann nicht überprüfen)print input().count(input())
odera,b=input();print a.count(b)
denselben BetragSchneemann 1.0.2 , 16 Zeichen
Überraschend kurz. Erläuterung:
quelle
C ++ Template-Metaprogrammierung,
160154116 BytesNur für das Kichern.
Danke an Ex-Bart fürs Golfen!
Verwendung: Das erste Zeichen in der Template-Instanz ist das zu durchsuchende Zeichen.
Ergänzen Sie mit clang -std = c ++ 11 -c -> das Ergebnis steht am Anfang der Fehlermeldung.
Kompilieren Sie mit gcc -std = c ++ 11 -c -> das Ergebnis steht am Ende der Fehlermeldung.
Suchen Sie nach A < 3 , 't', '\ 000'> und A < 3 , 't', '\ x00'>
154-Byte-Version
160-Byte-Version:
quelle
((x==y)?1:0)
auf nur verkürzen ,(x==y)
um etwa 6 Bytes zu sparen (glaube ich).bool
zurint
Konvertierung sagte .enum
stattstatic const
. Verwenden Sie0
statt'\0'
zu beenden. Verwenden Sieint
anstelle vonchar
. Verwenden Sie zum Instanziieren eine etwas andere Deklaration. Superflouos Newline entfernen.template<int w,int x,int y,int...s>class A{enum{a=A<w+(x==y),x,s...>::a};};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;
. Überprüft mit g ++ und clang.Bash + grep, 26 Bytes
quelle
Javascript (ES6), 26 Byte
Diese schnelle und einfache Lösung definiert eine anonyme Funktion. Fügen Sie dazu am Anfang eine Variablendeklaration hinzu. Versuch es:
Code-Snippet anzeigen
EDIT: Oh, ich sehe, es gibt bereits eine sehr ähnliche Lösung. Ich hoffe das ist ok
quelle
Haskell, 21 Bytes
quelle
C ++, 78 Bytes
Rufen Sie wie folgt an:
quelle
Element , 23 Bytes
Die Newline ist Teil des Programms. Ich benutze es tatsächlich als Variablenname .
In diesem Programm wird das Zielzeichen in einer Variablen gespeichert, wobei die aktuelle Zeichenfolge oben im Stapel bleibt. Anschließend wird der Vorgang "Zerhacken, Vergleichen und Ergebnis darunter verschieben" in einer Schleife ausgeführt, wobei die Ergebnisse am Ende addiert werden.
Die neue Zeile als Variablenname stammt aus der Verwendung der neuen Zeile am Ende der Eingabe, indem sie abgeschnitten und darin gespeichert wird. Die neue Zeile im Code ist, wo ich daraus gelesen habe.
Die Eingabe ist wie folgt:
Die Ausgabe ist wie folgt
quelle
Julia,
2625 BytesDas
findin
Funktion gibt die Indizes im ersten Argument zurück, bei denen sich das zweite Argument als Vektor befindet. Die Länge des Vektors ist die Anzahl der Vorkommen.Dank Glen O. ein Byte gespart
quelle
endof
Sparen Sie ein Byte anstelle vonlength
.APL,
73 BytesDies schafft einen Funktionszug. Dabei wird ein Vektor aus Nullen und Einsen erstellt, der den Indizes entspricht, an denen das Zeichen in der Zeichenfolge (
⍷
) angezeigt wird . Der Vektor wird dann summiert (+/
).4 Bytes gespart dank kirbyfan64sos und NBZ!
quelle
+/⍷
(ich kenne APL nicht, also könnte ich mich irren).Perl,
2116 Zeichen(13 Zeichen Code + 3 Zeichen Befehlszeilenoption.)
Probelauf:
quelle
<>
!-l
, indem Sie Folgendesecho -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
perl -pe '$_+=s/${\<>}//g'
+=
nötig?=
scheint genauso gut zu funktionieren (und sollte immer noch funktionieren, wenn die Eingabe mit einigen Ziffern beginnt).PHP,
36-35BytesVerwendung:
Rufen Sie das Skript mit zwei Argumenten auf.
php script.php qwertzqwertz q
PHP, 23 Bytes
Wenn Sie globale Variablen registrieren (nur in PHP 5.3 und niedriger möglich), können Sie 12 Bytes einsparen (dank Martijn )
Verwendung:
Rufen Sie das Skript auf und deklarieren Sie globale Variablen
php script.php?a=qwertzqwertz&b=q
quelle
script.php?a=qwertzqwertz&b=q
und tun<?=substr_count($a,$b);
Dyalog APL , 3 Bytes
Dh "Die Summe der gleichen Bytes". Z.B:
oder nur
K schlägt diesmal APL nicht.
Probieren Sie es online aus.
quelle
T-SQL,
9940 BytesMacht einfach einen Unterschied zwischen der Eingabezeichenfolge und der Zeichenfolge, bei der das Zeichen entfernt ist. Übernimmt die Eingabe aus Tabelle t
Die Bearbeitung wurde geändert, um ein Problem beim Zählen von Leerzeichen zu entfernen und die aktuell akzeptablen Eingaben für SQL zu berücksichtigen. Vielen Dank an @BradC für alle Änderungen und Einsparungen
quelle
SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t
, sondern nurt
eine bereits ausgefüllte Eingabetabelle mit Felderns
undc
.A B C D
, die in Leerzeichen enden (wenn Sie aufgefordert werden, Leerzeichen zu zählen), daLEN
nachfolgende Leerzeichen ignoriert werden.space
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
Oktave / Matlab, 33 Bytes
quelle
J, 5 Bytes
Ich habe das Gefühl, dass J eine integrierte Funktion dafür hat, aber ich konnte keine finden - vielleicht kann mich einer der aktiven J-Benutzer aufklären. Dies gilt stattdessen zunächst für
=
die Eingaben und wandelt jedes Zeichen in ein Zeichen1
um, das dem angeforderten entspricht, oder in ein0
anderes. Dann+/
berechnet die Summe dieser Liste.quelle
Batch-Datei, 121 Bytes
Weil ich ein Masochist bin ...
Warnung: Es wird davon ausgegangen, dass
_
dies in der Eingabezeichenfolge nicht vorkommt. Wenn ja, dann die Variablee
entsprechend angepasst werden.Dies richtet unsere Zählervariable
c
und unsere Zeichenfolgenendeabgrenzung wie_
folgt ein, bevor diese an unsere Eingabezeichenfolge angehängt%1
und die verkettete Zeichenfolge auf festgelegt wirdt
. Dann geben wir eine Schleife ein:l
, setzen eine temporäre Zeichenvariablea
als erstes Zeichen vont
, prüfen, ob sie mit unserer zweiten Eingabezeichenfolge übereinstimmt%2
und erhöhen sie,c
wenn sie wahr ist, und schneiden das erste Zeichen von abt
. Unsere End-of-Loop-Bedingung vergleicht sich mitt
unserer End-of-String-Abgrenzung und führt, falls nicht, eine Schleife zurück. Wir haben dannecho
den Wert unserer Theke raus.Es wäre wahrscheinlich möglich,
FOR
stattdessen eine Schleife zu verwenden, aber dies würde die Aktivierung von DelayedExpansion erfordern , was meiner Meinung nach tatsächlich länger byteweise sein wird. Die Überprüfung bleibt dem Leser überlassen.quelle
CJam, 5 Bytes
Erläuterung
quelle
PowerShell, 32 Bytes
Ein Vier-für-Eins! Und sie sind alle gleich lang! :)
oder
Alternative,
oder
Die ersten beiden Stile verwenden den Inline-Operator
-split
, während die zweiten beiden implizit das erste Argument als String umwandeln und den verwenden.Split()
stringbasierten Operator verwenden. In allen Fällen wird ein Array zurückgegeben, in dem Count um eins dekrementiert werden muss, da ein Arrayelement mehr zurückgegeben wird als das zweite Argument.Dieser hat ein bisschen Spaß gemacht ...
quelle
Julia, 21 Bytes
Beachten Sie, dass es sich hierbei
c
um ein Zeichen und nicht um eine Zeichenfolge mit nur einem Zeichen handeln muss. Sie verwenden es also alsf("test me",'e')
(was 2 zurückgibt) und nicht alsf("test me","e")
(was 0 zurückgibt, weil'e'!="e"
).quelle
> <> (Fisch) , 30 Bytes
Nimmt die Zeichenfolge und dann das zu zählende Zeichen. Die Eingabe wird nicht getrennt (zumindest im Online-Interpreter). Probieren Sie es mit dem Online-Interpreter aus: http://fishlanguage.com Ich habe die Bytes von Hand gezählt. Lassen Sie es mich wissen, wenn ich falsch liege.
Erläuterung
Zunächst ist> <> zweidimensional und durchläuft eine Zeile oder Spalte, bis sie auf a trifft
;
oder ein Fehler auftritt. Dies bedeutet, dass, wenn es von links nach rechts verläuft (wie zu Beginn eines Programms), es sich um die Zeile dreht, wenn es das Ende erreicht und nicht bewegt oder angewiesen wird, das Programm zu stoppen. Einige Zeichen pro Zeile werden wiederholt, da sie abhängig von der Richtung des Zeigers unterschiedliche Funktionen haben, und die vierte Zeile enthält Zeichen in umgekehrter Reihenfolge, da sich der Zeiger von rechts nach links bewegt.Eine Zusammenfassung des Programms finden Sie weiter unten. Sehen Sie sich die Anweisungen für> <> auf Esolangs an, um zu sehen, was die einzelnen Zeichen tun .
Linie 1:
0&v
Zeile 2:
=?\ilb
(Beginnend dort, wo Zeile 1 den Zeiger bewegt, dh das dritte Zeichen)
Zeile 3:
=?\:@=&+&l1
(ab dem dritten Zeichen)
Zeile 4:
n&/;
(ab dem dritten Zeichen)
quelle
Ruby,
22 bis20 BytesDemo: http://ideone.com/MEeTd2
Das
-1
ist aufgrund der Tatsache , dassgets
Ermittelt die Eingabe, sowie ein Zeilenende- Zeichen. Ruby'sString#count
zählt, wie oft ein Zeichen aus dem Argument in der Zeichenfolge vorkommt.Beispielsweise tritt für die Eingabe [
test\n
,t\n
] dast
zweimal und das\n
einmal auf und muss subtrahiert werden.quelle
$><<
4 Bytes entfernen und reduzieren.p gets.count(gets)-1
Ruby, 18 Bytes
Verwendung:
quelle
Japt , 2 Bytes
Probieren Sie es online!
quelle