Por que 6 tinha medo de 7? Porque 7 8 9!
Dado um string, aplique as seguintes transformações:
- Se houver um 6 próximo a um 7 remova o 6 (6 está com medo de 7)
- Se a sequência “789” aparecer, remova o 8 e o 9 (7 ate 9)
(Se não me engano, não importa a ordem em que você faz as transformações)
Continue aplicando essas transformações até não poder mais.
Exemplo:
78966
Primeiro vemos “789”, então a string se torna “766”. Então vemos “76”, retiramos 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
Comentários
Resposta
Resposta
Javascript ES6, 29 bytes
s=>s.replace(/6*7(89|6)*/g,7)
Teste:
f=s=>s.replace(/6*7(89|6)*/g,7) ;`987 -> 987 6 7 -> 6 7 676 -> 7 7896789 -> 77 7689 -> 7 abcd -> abcd` .split`\n`.every(t=>(t=t.split` -> `)&&f(t[0])==t[1])
Comentários
- Ótimo, e como 9 é comido, você só tem 2 bytes e ganha com esta resposta: P
Resposta
Java, 126 81 66 58 bytes
Obrigado a @GamrCorps por fornecer a versão lambda deste código!
Obrigado a @ user902383 por apontar um truque de autoboxing!
. ..yup.
Na verdade, é mais longo do que eu esperado – Java substitui itens em strings com replaceAll()
uma vez por correspondência, não repetidamente até que pare de mudar. Então, eu tive que usar um loop extravagante para.
Forma lambda:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Forma de função:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Código não testado sem golfe:
class B{ public static void main(String[]a){ System.out.print(new B().s(a[0])); } String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;} }
Comentários
- Por que não ir com um lambda? Economiza pelo menos 15 bytes
- @GamrCorps Não ‘ não sei como expressar isso – nunca use funções.
- o que ‘ é o ponto de interface e não a classe?
- @eis Interface remove a necessidade de declarar main como public, o que oferece a menor vantagem. Veja: codegolf.stackexchange.com/a/64713/44713
- @ user902383 A redução que você ‘ re-fazer é mudando
.equals
para!=
, que não faz a mesma coisa.==
(ou!=
) compara por localização hexadecimal do objeto, não por valor. Caso contrário, ele ‘ tem o mesmo comprimento.while()
tem 7 bytes,for(;;)
tem 7 bytes.
Resposta
GNU Sed, 17
A pontuação inclui +1 para a opção -r
.
s/6*7(6|89)*/7/g
Comentários
- Não ‘ funciona para
67789
deve retornar77
, mas em vez disso retorna677
- Você pode usar
s/67|7(6|89)/7/
em vez des/6?7(6|89)/7/
- Nossa, me pergunto de onde Larry teve a ideia de
s///g
?
Resposta
Perl 6 , 19 18 bytes
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
(Observe que [6|89]
é o não captur versão original de (6|89)
que é soletrado como (?:6|89)
em Perl 5.<[6|89]>
é como você escreveria o que é escrito como [6|89]
em Perl 5)
uso:
$ perl6 -pe "s:g/6*7[6|89]*/7/" <<< " 987 6 7 6676689 7896789 7689 abcd 68978966897896 79|689 "
987 6 7 7 77 7 abcd 68977 79|689
Comentários
- Eu não ‘ não conheço Perl 6, mas presumo esta é uma substituição repetida. Se
6*
e[6|89]*
não ‘ corresponderem a nada , o que impede que7
seja substituído por7
ad infinitum? - @DigitalTrauma Ele troca
7
com7
então começa novamente na próxima posição, trabalhando seu caminho até o final.:g
é a abreviação de:global
nãorepeat until it doesn't match anymore
. - @DigitalTrauma Para obter
s/67|76|789/7/
para trabalhar em Eu teria que escrever como algo no sentido de:while s/67|76|789/7/ {}
que, obviamente, nunca pararia se você escrevesse comowhile s/6*7[6|89]*/7/ {}
como você esperaria. Além disso, o final do comentário anterior pode parecer mesquinho, ou seja, não como foi iniciado - Deveria ‘ t o
[]
seja alterado para()
? Você não ‘ deseja corresponder a tubos ou79999
. - @jwodder Não
[]
é a versão Perl 6 sem captura de()
, o que você está pensando é escrito como<[6|89]>
em Perl 6 .
Resposta
Pyth, 17 bytes
u:G"67|76|789"\7z
Leaky Nun superou isso por um byte nos comentários.
Comentários
Resposta
Perl 5 , 17 bytes
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
Uso:
$ perl -pe "s/6*7(6|89)*/7/g" <<< " 987 6 7 6676689 7896789 7689 abcd 68978966897896 "
987 6 7 7 77 7 abcd 68977
Resposta
Mathematica, 52 bytes
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
Explicação:
& A function returning & a function returning # its first argument StringReplace[ , ] with "67" "67" | or "76" "76" | or "789" "789" -> replaced with "7" "7" ~FixedPoint~ applied to # its first argument until it no longer changes.
Comentários
- O código jogado é mais claro do que o código de explicação .. 🙂
- @Rob Haven ‘ t dei muitas explicações antes, optando por uma abordagem sistemática.
- Eu só estava brincando, cara 🙂
Resposta
Rust, 96 bytes
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Desesperadamente longo, como de costume para Rust …
Ungolfed:
fn seven_ate_nine(mut str: String) -> String { for _ in 0..str.len() { for to_replace in &["67","76","789"] { str = str.replace(to_replace, "7"); } } s }
Comentários
- Pelo menos ‘ não é Java
Resposta
Emacs Lisp, 59 bytes
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Fica um pouco mais claro com espaços:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Resposta
Ruby, 27 bytes
Esta solução vem de comentários, crédito a Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7}
Ruby, 37 bytes
(solução antiga)
Esta solução usa o fato de que você nunca precisará substituir mais vezes do que caracteres na string.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Comentários
- Você pode usar
chars
em vez desize.times
para salvar alguns bytes. - O Ruby ‘ t Ruby tem o sinalizador global para substituição regex ou isso levaria mais bytes para ativar?
- @ BradGilbertb2gills , em Ruby é como em Awk: existem métodos
sub()
egsub()
separados para substituir primeiro ou todos. Portanto, global tem apenas um caractere a mais. - @manatwork Então, eu escreveria algo como:
->s{s.gsub /6*7(6|89)*/,'7'}
e deixargsub
faz todo o trabalho de loop. - Se eu entendi as regras dos sinalizadores de linha de comando corretamente, você poderia economizar 16 bytes usando o sinalizador de linha de comando -p (+1) tornando-o
gsub /6*7(6|89)*/,?7
com usoruby -pe "gsub /6*7(6|89)*/,?7"
para um total de 20 + 1 bytes
Resposta
Resposta
PowerShell, 27 bytes
$args-replace"6*7(89|6)*",7 e.g. PS C:\temp> .\ate.ps1 "7689" 7 PS C:\temp> .\ate.ps1 "abcd" abcd PS C:\temp> .\ate.ps1 "68978966897896" 68977
Fazendo uso de:
- o padrão regex de outra pessoa
- o caminho
-replace
faz uma substituição global por padrão no PowerShell - desenrolamento de loop, onde aplicará o operador
-regex
à matriz$args
aplicando-o a todos os elementos individualmente, e há apenas um elemento aqui porque há apenas um parâmetro de script, então funciona bem e podemos evitar para indexar o elemento[0]
.
Uma nova tentativa anterior antes de realizar uma substituição global bastaria; 74 bytes de construção de uma cadeia de “-replace -replace -replace” usando a multiplicação de string, tantas vezes quanto o comprimento da string e, em seguida, eval () ing:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(Com um pouco de substituição de string para encurtar o número de substituições).
Resposta
MATL , 17 bytes
jt""789|76"55cYX]
Exemplo
>> matl > jt""789|76"55cYX] > > 7896789 77
EDITAR : Experimente online!
Explicação
j % input string t % duplicate " % for each character. Iterates as many times as the string length "789|76" % regular expression for replacement 55c % string to insert instead: character "7" YX % regexprep ] % end for
Isso funciona aplicando uma substituição de expressão regular para tantas vezes quanto houver caracteres na string original . Isso é suficiente, pois cada substituição reduz o número de caracteres.
Resposta
Sério, 29 bytes
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
Aceita a entrada como uma string entre aspas duplas, como "6789"
. Experimente online (você precisará citar manualmente a entrada).
Explicação:
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n ,;l get input and push its length (we"ll call it n) ` `n call the following function n times: "7;;"67"(Æ replace all occurrences of "67" with "7" "76"(Æ replace all occurrences of "76" with "7" "789"(Æ replace all occurrences of "789" with "7"
Resposta
PHP, 36 bytes
preg_replace("/6*7(6|89)*/","7",$a);
solução regex, pega $ uma string e substitui por meio da expressão.
Comentários
- GET parâmetros não são aceitáveis como método de entrada em PHP . Você precisará tornar isso uma função e passar a entrada como parâmetros de função ou obter a entrada de
$argv
ou STDIN. - @Mego Parece não haver consenso sobre a postagem que você vinculou.
- @immibis Correto. É necessário um consenso para tornar um método de E / S aceitável. A falta de um significa que não é aceitável.
- TL; DR você tem sérias desvantagens se usar PHP para codegolf.
Resposta
Qui , 26 bytes
67::=7 76::=7 789::=7 ::=
incluindo uma nova linha à direita.
A entrada é anexada ao programa antes de iniciá-lo.
A saída é lida no estado do programa quando ele termina, de forma semelhante a uma máquina de Turing.
(Thue tem um fluxo de saída, mas é difícil de usar corretamente, então não tenho certeza se este é um método de saída aceitável)
Comentários
- Eu não ‘ não penso assim. Se você tem uma maneira de STDOUT, você precisa. Desculpe!
- Sim, isso é permitido de acordo com a meta postagem.
Resposta
CJam, 70 64 bytes
Obrigado 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 disso provavelmente poderia ser jogado muito mais golfe e sua ajuda seria muito apreciada, mas, francamente, estou muito feliz por ter conseguido a resposta. Esta foi minha primeira tentativa de escrever CJam.
Explicação:
"67":I e# Assign the value of 67 to I q:A e# Read the input and assign to A { e# Opening brackets for loop AI#:B) e# Get the index of I inside A and assign to B. The increment value by 1 to use for if condition (do not want to process if the index was -1) { e# Open brackets for true result of if statement AB< e# Slice A to get everything before index B 7+ e# Append 7 to slice A{BI,+}~> e# Slice A to get everything after index B plus the length of string I (this will remove I entirely) +s:A e# Append both slices, convert to string, and assign back to A ]; e# Clear the stack } e# Closing brackets for the if condition { e# Open brackets for false result of if statement "76"I= e# Check if I is equal to 76 "789" e# If I is 76, make I 789 "76"?:I e# If I is not 76, make I 76 ]; e# Clear the stack if I does not exist inside A }? e# Closing brackets for false result of if statement }/ e# Loop A e# Output A
Comentários
- Eu não ‘ tentei esta pergunta eu mesmo, então ‘ não tenho certeza se esta é a melhor abordagem, mas se você quiser dividir e juntar, dê uma olhada em
/
e*
. Observe também que pensar em termos de pilhas quando ‘ está acostumado com linguagens semelhantes a C s alguma adaptação. Por exemplo.{"789":I}{"76":I}?
pode retirar a atribuição para se tornar"789""76"?:I
, que pode ser posteriormente jogado em78976`3/?:I
. - Obrigado! Não consegui ‘ não entender muito bem como usar sua segunda sugestão.
- Desculpe, erro meu.
78976`3/
fornece uma matriz["789" "76"]
; então, em vez de usar?
, você precisaria usar=
para indexar; mas está ‘ de trás para frente, então precisaria que o índice fosse invertido, perdendo a vantagem.
Resposta
R, 35 bytes
cat(gsub("6*7(6|89)*",7,scan(,"")))
Eu não sabia que poderia usar gsub
desta forma, um grande obrigado por cada resposta aqui que me fez aprender algo novo.
Resposta
/// , 19 bytes (não competidores)
/67/7//76/7//789/7/
Você não pode realmente fornecer entrada neste idioma, então a suposta entrada vai para a direita do código.
Comentários
- Observe que Itflabtijtslwi é barras, mas com entrada.
- @FryAmTheEggman Embora aquele insira caracteres , não strings .
- Parece que falta uma barra em seu link.
Resposta
PHP 51 caracteres
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Caso de teste escrito por extenso
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
Isso faz a comparação da string e a substituição da string na condição while. Se a condição while for atendida, ele atualiza o lado esquerdo da comparação com o resultado. Avise-me sobre quaisquer melhorias.
Resposta
Jolf , 15 bytes
Experimente aqui! Eu realmente preciso explicar?
pi"6*7(6|89)*"7 p replace any entity in i the input "6*7(6|89)*" that matches this regex 7 with 7 implicit output
Resposta
Clojure, 71 bytes
Clojure é menos do que ideal para jogar golfe devido ao seu natureza verbosa – mas mesmo assim é um exercício interessante:
Versão com golfe, usando interoperabilidade Java:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Versão sem golfe, usando a interoperabilidade Java:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Sem golfe ” Clojure puro ” versão:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
Resposta
Bash, 102 82 67 (+7)? bytes
versão extglob
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
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 conta para bytes.
Obrigado a @BinaryZebra por apontar os recursos do extglob!
Versão não extglob (82 bytes)
x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v
Isso deve ser colocado em um arquivo e chamado com, por exemplo ./789.sh 65678989656
.
Faz uso da expansão do parâmetro para pesquisar e substituir em um loop. Envolvi uma série de expansões para fazer a substituição, uma vez que “não tenho conhecimento de uma maneira de expandir as cadeias de maneira mais eficaz.
Comentários
- Bem-vindo ao PPCG!
- @BinaryZebra Ah, obrigado pela sintaxe
@()
. Eu sabia que deveria haver uma maneira de combiná-los. E @Mego, obrigado pela recepção !
Resposta
Python 3, 46 bytes
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
Resposta
Japt v2.0a0, 12 bytes
e/6?7(6|89/7
Como funciona
String.e
é a função de substituição recursiva. Japt 2 tem uma nova sintaxe regex e preenchimento automático de parênteses dentro de regex, o que salva um byte aqui. (No Japt 1.x, tínhamos que passar strings no lugar de regexes, o que era meio desajeitado.)
Resposta
Dyalog APL , 17 bytes
"6*7(6|89)*"⎕R"7"
"6*
qualquer número de seis
7
seguido por um sete
(
… )*"
seguido por zero ou mais sequências de…
6|89
um seis ou oito-nove
⎕R
R substitua por
"7"
a sete
Resposta
05AB1E , 12 bytes
Δ67‚7:789¬:
Experimente online ou verifique todos os casos de teste .
Explicação:
Δ # Continue doing the following until it no longer changes: 67 # Push 67 to the stack  # Bifurcate (short for Duplicate & Reverse); which pushes 76 to the stack ‚ # Pair them up 7: # Replace all occurrences of 67 or 76 with 7 in the (implicit) input # i.e. 17893762 → 1789372 789 # Push 789 to the stack ¬ # Take the head (without popping); which pushes 7 to the stack : # Replace all 789 with 7 # i.e. 1789372 → 17372 # (And implicitly output the result after the loop)
68978966897896
= >68977