Die Programmierung ist sehr starr. Sie können einem Programm nicht sagen, dass es die Bananenzählung ausgeben soll. Sie müssen es dazu auffordern print(bananas)
.
Aber wenn Sie das tun, haben Sie ein Problem: Sie wissen vorher nicht, wie viele Bananen Sie haben, also wissen Sie nicht, ob Sie einen Plural verwenden sollen.
Manchmal gehen Programmierer den faulen Weg. Anstatt zu prüfen, drucken sie einfach there are X banana(s)
.
Aber das ist hässlich, also brauchen wir ein Programm, um das zu beheben.
Die Methoden)
Gehen Sie folgendermaßen vor, um die mehrdeutigen Pluralformen in einer Zeichenfolge zu entfernen:
Teilen Sie die Zeichenfolge auf Leerzeichen in eine Liste von Wörtern.
Führen Sie für jedes Wort, das mit endet
(s)
, Folgendes aus:- Wenn das vorhergehende Wort
a
,an
,1
oderone
, entfernen Sie die(s)
am Ende des Wortes. - Andernfalls, wenn das Wort das erste Wort in der Kette ist , oder das vorhergehende Wort nicht
a
,an
,1
oderone
ersetzt die(s)
am Ende des Wortes mits
.
- Wenn das vorhergehende Wort
Fügen Sie die Liste der Wörter wieder zu einer Zeichenfolge zusammen, wobei das ursprüngliche Leerzeichen erhalten bleibt.
Beispiel (e)
Nehmen wir eine Zeichenfolge there's a banana(s) and three apple(s)
.
Zuerst teilen wir die Zeichenfolge in eine Liste von Wörtern auf: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]
Für den zweiten Schritt nehmen wir die zwei Wörter, die mit (s)
: banana(s)
und enden apple(s)
.
Das Wort davor banana(s)
ist a
, also entfernen wir das (s)
, machen es banana
. Das Wort davor apple(s)
ist three
, also ändern wir das (s)
zu s
, so wird es apples
.
Wir haben jetzt ["there's", "a", "banana", "and", "three", "apples"]
. Wenn wir die Liste wieder zusammenfügen, bekommen wir there's a banana and three apples
. Dies ist unser Endergebnis.
Die Herausforderungen)
Erstellen Sie ein Programm oder eine Funktion, die eine mehrdeutige Zeichenfolge in einem angemessenen Format verwendet und die nicht mehrdeutige Version dieser Zeichenfolge zurückgibt.
Sie können davon ausgehen, dass die Zeichenfolge keine Zeilenumbrüche, Tabulatoren oder Zeilenumbrüche enthält.
Ich habe vergessen, beim Posten der Challenge anzugeben, ob eine Aufteilung nach Gruppen von Räumen oder Räumen (dh okay then
mit zwei Räumen) erfolgen soll ["okay", "then"]
oder nicht ["okay", "", "then"]
.
Testfall (e)
Input -> Output
there are two banana(s) and one leprechaun(s) -> there are two bananas and one leprechaun
there's a banana(s) and three apple(s) -> there's a banana and three apples
apple(s) -> apples
one apple(s) -> one apple
1 banana(s) -> 1 banana
banana -> banana
preserve original whitespace(s) -> preserve original whitespaces
11 banana(s) -> 11 bananas
an apple(s) -> an apple
this is a te(s)t -> this is a te(s)t
I am a (s)tranger(s) -> I am a (s)tranger
Wertung
Da es sich um Code-Golf , Bytes die Vorlage mit dem geringsten gewinnt!
apple(s)
Testfallapples
stattdessen nachgeben ? Die Herausforderung besagtOtherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.
, dass ich bemerke, dass dieser Fallapples
in den ersten drei Revisionen im Sandkasten nachgab, sich aber beim vierten geändert hat.There's a single banana(s)
->There's a single bananas
.Antworten:
Mathematica,
151–148BytesErläuterung
Auf
j
Leerzeichen setzen. Stellen Siek
das Muster "notj
" (= Nicht-Leerzeichen) ein.Stellen Sie zwei Leerzeichen voran und fügen Sie ein Leerzeichen an die Eingabe an.
Für eine Teilzeichenfolge, die dem Muster entspricht:
a
), gefolgt vons
), gefolgt vonw
), gefolgt von"(s)"
, gefolgt vonWenn
a
es sich nicht um ein einzelnes Wort handelt, bewerten Sie es mit"s"
, andernfalls mit""
.Ersetzen der Übereinstimmungsmuster mit
j
,a
,s
,w
,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]
, undj
miteinander verbunden sind .Nehmen Sie von Position 3 bis Position -2 (1-indiziert; negative Indizes zählen vom Ende). Dies liegt daran, dass wir am Anfang drei Leerzeichen hinzugefügt haben.
quelle
Python 3 , 94 Bytes
Probieren Sie es online!
-4 bytes dank i cri everytim (ich denke das ist akzeptabel)
quelle
__import__
kann unmöglich kürzer sein ... Yup, es ist 4 Bytes kürzer als ein normalerimport re
.Netzhaut , 53 Bytes
Probieren Sie es online!
quelle
banana(s)
inthere's a banana(s) and three apple(s)
- versuchen dieses Updatea|an
uman?
für -1 ByteMathematica, 313 Bytes
quelle
Perl 5, 43 + 1 (-p) = 44 Bytes
Passen Sie jedes
(s)
Wort am Ende an und ersetzen Sie es durch!$1
(1 oder 0).quelle
Pyth - 53 Bytes
Folgt dem Algorithmus so ziemlich wie er ist.
Probieren Sie es hier online aus .
quelle
there are two banana(s) and one leprechaun(s)
(zwei Leerzeichen nach demone
). Das ursprüngliche Leerzeichen bleibt erhalten,leprechaun(s)
ignoriert jedoch das vorangegangeneone
.one
undleprechaun(s)
Jelly ,
52 5149 BytesJelly hat kein einziges Regex-Atom
Ein vollständiges Programm, das eine Zeichenfolge akzeptiert (mit Python-Formatierung, wenn es mehrzeilig ist oder Anführungszeichen enthält) und die Ausgabe druckt.
Probieren Sie es online! oder sehen Sie sich die Testsuite an .
Wie?
quelle
Ṫ
als separaten Link verwendet haben. Verhindert dies dasṪ
Löschen des Elements aus der ursprünglichen Liste?Ŀ
diese, aber ich sehe keinen kurzen Weg zum Endstück in Link 4, aber möglicherweise gibt es einen. Es könnte sogar eine Möglichkeit geben, den Schwanz von Link 4 auch dort rein zu bekommen!Ŀ
Ding den ersten Link nennen kann, deshalbṪ
ist ein Link für sich.Java (OpenJDK 8) ,
918396 BytesProbieren Sie es online!
quelle
Perl 5 , 56 + 1 (
-p
) = 57 BytesProbieren Sie es online!
quelle
a hel(s)lo
.a hel(s)lo
noch zu den Testfällen hinzugefügt werden, und dann reparierst du vielleicht deinen Code ...JavaScript (ES6),
8887 BytesErklärung folgt in Kürze.
quelle
\s
mit `` ersetzen, entsprechend "Sie können davon ausgehen, dass die Zeichenfolge keine Zeilenumbrüche, Tabulatoren oder Zeilenumbrüche enthält."(\s|$)
das Problem beheben, indem Sie am Ende des regulären Ausdrucks hinzufügen .JavaScript (ES6), 84 Byte
Hier ist eine interessante Möglichkeit, den letzten Teil, der leider 2 Bytes länger ist, neu anzuordnen:
quelle
JavaScript (SpiderMonkey) , 82 Byte
Probieren Sie es online!
78 Byte Version (weniger robust)
Dies ist eine modifizierte Version von ETHproductions '(ich habe keine 50 Repräsentanten)
Erläuterung
/(\S+ +(\S+))\(s\)/g
- das aktuelle Muster, nach dem gesucht werden soll (amount object(s)
)(_,a)=>a
-_
Ist ein catch all variabel,a
ist das(\S+ +(\S+))
"s"[+/^(1|one|an?)/i.test(a)]||""
- anstatt das Array aufzuteilen, mache einfach ein Dummy-Array und erhalte den Index (+/.../.test
gibt eine Zahl zurück)"s"[+/^(1|one|an?)/i.test(a)]
zurückkehrenundefined
(true
oder1
für den Test) zurückkehren""
quelle