Ihr Ziel ist es, Input wie zu nehmen
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
und erstellen Sie ein Array der Indizes der Zeichenfolge, in denen die Buchstaben des Wortes "Lama" erscheinen (jeweils eine in der angegebenen Reihenfolge). Lassen Sie mich zum Beispiel die Buchstaben zeigen, auf die mit Carets gezeigt wird, um die Indizes anzuzeigen:
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
^ ^ ^ ^ ^
Das Array würde also so aussehen:
[44, 67, 76, 105, 114]
(Wenn Ihre Anwendung eine Indexierung verwendet, die nicht auf 0 basiert, sehen die Zahlen anders aus. Das ist in Ordnung.)
Wenn der Text kein Lama enthält, sollte das Array leer, null, null oder undefiniert sein.
Jede Codesprache wird akzeptiert. Dies ist ein Code-Golf- Wettbewerb, bei dem die wenigsten Charaktere gewinnen!
Antworten:
CJam - 33
Es werden die 1-basierten Indizes abgerufen (2 weitere Bytes für 0-basierte)
Erläuterung:
l
Liest eine Zeile aus der Eingabe (Ersetzen durchq
für die gesamte Eingabe),el
konvertiert sie in Kleinbuchstaben."llama"{...}/
Führt den Block für jeden "Lama"1$
-Buchstaben aus. Die aktuelle Zeichenfolge#
findet den Index der Buchstabeninkremente)_
und dupliziertT+:T
addiert T (anfangs 0), aktualisiert T und verlässt ihn Auf dem Stapel werden die\@
Elemente vertauscht. Jetzt haben wir current-T, index. Die Zeichenfolge>
schneidet die Zeichenfolge, die am Index beginnt.;
Die verbleibende Zeichenfolge]
sammelt die Indizes in einem Array.Zu diesem Zeitpunkt haben wir alle 1-basierten Indizes. Wenn kein Buchstabe gefunden wurde, enthält das Array Duplikate.
___
macht 3 weitere Kopien des Arrays|
(mit 2 Array-Kopien) entfernt Duplikate=
vergleicht, was zu 0 führt, wenn Duplikate vorhanden sind, oder 1, wenn nicht,*
multipliziert das Array 0 oder 1 entsprechendquelle
Perl, 52 Bytes
Die Lösung wird als Funktion bereitgestellt, die die Zeichenfolge als Argument verwendet und eine Liste von Positionen zurückgibt.
Einbasierte Positionen, Suche nach Groß- und Kleinschreibung ohne Zeilenumbruch: 52 Bytes
Bei der Suche nach Groß- und Kleinschreibung wird im Beispiel der Frage ein leeres Array zurückgegeben, da nach dem Abgleichen der ersten drei Buchstaben der Kleinbuchstabe
m
im Eingabetext fehlt.Unterstützung von Zeilenumbrüchen: + 1 Byte = 53 Byte
Der Text kann nun mehrere Zeilen umfassen.
Suche ohne Berücksichtigung der Groß- / Kleinschreibung: + 1 Byte = 54 Byte
Das Beispiel in der Frage gibt eine Liste der Indexpositionen an. Es handelt sich um einbasierte Zahlen:
Nullbasierte Positionen: + 9 Bytes = 63 Bytes
Ergebnis für das Beispiel in der Frage:
Ungolfed:
Die letztere Variante umfasst mehr oder weniger die anderen Varianten.
quelle
[]
und die dritte wird[ ]
für mich gedruckt (die längeren funktionieren ordnungsgemäß). Ich verwende "Perl, v5.8.8 für msys-64int". Haben Sie einen Fehler oder funktioniert er auf einer anderen Version von Perl?[]
für die erste Lösung,M
wird bei einer Suche nicht zwischen Groß- und Kleinschreibung unterschieden. Die Frage nach der Groß- und Kleinschreibung ist recht unklar.[]
ist also akzeptabel für die ersten beiden. Aber die ersten drei Lösungen funktionieren immer noch nicht richtig für mich: Wenn Sie eine Eingabe geben, die Indizes zurückgeben soll, gibt sie zurück[ ]
sed, 299 + 1
Ja, sed kann ein Lama finden. Nein, sed kann nicht rechnen. Dies ist mit 299 + 1 Zeichen die längste Antwort, da ich sed das Zählen beibringen musste.
Diese Antwort erfordert ein sed mit erweiterten regulären Ausdrücken (
sed -E
odersed -r
). Ich habe OpenBSD sed (1) benutzt . Eingabe ist eine Zeichenfolge pro Zeile. (Daher enthält die Zeichenfolge möglicherweise keine neue Zeile.) Die Ausgabe ist eine Zahlenzeile oder nichts.Verwendung (+1 Zeichen für
-r
):Quellcode (299 Zeichen):
Das Programm ersetzt zunächst das Lama durch fünf
%
. (Alle Angaben%
in diesem Programm sind wörtlich.) Der erste Befehls/%/z/g
ändert sich%
inz
in der Eingabezeile. Die nächsten fünf Befehle finden das Lama, sodass alle Arme auf allen Schultern schmerzen können. wird A %% Arme auf% ll Schultern% ay% che. Weil jeder.*
gierig ist, finde ich immer das Lama auf der rechten Seite: Lama Lama würde zu Lama %%%%% . Wenn ich keine fünf bekomme%
,/(.*%){5}/!d
löscht ich die Eingabezeile und überspringe die nächsten Befehle.s/[^%]/z/g
ändert jeden Charakter außer%
zuz
. Dann gehe ich in eine Schleife.s/(z*)%/\10 z\1/
ändert die erste%
in0
, kopiert null oder mehrz
von links nach rechts und fügt eine weiterez
nach rechts hinzu. Dies ist so, dass die Anzahl derz
Willen dem Index entspricht. Zum Beispielzz%zzz%...
wird ,zz0 zzzzzzzz%...
da der erste%
bei Index 2 war, und der nächste%
ist am Index 8.s/z*$//
entfernt zusätzlichez
vom Ende des Strings.Die nächsten elf Befehle werden gezählt,
z
indem jeder entferntz
und von hochgezählt wird0
. Es zählt wiezzz0
,zz1
,z2
,3
. Auch1zzzz9
wirdz1zzz0
(später23
) oderzzzz9
wird1zzz0
(später13
). Diese Schleife setzt sich fort, bis es keine%
oder mehr gibtz
.quelle
Fortran -
154148Fortran mag Golf, aber nur um zu beweisen, dass das Parsen von Saiten in einer mathematischen Sprache möglich ist, habe ich es getan:
Ich habe ein paar Zeichen gespart, indem ich die
f
am Ende nicht benötigten weggelassenendfunction
undif(any(r==0))
stattdessen verwendet habeif(.not.all(r>0))
.Dafür braucht man:
s
die Zeichenfolge mit Text seina
um als Kleiner Test (dhllama
)b
zu sein , der obere Falltest (dhLLAMA
)Das volle, nicht golfene Programm ist
quelle
C # - 119
Nimmt String, gibt Array aus. Null, wenn kein Lama in der Zeichenfolge.
quelle
x=>x>=0
i
auf -1 initialisieren und .ToArray () in die .Select-Anweisungint[]a(string s){var i=-1;var o="llama".Select(x=>i=s.IndexOf(x,i+1)).ToArray();return o.All(x=>x>=0)?o:null;}
Ruby,
566563Bearbeiten : 9 Zeichen , so dass es Groß- und Kleinschreibung ist.
Definiert eine Funktion (Lambda, technisch)
f
.Gibt zurück,
nil
wenn kein Lama vorhanden ist. Wenn es sein muss[]
(leeres Array), dann fügen Sie einfach||[]
vor dem letzten}
für insgesamt 4 zusätzliche Zeichen hinzu.Lesbare Version:
quelle
index(/#{c}/i
anstattupcase
.C - 53
Kompilieren mit:
Ich habe diesen Kompilierbefehl mit Cygwins gcc getestet. In anderen Umgebungen werden Leerzeichen und andere Sonderzeichen möglicherweise anders behandelt.
Das 0-basierte Ergebnis wird in einem Array gespeichert
r
. Sein Inhalt ist undefiniert, wenn der String kein Lama enthält.Groß- und Kleinschreibung beachten (53)
i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}
Groß- / Kleinschreibung beachten (58)
i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}
quelle
JavaScript (ECMAScript 6) - 68 Zeichen
Angenommen, die zu testende Zeichenfolge befindet sich in der Variablen
s
. Wenn Sie es in eine Funktion verwandeln möchten, müssen Sief=s=>
(für weitere 5 Zeichen) voranstellen .Ausgänge:
Groß- / Kleinschreibung beachten - 69 Zeichen
Ausgänge:
Groß- / Kleinschreibung und erste Übereinstimmung - 74 Zeichen
Ausgänge:
quelle
Python, 100
Ich bin der schlechteste Golfer aller Zeiten. : P
Vielen Dank an @xnor für das Abschneiden von 6 Bytes.
o
enthält das Array nach.BEARBEITEN : Behoben.
EDIT 2 :
len(g)
tog
,o==5
too>4
gemäß @ xnors Vorschlägen.EDIT 3 : @WolframH behoben.
quelle
o*=(len(o)==5)
ist ausgezeichnet . Es ist schrecklich, aber ich liebe es!s
ist die Eingabezeichenfolge, oder? Sollte es dann nichts.lower
seini.lower
? Allerdings, dass doePython 71
Übernimmt die Eingabe in
s
. Ausgabe ino
.Bearbeiten: Von Listen zu Tupeln geändert, um 2 Bytes zu sparen.
quelle
o
, nicht leer anfangen zu müssen, um es zu nehmeno[-1]
. Vielleicht ist es kürzer , obwohl nur zu beginnen ,o
wie[-1]
später tuno=o[1:]
? Ärgerlicherweise stolpert die erste-1
Überprüfung, obo
enthält-1
.-1
-Idee zum Laufen gebracht werden kann. Zumindest ist mir das nicht gelungen :-( Allerdings habe ich die Listen in Tupel geändert, um 2 Bytes zu sparen. :-)Python 100
Probe:
quelle
Haskell, 111
Ungolfed:
Beispiel:
quelle
Matlab,
61-96Durchsucht die Zeichenfolge und ersetzt bis zu jeder Übereinstimmung alles durch Kauderwelsch, bevor nach dem nächsten Zeichen gesucht wird. Lässt
s
undefiniert, wenn das Wort nicht vorkommt.Beachten Sie, dass die Anzahl der Zeichen verringert werden kann, wenn die Berücksichtigung der Groß- und Kleinschreibung zulässig ist.
Vorherige Versionen
Durchsucht die Zeichenfolge und ersetzt bis zu jeder Übereinstimmung alles durch Kauderwelsch, bevor nach dem nächsten Zeichen gesucht wird. Die Fehlerbehandlung (try-catch-end) könnte möglicherweise fallengelassen werden, dann würde das Programm abstürzen (aber s wäre nach Bedarf undefiniert), wenn Lama nicht gefunden würde.
Implementierung:
Ohne Fehlerbehandlung:
quelle
Sprache Java
quelle
Python (70)
Wir suchen nacheinander nach jedem Zeichen
'llama'
, beginnend nach der Position des zuvor gefundenen Zeichens. Wird kein Zeichen gefunden,c
wird der Standardwert von verwendet-1
. In diesem Fall wird die letzte Zeiler
in die leere Liste umgewandelt.Bearbeiten: Es wurde herausgefunden,
str.find(s,...)
dass aufgerufen werden kanns.find(...)
, indem 4 Zeichen gespeichert werden.quelle
OpenEuphoria,
147128Ich habe zwei Beispiele. Erstens die kürzeste:
Ich kann es auf 126 Zeichen reduzieren, wenn ich "oder" anstelle von "und" verwende, wie es die C-Version oben tut. Dies entspricht jedoch auch der Zeichenfolge
''!-!
alsllama
. Gelegentlich, aber immer noch ein möglicher Fehler.Und dann die Version mit regulären Ausdrücken:
Beide nehmen Eingaben von STDIN entgegen und senden diese an STDOUT.
EDIT: Kürzere Regex Beispiel:
quelle
split
/join
oderexplode
/ erstelltimplode
, oder hat OpenEuphoria keine kurzen Versionen davon?Power Shell -
12185Ich übe immer noch mit Powershell und erwarte, dass dies verbessert werden kann
$ s enthält den String, Ergebnis ist in Array $ a
Originalfassung
Ungolfed
Neue Version, mit großem Dank an @goric
quelle
$a=@();$w="llama";$n=$c=0;foreach($i in $s.tochararray()){if($i-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
foreach($i in $s.tochararray())
mit[char[]]$s|%
, solange Sie die nachfolgende ändern$i
zu ein$_
. Dass Rasuren es bis auf 93:$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
$w
Variable vollständig entfernen , da sie nur einmal verwendet wird. Fügen Sie es einfach in das if ein:if($i-eq"llama"[$n])
+=1
s durch++
sPHP
Noch keine PHP-Antwort? Ich denke, eine Sprache, die stark auf Saiten ausgerichtet ist, kann zumindest eine mathematische schlagen
152 gegen fortran 154, Aufgabe erledigt: P
ungolfed
Übergibt der Anrufer immer eine Zeichenfolge in Kleinbuchstaben, wird die Zeichenfolge auf 137 verringert
quelle
<?
am Anfang Ihres Codes hinzufügen , um ihn gültig zu machen. Entschuldigung ...JavaScript,
122115Definiert eine Funktion, die einen String als einziges Argument verwendet (zweites Argument ist billig
var
) und entweder ein leeres Array oder ein Array mit 5 Elementen zurückgibt.Fällt auf 108, wenn ich die Eingabe für eine einzelne Zeichenvariable (
s
) nehme und die Ausgabe in einer anderen (b
) belasse:Bearbeiten: Karte für for-Schleife ausgetauscht.
quelle
b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
Rebol, 97
Anwendungsbeispiel in der Rebol-Konsole:
Rebol verwendet eine 1-basierte Indizierung. Gibt eine leere Liste zurück,
[]
wenn keine Lama-Sequenz gefunden wurde (Groß- / Kleinschreibung wird nicht berücksichtigt).Ungolfed:
quelle
APL, 47
Nicht der kürzeste Code, aber auf APL-Weise ziemlich verzerrt.
Erläuterung
'amall',⊂⍬⍞
Bilden Sie ein Array aus 6 Elementen: die Buchstaben 'amall' und ein Subarray aus 2 Elementen, selbst Subarrays: das leere Array und eine Zeichenzeile, die aus der Eingabe gelesen werden.{...}/...
Reduzieren Sie das 6-Elemente-Array mit der bereitgestellten Funktion (nach rechts).a s←⍵
Zerlegen Sie das richtige Argument in das Array mit den Indizes und die verbleibende Teilzeichenfolge (anfangs das leere Array und die vollständige Zeichenfolge).~⍺∊s:⍬⍬
Wenn die Teilzeichenfolge nicht den nächsten Buchstaben enthält,⍺
stoppen Sie die Berechnung und geben Sie das leere Array zurück.a,←n←s⍳⍺
Suchen Sie andernfalls seine Position, rufen Sie es n auf und hängen Sie es an das Array von Indizes an.a(n↓s)
Erstellen Sie ein Array mit zwei Elementen und geben Sie sie zurück: das erweiterte Array mit den Indizes und die verbleibende Teilzeichenfolge.+\↑⊃...
Packen Sie die Ausgabe der Faltung aus, nehmen Sie das erste Element (das Array von Indizes) und scannen Sie es mit Addition, um relative Offsets in absolute zu verwandeln.Beispiele
quelle
Julia, 76
Ein weiteres Beispiel für Regex mit der Sprache Julia.
quelle