Por que 6 tinha medo de 7? Porque 7 8 9!
Dada uma sequência, aplique as seguintes transformações:
- Se houver um 6 próximo a um 7, remova o 6 (6 tem medo de 7)
- Se a sequência "789" aparecer, remova os 8 e os 9 (7 e 9)
(Se não me engano, não importa em que ordem você faz as transformações)
Continue aplicando essas transformações até que você não possa mais.
Exemplo:
78966
Primeiro, vemos "789", então a string se torna "766". Então vemos "76", então tiramos o 6 e a string se torna "76". Então vemos "76" novamente, então ficamos com "7".
Casos de teste:
987
=>987
(Não está na ordem certa. Não faz nada.)6 7
=>6 7
(O espaço em branco atua como um buffer entre 6 e 7. Nada acontece)676
=>7
7896789
=>77
7689
=>7
abcd
=>abcd
68978966897896
=>68977
Respostas:
Retina , 12
Tradução da resposta sed:
Experimente online
fonte
Javascript ES6, 29 bytes
Teste:
fonte
Java,
126816658 bytesObrigado a @GamrCorps por fornecer a versão lambda deste código!
Obrigado a @ user902383 por apontar um truque de caixa automática!
...Sim.
Na verdade, é mais longo do que eu esperava - o Java substitui itens em cadeias por
replaceAll()
uma vez por correspondência, não repetidamente até que ele pare de mudar. Então eu tive que usar um laço for chique.Formulário Lambda:
Formulário de função:
Código não testável testável:
fonte
.equals
para!=
, que não faz a mesma coisa.==
(ou!=
) compara pela localização hexadecimal do objeto, não pelo valor. É o mesmo comprimento caso contrário.while()
é 7 bytes,for(;;)
é 7 bytes.GNU Sed, 17
A pontuação inclui +1 para a
-r
opção.fonte
67789
deve retornar,77
mas retorna677
s/67|7(6|89)/7/
vez des/6?7(6|89)/7/
s///g
?Perl 6 ,
1918 bytes(Observe que
[6|89]
a versão não-capturada(6|89)
está escrita como(?:6|89)
no Perl 5.<[6|89]>
é como você escreveria o que está escrito como[6|89]
no Perl 5)uso:
fonte
6*
oe o[6|89]*
não correspondem a nada, o que impede o7
substituto de7
ad infinitum?7
com e7
então começa novamente na próxima posição, trabalhando até o fim.:g
é curto para:global
nãorepeat until it doesn't match anymore
.s/67|76|789/7/
para trabalhar667
eu teria que escrevê-lo como algo para o efeito de:while s/67|76|789/7/ {}
o que naturalmente nunca iria parar se você escreveu-o comowhile s/6*7[6|89]*/7/ {}
como seria de esperar. Além disso, o final do comentário anterior pode parecer[]
ser alterado para()
? Você não quer combinar cachimbos ou79999
.[]
é a versão Perl 6 não-captura de()
, o que você está pensando é grafada como<[6|89]>
em Perl 6.Pitão, 17 bytes
Experimente aqui.
Leaky Nun superou isso por um byte nos comentários.
fonte
Perl 5 , 17 bytes
uso:
fonte
Mathematica, 52 bytes
Explicação:
fonte
Ferrugem, 96 bytes
Irremediavelmente longa, como de costume para Rust ...
Ungolfed:
fonte
Emacs Lisp, 59 bytes
Torna-se um pouco mais claro com espaços:
fonte
Ruby, 27 bytes
Esta solução é de comentários, crédito para Brad Gilbert b2gills .
Ruby, 37 bytes
(solução antiga)
Esta solução usa o fato de que você nunca precisará substituir mais vezes do que caracteres na sequência.
fonte
chars
vez desize.times
salvar alguns bytes.sub()
egsub()
métodos separados para substituir primeiro ou todos. Tão global é apenas um personagem a mais.->s{s.gsub /6*7(6|89)*/,'7'}
e deixareigsub
fazer todo o trabalho de loop.gsub /6*7(6|89)*/,?7
em usoruby -pe "gsub /6*7(6|89)*/,?7"
para um total de 20 + 1 bytesJaponês , 15 bytes
Solução RegEx simples
Experimente online
fonte
PowerShell, 27 bytes
Fazendo uso de:
-replace
que uma substituição global é padrão no PowerShell-regex
operador à matriz$args
, aplicando-o a todos os elementos individualmente, e há apenas um elemento aqui, porque há apenas um parâmetro de script, para que funcione bem e podemos evitar a indexação do elemento[0]
.A tentativa anterior da novidade antes de realizar uma substituição global faria isso; 74 bytes de construção de uma cadeia de "-replace -replace -replace" usando a multiplicação de cadeias de caracteres, quantas vezes o comprimento da cadeia de caracteres, e depois avaliando ():
(Com um pouco de substituição de cadeia para reduzir o número de substituições).
fonte
CJam,
7064 bytesAgradecimentos a Peter Taylor por cortar
{"789":I}{"76:":I}?
para"789""76"?:I
"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I={"789":I}{"76":I}?];}?}/A"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I="789""76"?:I];}?}/A
Eu sei que isso provavelmente poderia ser muito mais jogado e sua ajuda seria muito apreciada, mas, francamente, estou feliz por ter conseguido a resposta. Esta foi minha primeira tentativa de escrever CJam.
Explicação:
fonte
/
e*
. Observe também que pensar em termos de pilhas quando você está acostumado a linguagens do tipo C exige alguma adaptação. Por exemplo,{"789":I}{"76":I}?
pode retirar a tarefa para se tornar"789""76"?:I
, a qual pode ser ainda mais jogada78976`3/?:I
.78976`3/
dá uma matriz["789" "76"]
; então, em vez de usar,?
você precisaria usar=
para indexar; mas é de trás para frente, portanto, seria necessário inverter o índice, perdendo a vantagem.MATL , 17 bytes
Exemplo
EDIT : Experimente online!
Explicação
Isso funciona aplicando uma substituição de expressão regular quantas vezes houver caracteres na sequência original . Isso é suficiente, pois cada substituição reduz o número de caracteres.
fonte
Sério, 29 bytes
Recebe entrada como uma cadeia de caracteres entre aspas duplas, como
"6789"
. Experimente online (você precisará citar manualmente a entrada).Explicação:
fonte
Ter , 26 bytes
incluindo uma nova linha à direita.
A entrada é anexada ao programa antes de iniciá-lo.
A saída é lida no estado do programa quando termina, da mesma forma que uma máquina de Turing.
(Thue faz ter um fluxo de saída, mas é difícil de usar corretamente, então eu não tenho certeza se este é um método de saída aceitável)
fonte
Bash,
1028267 (+7)? bytesversão extglob
Isso deve ser colocado em um arquivo e chamado com, por exemplo
bash -O extglob 789.sh 6567678989689789656
. O (+7)? bytes é para se a opção extglob contar para bytes.Obrigado ao @BinaryZebra por apontar os recursos do extglob!
Versão não extglob (82 bytes)
Isso deve ser colocado em um arquivo e chamado com, por exemplo
./789.sh 65678989656
.Utiliza a expansão de parâmetros para pesquisar e substituir em um loop. Envolvi uma série de expansões para fazer a substituição, pois não conheço uma maneira de encadear expansões com mais eficiência.
fonte
@()
sintaxe. Eu sabia que tinha que haver uma maneira de combinar isso. E @Mego, obrigado pelas boas-vindas!R, 35 bytes
Eu não sabia que poderia usar
gsub
dessa maneira, um grande obrigado por todas as respostas aqui que me fizeram aprender algo novo.fonte
PHP 51 caracteres
Caso de teste escrito em mão longa
Isso faz a comparação de cadeias e as cadeias substituem ambas na condição while. Se enquanto condição for atendida, ele atualiza a mão esquerda da comparação com o resultado. Deixe-me saber de quaisquer melhorias.
fonte
Jolf , 15 bytes
Experimente aqui! Eu realmente tenho que explicar?
fonte
PHP, 36 bytes
solução regex, pega $ a string e substitui pela expressão
fonte
$argv
ou STDIN.Clojure, 71 bytes
Clojure é menos do que o ideal para o golfe devido à sua natureza detalhada - mas, no entanto, é um exercício interessante:
Versão com golfe, usando interoperabilidade Java:
Versão sem golfe, usando interoperabilidade Java:
Versão "pura Clojure" sem golfe:
fonte
/// , 19 bytes (não concorrente)
Você não pode realmente fornecer entrada nesse idioma; portanto, a suposta entrada vai para a direita do código.
fonte
Python 3, 46 bytes
fonte
Japt v2.0a0, 12 bytes
Experimente online!
Como funciona
String.e
é função de substituição recursiva. O Japt 2 possui uma nova sintaxe regex e o preenchimento automático de parênteses dentro do regex, o que economiza um byte aqui. (No Japão 1.x, tivemos que passar as strings no lugar das expressões regulares, o que era meio desajeitado.)fonte
Dyalog APL , 17 bytes
'6*
qualquer número de seis7
seguido por sete(
...)*'
seguido por zero ou mais seqüências de ...6|89
seis ou oito e nove⎕R
R EColoque que com'7'
pois mesmofonte
05AB1E , 12 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte