La programación es muy rígida. No puedes decirle a un programa que "muestre el recuento de bananas", tienes que decirle que lo haga print(bananas)
.
Pero cuando haces eso, terminas con un problema: no sabes cuántas bananas tienes de antemano, por lo que no sabes si usar un plural.
A veces, los programadores toman el camino vago. En lugar de verificar, simplemente imprimen there are X banana(s)
.
Pero eso es feo, por lo que necesitamos un programa para solucionar esto.
Los métodos)
Para eliminar los plurales ambiguos en una cadena, siga los siguientes pasos:
Divide la cadena en espacios en una lista de palabras.
Por cada palabra que termina con
(s)
, haga lo siguiente:- Si la palabra precedente es
a
,an
,1
oone
, retire el(s)
al final de la palabra. - De lo contrario, si la palabra es la primera palabra de la cadena o la palabra anterior no es
a
,an
,1
oone
, reemplazar el(s)
al final de la palabra cons
.
- Si la palabra precedente es
Vuelva a unir la lista de palabras en una cadena, conservando el espacio en blanco original.
Ejemplo (s)
Tomemos una cuerda there's a banana(s) and three apple(s)
.
Primero, dividimos la cadena en una lista de palabras: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]
Para el segundo paso, tomamos las dos palabras que terminan en (s)
: banana(s)
y apple(s)
.
La palabra anterior banana(s)
es a
, así que eliminamos el (s)
, haciéndolo banana
. La palabra anterior apple(s)
es three
, entonces cambiamos el (s)
a s
, así se convierte apples
.
Ahora tenemos ["there's", "a", "banana", "and", "three", "apples"]
. Uniéndonos a la lista nuevamente, lo conseguimos there's a banana and three apples
. Este es nuestro resultado final.
Los desafios)
Cree un programa o función que tome una cadena ambigua en cualquier formato razonable y devuelva la versión no ambigua de esa cadena.
Puede suponer que la cadena no contiene nuevas líneas, pestañas o retornos de carro.
Olvidé especificar si dividir en grupos de espacios o espacios (es decir, si okay then
debería haber dos espacios ["okay", "then"]
o ["okay", "", "then"]
) al publicar el desafío, por lo que puede asumir cualquier forma de división.
Casos de prueba)
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
Tanteo
Como se trata de código de golf , ¡el envío con la menor cantidad de bytes gana!
apple(s)
ceder el caso de pruebaapples
? El desafío diceOtherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.
que noto que este caso cedióapples
en la caja de arena para las primeras tres revisiones, pero cambió en la cuarta.There's a single banana(s)
->There's a single bananas
.Respuestas:
Mathematica,
151148 bytesExplicación
Establecer
j
en un carácter de espacios en blanco. Establezcak
el patrón "noj
" (= carácter que no sea un espacio en blanco).Anteponga dos espacios en blanco y añada uno (s) a la entrada.
Para una (s) subcadena (s) que coinciden con el patrón:
a
), seguido des
), seguido dew
), seguido de"(s)"
, seguida deSi
a
no es una de las palabras singulares, evalúe a"s"
, de lo contrario""
.Vuelva a colocar el patrón coincidente con
j
,a
,s
,w
,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]
, yj
unidas entre sí.Tome de la posición 3 a la posición -2 (indexado 1; los índices negativos cuentan desde el final). Esto se debe a que agregamos tres espacios al principio.
fuente
Python 3 , 94 bytes
Pruébalo en línea!
-4 bytes gracias a i cri everytim (creo que esto es aceptable)
fuente
__import__
no puede ser más corto ... Sí, es 4 bytes más corto como un habitualimport re
.Retina , 53 bytes
Pruébalo en línea!
fuente
banana(s)
enthere's a banana(s) and three apple(s)
- intente esta solucióna|an
aan?
-1 byteMathematica, 313 bytes
fuente
Perl 5, 43 + 1 (-p) = 44 bytes
Haga coincidir cada uno
(s)
al final de la palabra, reemplácelo con!$1
(1 o 0) esses.fuente
Pyth - 53 bytes
Sigue el algoritmo más o menos como es.
Pruébelo en línea aquí .
fuente
there are two banana(s) and one leprechaun(s)
(dos espacios después deone
). El espacio en blanco original se conserva, peroleprechaun(s)
ignora elone
anterior.one
yleprechaun(s)
Jalea ,
52 5149 bytesJelly no tiene un átomo de expresiones regulares
Un programa completo que acepta una cadena (usando el formato Python si es multilínea o que contiene comillas) e imprime la salida.
Pruébalo en línea! o ver el conjunto de pruebas .
¿Cómo?
fuente
Ṫ
como un enlace separado. ¿Esto impideṪ
eliminar el elemento de la lista original?Ŀ
para hacerlo, pero no veo una forma corta de cola dentro del enlace 4, pero podría haberlo. ¡Incluso podría haber una manera de obtener la cola del enlace 4 allí también!Ŀ
cosa puede llamar al primer enlace, por esoṪ
es un enlace por sí solo.Java (OpenJDK 8) ,
918396 bytesPruébalo en línea!
fuente
Perl 5 , 56 + 1 (
-p
) = 57 bytesPruébalo en línea!
fuente
a hel(s)lo
.a hel(s)lo
agregarme a los casos de prueba, y luego tal vez arreglarás tu código ...JavaScript (ES6),
8887 bytesExplicación próximamente.
fuente
\s
con `` de acuerdo con "Puede suponer que la cadena no contiene nuevas líneas, pestañas o retornos de carro".(\s|$)
al final de la expresión regular.JavaScript (ES6), 84 bytes
Aquí hay una forma interesante de reorganizar la última parte, que lamentablemente es 2 bytes más larga:
fuente
JavaScript (SpiderMonkey) , 82 bytes
Pruébalo en línea!
Versión de 78 bytes (menos robusta)
Esta es una versión modificada de ETHproductions '(no tengo 50 rep.)
Explicación
/(\S+ +(\S+))\(s\)/g
- el patrón real a buscar (amount object(s)
)(_,a)=>a
-_
es una captura de todas las variables,a
es el(\S+ +(\S+))
"s"[+/^(1|one|an?)/i.test(a)]||""
- en lugar de cortar la matriz, simplemente haga una matriz ficticia y obtenga el índice (+/.../.test
devuelve un número)"s"[+/^(1|one|an?)/i.test(a)]
devolverundefined
(true
o1
para la prueba) devolver""
fuente