A programação é muito rígida. Você não pode dizer a um programa para "gerar a contagem de bananas", é necessário dizer a ele print(bananas)
.
Mas quando você faz isso, acaba com um problema: você não sabe quantas bananas você tem antes, então não sabe se deve usar um plural.
Às vezes, os programadores seguem o caminho preguiçoso. Em vez de verificar, eles apenas imprimem there are X banana(s)
.
Mas isso é feio, então precisamos de um programa para corrigir isso.
Os métodos)
Para remover os plurais ambíguos em uma seqüência de caracteres, siga as seguintes etapas:
Divida a string nos espaços em uma lista de palavras.
Para cada palavra que termina com
(s)
, faça o seguinte:- Se a palavra anterior é
a
,an
,1
ouone
, remover o(s)
no fim da palavra. - Caso contrário, se a palavra é a primeira palavra na cadeia ou a palavra anterior não é
a
,an
,1
ouone
, substitua o(s)
no final da palavra coms
.
- Se a palavra anterior é
Junte a lista de palavras novamente em uma sequência, preservando o espaço em branco original.
Exemplos)
Vamos pegar uma corda there's a banana(s) and three apple(s)
.
Primeiro, dividimos a string em uma lista de palavras: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]
Para o segundo passo, tomamos as duas palavras que terminam com (s)
: banana(s)
e apple(s)
.
A palavra anterior banana(s)
é a
, então removemos o (s)
, tornando-o banana
. A palavra anterior apple(s)
é three
, então alteramos o (s)
para s
, assim ele se torna apples
.
Agora temos ["there's", "a", "banana", "and", "three", "apples"]
. Juntando a lista novamente, chegamos there's a banana and three apples
. Este é o nosso resultado final.
Os desafios)
Crie um programa ou função que use uma string ambígua em qualquer formato razoável e retorne a versão não ambígua dessa string.
Você pode assumir que a sequência não contém novas linhas, guias ou retornos de carro.
Eu esqueci de especificar se dividir em grupos de espaços ou espaços (ou seja, se okay then
dois espaços devem ser ["okay", "then"]
ou ["okay", "", "then"]
) ao postar o desafio, então você pode assumir qualquer forma de divisão.
Casos de teste)
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
Pontuação
Como se trata de código-golfe , a submissão com o mínimo de bytes vence!
apple(s)
caso de teste deve render emapples
vez disso? O desafio indicaOtherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.
que esse caso rendeuapples
em sandbox para as três primeiras revisões, mas mudou na quarta.There's a single banana(s)
->There's a single bananas
.Respostas:
Mathematica,
151148 bytesExplicação
Defina
j
para um caractere de espaço em branco. Definak
como o padrão "nãoj
" (= caractere que não é um espaço em branco).Anexe dois espaços em branco e anexe um (s) espaço em branco à entrada.
Para uma substring que corresponde ao padrão:
a
), seguidos pors
), seguida dew
), seguidos por"(s)"
, seguida porSe
a
não for uma das palavras singulares, avalie para"s"
, caso contrário""
.Substituir o padrão de correspondência com
j
,a
,s
,w
,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]
, ej
se uniram.Pegue da posição 3 para a posição -2 (indexado a 1; índices negativos contam desde o final). Isso ocorre porque adicionamos três espaços no início.
fonte
Python 3 , 94 bytes
Experimente online!
-4 bytes graças a i cri everytim (acho que isso é aceitável)
fonte
__import__
não pode ser mais curto ... Sim, é 4 bytes mais curto como um regularimport re
.Retina , 53 bytes
Experimente online!
fonte
banana(s)
emthere's a banana(s) and three apple(s)
- tentar essa correçãoa|an
aan?
para -1 byteMathematica, 313 bytes
fonte
Perl 5, 43 + 1 (-p) = 44 bytes
Faça a correspondência de cada
(s)
no final da palavra, substitua-o por!$1
(1 ou 0) esses.fonte
Pitão - 53 bytes
Segue o algoritmo praticamente como ele é.
Experimente online aqui .
fonte
there are two banana(s) and one leprechaun(s)
(dois espaços após oone
). O espaço em branco original é preservado, masleprechaun(s)
ignora oone
antes.one
eleprechaun(s)
Geléia ,
52 5149 bytesA geléia não possui um átomo de regex (s)
Um programa completo que aceita uma sequência de caracteres (usando a formatação Python, se for multilinha ou contenha aspas) e imprime a saída.
Experimente online! ou veja a suíte de testes .
Quão?
fonte
Ṫ
como um link separado. Isso impede aṪ
exclusão do elemento da lista original?Ŀ
para fazer isso, mas não vejo uma maneira curta de seguir dentro do link 4, mas pode haver. Poderia até haver uma maneira de obter a cauda do link 4 lá também!Ŀ
coisa pode chamar o primeiro link, é por isso queṪ
é um link por si só.Java (OpenJDK 8) ,
918396 bytesExperimente online!
fonte
Perl 5 , 56 + 1 (
-p
) = 57 bytesExperimente online!
fonte
a hel(s)lo
.a hel(s)lo
adicionados aos casos de teste, e então talvez você vai corrigir o seu código ...JavaScript (ES6),
8887 bytesExplicação em breve.
fonte
\s
por `` de acordo com "Você pode assumir que a string não contém novas linhas, guias ou retornos de carro".(\s|$)
ao final da regex.JavaScript (ES6), 84 bytes
Aqui está uma maneira interessante de reorganizar a última parte, que infelizmente é 2 bytes mais longa:
fonte
JavaScript (SpiderMonkey) , 82 bytes
Experimente online!
Versão de 78 bytes (menos robusta)
Esta é uma versão modificada do ETHproductions '(não tenho 50 representantes).
Explicação
/(\S+ +(\S+))\(s\)/g
- o padrão real a ser procurado (amount object(s)
)(_,a)=>a
-_
é uma variável catch toda,a
é o(\S+ +(\S+))
"s"[+/^(1|one|an?)/i.test(a)]||""
- em vez de cortar a matriz, basta criar uma matriz fictícia e obter o índice (+/.../.test
retorna um número)"s"[+/^(1|one|an?)/i.test(a)]
retornarundefined
(true
, ou1
para o teste) retornar""
fonte