Por que 6 teve medo de 7?

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

  • Por que o Vista tinha medo do 7? Porque 7 8 10.
  • Outro caso de teste 68978966897896 = > 68977
  • @ThomasKwa Oh, entendi: a Microsoft pulou o Windows 9 porque estava concordando com a charada. 😉
  • Por que medo de sete era cinco? Porque seis sete oito. –Yoda
  • Seis estava com medo, sete porque sete tinham olhos frios e mortos.

Resposta

Retina , 12

Tradução da resposta sed :

6*7(6|89)* 7 

Experimente online

Comentários

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 retornar 77, mas em vez disso retorna 677
  • Você pode usar s/67|7(6|89)/7/ em vez de s/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 que 7 seja substituído por 7 ad infinitum?
  • @DigitalTrauma Ele troca 7 com 7 então começa novamente na próxima posição, trabalhando seu caminho até o final. :g é a abreviação de :global não repeat 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 como while 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 ou 79999.
  • @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 

Experimente aqui.

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 de size.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() e gsub() 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 deixar gsub 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 uso ruby -pe "gsub /6*7(6|89)*/,?7" para um total de 20 + 1 bytes

Resposta

Japt , 15 bytes

Ur"6*7(89|6)*"7 

Solução RegEx simples

Experimente online

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 em 78976`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 

Experimente online !

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)  

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *