La programmation est très rigide. Vous ne pouvez pas dire à un programme de "sortir le nombre de bananes", vous devez le lui dire print(bananas)
.
Mais lorsque vous faites cela, vous vous retrouvez avec un problème: vous ne savez pas combien de bananes vous avez à l'avance, donc vous ne savez pas si vous devez utiliser un pluriel.
Parfois, les programmeurs vont paresseusement. Au lieu de vérifier, ils impriment simplement there are X banana(s)
.
Mais c'est moche, nous avons donc besoin d'un programme pour résoudre ce problème.
Les méthodes)
Pour supprimer les pluriels ambigus d'une chaîne, procédez comme suit:
Divisez la chaîne des espaces en une liste de mots.
Pour chaque mot qui se termine par
(s)
, procédez comme suit:- Si le mot précédent est
a
,an
,1
ouone
, retirer la(s)
fin du mot. - Dans le cas contraire, si le mot est le premier mot dans la chaîne ou le mot précédent est pas
a
,an
,1
ouone
, remplacer la(s)
fin du mots
.
- Si le mot précédent est
Rejoins la liste des mots dans une chaîne, en préservant les espaces d'origine.
Exemples)
Prenons une chaîne there's a banana(s) and three apple(s)
.
Tout d'abord, nous avons divisé la chaîne en une liste de mots: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]
Pour la deuxième étape, nous prenons les deux mots se terminant par (s)
: banana(s)
et apple(s)
.
Le mot avant banana(s)
est a
, donc nous supprimons le (s)
, ce qui en fait banana
. Le mot avant apple(s)
est three
, donc nous changeons le (s)
en s
, ainsi il devient apples
.
Nous avons maintenant ["there's", "a", "banana", "and", "three", "apples"]
. Rejouer la liste ensemble, nous obtenons there's a banana and three apples
. Ceci est notre résultat final.
Les défis)
Créez un programme ou une fonction qui prend une chaîne ambiguë dans n'importe quel format raisonnable et renvoie la version non ambiguë de cette chaîne.
Vous pouvez supposer que la chaîne ne contient aucun retour à la ligne, tabulation ou retour chariot.
J'ai oublié de préciser si de diviser les groupes d'espaces ou des espaces ( à savoir si okay then
avec deux espaces doivent être ["okay", "then"]
ou ["okay", "", "then"]
) lors de la publication du défi, de sorte que vous pouvez prendre soit sous forme de division.
Cas de test
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
Notation
Comme c'est du code-golf , la soumission avec le moins d'octets gagne!
apple(s)
test devrait- ilapples
plutôt céder ? Le défi indique queOtherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.
je note que cette affaire a cédéapples
en bac à sable pour les trois premières révisions mais a changé à la quatrième.There's a single banana(s)
->There's a single bananas
.Réponses:
Mathematica,
151148 octetsExplication
Défini
j
sur un ou plusieurs espaces. Définissezk
le modèle "notj
" (= caractère non blanc).Ajoutez deux espaces blancs et ajoutez un espace blanc à l'entrée.
Pour une ou des sous-chaînes correspondant au motif:
a
), suivi des
), suivie dew
), suivi de"(s)"
, suivie deSi
a
n'est pas l'un des mots singuliers, évaluez à"s"
, sinon""
.Remplacer la configuration d'adaptation avec
j
,a
,s
,w
,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]
, etj
reliés entre eux.Passer de la position 3 à la position -2 (1 indexé; les indices négatifs comptent à partir de la fin). C'est parce que nous avons ajouté trois espaces au début.
la source
Python 3 , 94 octets
Essayez-le en ligne!
-4 octets grâce à i cri everytim (je pense que c'est acceptable)
la source
__import__
ne peut pas être plus court ... Ouais, c'est 4 octets plus court comme un régulierimport re
.Rétine , 53 octets
Essayez-le en ligne!
la source
banana(s)
dansthere's a banana(s) and three apple(s)
- essayez ce correctifa|an
àan?
-1 octetMathematica, 313 octets
la source
Perl 5, 43 + 1 (-p) = 44 octets
Correspond à chaque
(s)
fin de mot, remplacez-le par!$1
(1 ou 0) esses.la source
Pyth - 53 octets
Suit l'algorithme à peu près tel qu'il est.
Essayez-le en ligne ici .
la source
there are two banana(s) and one leprechaun(s)
(deux espaces après leone
). L'espace d'origine est conservé, maisleprechaun(s)
ignore leone
précédent.one
etleprechaun(s)
Gelée ,
52 5149 octetsJelly n'a pas d'atome de regex (s)
Un programme complet acceptant une chaîne (utilisant le formatage Python si multiligne ou contenant des guillemets) et imprimant la sortie.
Essayez-le en ligne! ou voir la suite de tests .
Comment?
la source
Ṫ
un lien distinct. Cela empêche-t-ilṪ
de supprimer l'élément de la liste d'origine?Ŀ
pour le faire, mais je ne vois pas de moyen court de suivre à l'intérieur du lien 4, mais il pourrait y en avoir. Il pourrait même y avoir un moyen d'y mettre la queue du lien 4!Ŀ
bidule peut appeler le premier lien, c'est pourquoiṪ
c'est un lien à lui tout seul.Java (OpenJDK 8) ,
918396 octetsEssayez-le en ligne!
la source
Perl 5 , 56 + 1 (
-p
) = 57 octetsEssayez-le en ligne!
la source
a hel(s)lo
.a hel(s)lo
ajouté aux cas de test, et puis peut-être que vous corrigerez votre code ...JavaScript (ES6),
8887 octetsExplication à venir.
la source
\s
par `` selon "Vous pouvez supposer que la chaîne ne contient aucun retour à la ligne, tabulation ou retour chariot."(\s|$)
à la fin de l'expression régulière.JavaScript (ES6), 84 octets
Voici une façon intéressante de réorganiser la dernière partie, qui est malheureusement de 2 octets de plus:
la source
JavaScript (SpiderMonkey) , 82 octets
Essayez-le en ligne!
Version 78 octets (moins robuste)
Ceci est une version modifiée de ETHproductions '(je n'ai pas 50 rep.)
Explication
/(\S+ +(\S+))\(s\)/g
- le motif réel à rechercher (amount object(s)
)(_,a)=>a
-_
est une variable catch all,a
est la(\S+ +(\S+))
"s"[+/^(1|one|an?)/i.test(a)]||""
- au lieu de découper le tableau, créez simplement un tableau factice et obtenez l'index (+/.../.test
retourne un nombre)"s"[+/^(1|one|an?)/i.test(a)]
retournerundefined
(true
, ou1
pour le test)""
la source