Escreva um programa para substituir todas as ocorrências de "força" por "primeiro" e todas as ocorrências de "primeiro" por "força", mantendo o caso original para todas as posições de caracteres:
"ForcefoRcefOrcE" -> "FirstfiRstfIrsT"
"FirstfiRstfIrsT" -> "ForcefoRcefOrcE"
O restante da string deve permanecer inalterado e, portanto, a execução do programa duas vezes retornará a string original:
"thirst of forces" -> "thirst of firsts" -> "thirst of forces"
Seu programa deve funcionar em qualquer sequência inicial. Portanto, como dica, é melhor evitar o uso de caracteres mágicos como representação intermediária, porque se você tentar uma substituição de três passagens ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first"
), ela falhará nas strings que contêm "zzzzz"
.
Você deve suportar todo o intervalo de caracteres permitido na definição de uma String pela sua linguagem de programação (na maioria dos casos, é Unicode). Exemplo, usando representação no estilo JSON para caracteres não imprimíveis (\ u + 4 dígitos):
"\u0000\u0001\u0002\u0003the Force of the firsT"
|
V
"\u0000\u0001\u0002\u0003the First of the forcE"
[Ff]
não estiver lá, você não deverá substituir a palavra.Respostas:
Retina , 33 bytes
Experimente online!
Editar: salvou 5 bytes graças a @MartinEnder por apontar o que
Ro
faz.fonte
Ro
.R
efeitos dos intervalos; por exemplo, eu nunca teria percebido que issoRE
é equivalente a86420
se você não tivesse apontado isso.JavaScript (ES6),
9388 bytesEditar: salvou 5 bytes otimizando a caixa de letra inalterada.
fonte
APL (Dyalog) , 61 bytes
Requer
⎕IO←0
qual é o padrão em muitos sistemas. Pode ter quatro caracteres mais curtos usando o símbolo Unicode em⍠
vez de⎕OPT
.Experimente online!
fonte
PHP, 88 bytes
Versões Online
PHP, 110 bytes
fonte
$t[0]^first^force
vez destrtr()
.Perl 5 , 52 bytes
51 bytes de código +
-p
sinalizador.Experimente online!
Nada muito louco acontecendo. Encontre as ocorrências de
force
e quefirst
não diferenciam maiúsculas de minúsculas (s%force|first%%gi
) e depois translitera os caracteres para converter um no outro.fonte
CJam, 66 bytes
Passa por todas as variações de casos "primeiro" e "força" e tenta se dividir. Se puder, ele volta a juntar as palavras inversas.
Pseudo-código:
fonte
f
é relevante para evitar mudarthirst
para dentrothorce
oudivorce
para dentrodivirst
?Java 7,
318310 bytesOk, isso foi muito difícil em Java ..
Explicação:
Código do teste:
Experimente aqui.
Resultado:
fonte
c(c("..."))
!Geléia ,
3736 bytesExiste uma maneira de usar uma redução entre fatias de comprimento 5?
Experimente online!
Quão?
fonte
MATL , 47 bytes
Experimente online!
Isso usa valores negativos como etapa intermediária e, após as duas passagens, assume o valor absoluto.
fonte
Pitão ,
3635 bytesExperimente online!
Pyth não é especialmente bom em manipulações de cordas.
fonte
Flex (lexer), 72 bytes
Para compilar e executar:
fonte
first.l:3: EOF encountered inside an action
(oh, deixa pra lá: requer uma nova linha no final) #ld: library not found for -lfl
(oh não importa, comando estágcc lex.yy.c -ll
no MacOS)Python 2, 171 bytes
Eu queria tentar fazer isso usando built-ins, mas ele não pode vencer o método confuso com toda a divisão e o zíper.
Eu acho que está bem claro o que estou fazendo aqui. Divida a sequência nas instâncias first e force (sem distinção entre maiúsculas e minúsculas), substitua essas instâncias por versões traduzidas usando str.translate e junte-a novamente a uma sequência.
Experimente online!
fonte
Python 2.7,
173165 bytes8 bytes salvos por quintopia
Este ficou nojento:
Experimente online
Dividindo passo a passo:
S.lower().split("force")
: pegue a string, unifique em minúsculas, divida em substrings separados por"force"
s.replace("first","force")for s in <STEP 1>
: Substitua todos"first"
por"force"
_`.join("first".join(<STEP 2>)`[2::5]`_
: Substituir todos os"force"
's com"first"
recombinando as"force"
substrings delineadas com"first"
e voltar em seqüência única (sublinhados adicionado para obter carrapato marcas corrigir)zip(<STEP 3>,[(2,1)[l.isupper()]for l in S])
: zip cada caractere da frase substituída com a codificação de maiúsculas e minúsculas da sequência original (2 para letras minúsculas e 1 para letras maiúsculas)_`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_
: Restaura a caixa original e converte a lista em sequência de caracteres (sublinhados adicionados para obter as marcas de escala corretas)fonte
C (clang) ,
201183226214 bytesTinha alguns bugs ... Ainda precisa ser jogado bastante
(economizou 12 graças a ceilingcat)
Experimente online!
fonte
Bytes em C # 273
Experimente online!
Porta direta da resposta Java de Kevin Cruijssen , acontece quando se trata de obter o char em uma string em um determinado índice, o C # é muito mais golfista que o java (em
s[i++]
vez des.charAt(i++)
)fonte
Japonês , 41 bytes
Experimente online!
Isso seria consideravelmente mais curto se Japt tivesse uma função transliterada sã ...
Versão alternativa:
Experimente online!
fonte
C #, 235 caracteres
fonte
Ruby , 55 bytes
Experimente online!
fonte
Java, 382 bytes não comptent
Experimente on-line
fonte
"The first, force,|first'forced!"
? Além disso, você pode jogar um pouco seu código atual:if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))
->,z
afterString s=""
ez=w.toLowerCase();if(z.equals("force")|z.equals("first"))
. Além disso,'O'
pode ser79
,'C'
pode ser67
e'E'
pode ser69
. E oif
else
pode ser substituído por um grande ternário if-else, já que ambos o fazems+=
.non competent
no títuloC # (269 bytes)
ainda outra solução c #, apenas a segunda menor porque eu declarei duas variáveis e, portanto, não posso usar a sintaxe lambda. oh bem, eu me diverti. :)
explicação:
mude a string original e divida em "FORCE" e "PRIMEIRO".
agregue os resultados e, em cada divisão, localize a subcadeia de cinco caracteres usada para dividir a cadeia original usando o comprimento até agora da cadeia agregada. se fosse "força", faça "primeiro" e vice-versa
fonte