¿Por qué 6 tenía miedo de 7?

¿Por qué 6 tenía miedo de 7? ¡Porque 7 8 9!

Dada una cadena, aplique las siguientes transformaciones:

  • Si hay un 6 al lado de un 7, elimine el 6 (6 tiene miedo de 7)
  • Si aparece la secuencia «789», elimine el 8 y el 9 (7 comió 9)

(Si no me equivoco, no importa en qué orden hagas las transformaciones)

Sigue aplicando estas transformaciones hasta que ya no puedas.

Ejemplo:

78966

Primero vemos «789», por lo que la cadena se convierte en «766». Luego vemos «76», así que sacamos el 6 y la cadena se convierte en «76». Luego vemos «76» nuevamente, así que nos quedamos con «7».

Casos de prueba:

  • 987 = > 987 (No en el orden correcto. No hace nada.)
  • 6 7 => 6 7 (El espacio en blanco actúa como un búfer entre 6 y 7. No ocurre nada)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

Comentarios

  • ¿Por qué Vista tenía miedo de 7? Porque 7 8 10.
  • Otro caso de prueba 68978966897896 = > 68977
  • @ThomasKwa Oh, lo entiendo: Microsoft omitió Windows 9 porque estaban de acuerdo con el acertijo. 😉
  • ¿Por qué miedo a siete era cinco? Porque seis siete ocho. –Yoda
  • Seis tenía miedo a siete porque siete tenían ojos fríos y muertos.

Respuesta

Retina , 12

Traducción de la respuesta sed :

6*7(6|89)* 7 

Pruébelo en línea

Comentarios

Respuesta

Javascript ES6, 29 bytes

s=>s.replace(/6*7(89|6)*/g,7) 

Prueba:

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]) 

Comentarios

  • Genial, y como se come 9, solo tienes 2 bytes y ganas con esta respuesta: P

Respuesta

Java, 126 81 66 58 bytes

¡Gracias a @GamrCorps por proporcionar la versión lambda de este código!

¡Gracias a @ user902383 por señalar un truco de autoboxing!

. ..yup.

En realidad, es más largo que yo esperado: Java reemplaza los elementos en cadenas con replaceAll() una vez por coincidencia, no repetidamente hasta que deje de cambiar. Así que tuve que usar un bucle for elegante.

Forma Lambda:

x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Forma de función:

String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Código comprobable sin golf:

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;} }

Comentarios

  • ¿Por qué no ir con una lambda? Ahorrará al menos 15 bytes
  • @GamrCorps No ‘ no sé cómo expresar eso, nunca use funciones.
  • qué ‘ ¿es el punto de la interfaz y no la clase?
  • @eis La interfaz elimina la necesidad de declarar main como público, lo que da la más mínima ventaja. Consulte: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 La reducción que ‘ rehacer es cambiando .equals a !=, que no hace lo mismo. == (o !=) compara por ubicación hexadecimal del objeto, no por valor. De lo contrario, ‘ tiene la misma longitud. while() tiene 7 bytes, for(;;) tiene 7 bytes.

Respuesta

GNU Sed, 17

La puntuación incluye +1 para la opción -r.

s/6*7(6|89)*/7/g 

Comentarios

  • No ‘ t funciona para 67789 debería devolver 77 pero en su lugar devuelve 677
  • Puede usar s/67|7(6|89)/7/ en lugar de s/6?7(6|89)/7/
  • Vaya, me pregunto de dónde se le ocurrió a Larry la idea de s///g?

Respuesta

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  

(Tenga en cuenta que [6|89] no es captur ing versión de (6|89) que se escribe como (?:6|89) en Perl 5.<[6|89]> es cómo escribirías lo que «se escribe como [6|89] en 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  

Comentarios

  • No ‘ no conozco Perl 6, pero supongo esta es una sustitución repetida. Si 6* y [6|89]* no ‘ no coinciden , ¿qué impide que 7 se sustituya por 7 ad infinitum?
  • @DigitalTrauma Se intercambia 7 con 7 luego comienza de nuevo en la siguiente posición, avanzando hasta el final. :g es la abreviatura de :global no repeat until it doesn't match anymore.
  • @DigitalTrauma Para obtener s/67|76|789/7/ trabajar en Tendría que escribirlo como algo como: while s/67|76|789/7/ {} que, por supuesto, nunca se detendría si lo escribiera como while s/6*7[6|89]*/7/ {} como era de esperar. Además, el final del comentario anterior puede parecer mezquino, es decir no como se pretendía
  • No debería ‘ ¿cambiar [] a ()? No ‘ no desea hacer coincidir tuberías o 79999.
  • @jwodder No [] es la versión sin captura de Perl 6 de (), lo que está pensando se escribe como <[6|89]> en Perl 6 .

Respuesta

Pyth, 17 bytes

u:G"67|76|789"\7z 

Pruébelo aquí.

Leaky Nun ha superado esto por un byte en los comentarios.

Comentarios

Respuesta

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  

Responder

Mathematica, 52 bytes

StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#& 

Explicación:

 & 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. 

Comentarios

  • El código de golf es más claro que el código de explicación .. 🙂
  • @Rob Haven ‘ Hice muchas explicaciones antes, optando por un enfoque sistemático.
  • Solo estaba bromeando, amigo 🙂

Respuesta

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 largo, como es habitual para Rust …

Sin golf:

 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 }  

Comentarios

  • Al menos ‘ no es Java

Respuesta

Emacs Lisp, 59 bytes

(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s)) 

Se vuelve un poco más claro con espacios:

(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s)) 

Responder

Ruby, 27 bytes

Esta solución es de comentarios, crédito a Brad Gilbert b2gills .

->s{s.gsub /6*7(6|89)*/,?7} 

Ruby, 37 bytes

(solución anterior)

Esta solución utiliza el hecho de que nunca necesitará reemplazar más veces que caracteres en la cadena.

->s{s.chars{s.sub! /67|76|789/,?7};s} 

Comentarios

  • Puede usar chars en lugar de size.times para guardar algunos bytes.
  • ¿No ‘ t Ruby tiene la marca global para la sustitución de expresiones regulares, o necesitaría más bytes para habilitarla?
  • @ BradGilbertb2gills , en Ruby es como en Awk: hay métodos separados sub() y gsub() para reemplazar primero o todos. Entonces, global es solo un carácter más largo.
  • @manatwork Entonces escribiría algo como: ->s{s.gsub /6*7(6|89)*/,'7'}, y deje gsub hacer todo el trabajo de bucle.
  • Si comprendo correctamente las reglas de los indicadores de línea de comando, puede ahorrar 16 bytes utilizando el indicador de línea de comando -p (+1), lo que lo convierte en gsub /6*7(6|89)*/,?7 con uso ruby -pe "gsub /6*7(6|89)*/,?7" para un total de 20 + 1 bytes

Respuesta

Japt , 15 bytes

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

Solución de expresión regular simple

Pruébelo en línea

Responder

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 

Haciendo uso de:

  • el patrón de expresiones regulares de otra persona
  • la forma -replace realiza un reemplazo global por defecto en PowerShell
  • desenrollado de bucle, donde aplicará el operador -regex a la matriz $args aplicándolo a todos los elementos individualmente, y solo hay un elemento aquí porque solo hay un parámetro de secuencia de comandos, por lo que funciona bien y podemos evitar tener para indexar el elemento [0].

Un intento previo novedoso antes de realizar un reemplazo global lo haría; 74 bytes de construcción de una cadena de «-replace -replace -replace» usando la multiplicación de cadenas, tantas veces como la longitud de la cadena, luego eval () en:

""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex 

(Con un poco de sustitución de cadenas para acortar el número de reemplazos).

Responder

MATL , 17 bytes

jt""789|76"55cYX] 

Ejemplo

>> matl > jt""789|76"55cYX] > > 7896789 77 

EDIT : ¡Pruébelo en línea!

Explicación

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 

Esto funciona aplicando un reemplazo de expresión regular para tantas veces como caracteres haya en la cadena original . Esto es suficiente, ya que cada sustitución reduce el número de caracteres.

Responder

En serio, 29 bytes

,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n 

Toma la entrada como una cadena entre comillas dobles, como "6789". Pruébelo en línea (deberá citar manualmente la entrada).

Explicación:

,;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" 

Respuesta

PHP, 36 bytes

preg_replace("/6*7(6|89)*/","7",$a); 

solución regex, toma $ una cadena y reemplaza a través de la expresión.

Comentarios

  • GET los parámetros no son aceptables como método de entrada en PHP . Deberá convertir esto en una función y pasar la entrada como parámetros de función, u obtener la entrada de $argv o STDIN.
  • @Mego Parece que no hay consenso sobre la publicación a la que vinculó.
  • @immibis Correcto. Se requiere un consenso para que un método de E / S sea aceptable. La falta de uno significa que no es aceptable.
  • TL; DR tiene serias desventajas si usa PHP para codegolf.

Respuesta

Thue , 26 bytes

67::=7 76::=7 789::=7 ::= 

incluyendo un salto de línea final.

La entrada se agrega al programa antes de iniciarlo.
La salida se lee del estado del programa cuando termina, de manera similar a una máquina de Turing.
(Thue ¿ tiene un flujo de salida, pero es difícil de usar correctamente, así que no estoy seguro de si este es un método de salida aceptable)

Comentarios

  • No ‘ lo creo. Si tiene una forma de STDOUT, debe hacerlo. ¡Lo sentimos!
  • Sí, esto está permitido de acuerdo con la meta publicación.

Responder

CJam, 70 64 bytes

Gracias a @Peter Taylor por cortar {"789":I}{"76:":I}? a "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

Lo sé Probablemente se podría jugar mucho más al golf y su ayuda sería muy apreciada, pero, francamente, estoy feliz de haber conseguido la respuesta. Este fue mi primer intento de escribir CJam.

Explicación:

"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 

Comentarios

  • No he ‘ t intenté esta pregunta yo mismo, así que ‘ no estoy seguro de si este es el mejor enfoque, pero si quieres dividir y unir, echa un vistazo a / y *. También tenga en cuenta que pensar en términos de pilas cuando ‘ está acostumbrado a lenguajes de tipo C s alguna adaptación. P.ej. {"789":I}{"76":I}? puede retirar la asignación para convertirse en "789""76"?:I, que se puede jugar más en 78976`3/?:I .
  • ¡Gracias! Sin embargo, no pude ‘ entender muy bien cómo usar su segunda sugerencia.
  • Lo siento, mi error.78976`3/ da una matriz ["789" "76"]; entonces, en lugar de usar ?, necesitaría usar = para indexar; pero es ‘ al revés, por lo que sería necesario invertir el índice, perdiendo la ventaja.

Respuesta

R, 35 bytes

cat(gsub("6*7(6|89)*",7,scan(,""))) 

No sabía que podía usar gsub de esta manera, un gran agradecimiento por cada respuesta aquí que me hizo aprender algo nuevo.

Responder

/// , 19 bytes (no competitivo)

/67/7//76/7//789/7/ 

En realidad, no puede proporcionar entradas en este idioma, por lo que la supuesta entrada va a la derecha del código.

Comentarios

  • Tenga en cuenta que Itflabtijtslwi es barras pero con entrada.
  • @FryAmTheEggman Aunque ese ingresa caracteres , no cadenas .
  • Parece que a su enlace le falta una barra.

Responder

PHP 51 caracteres

while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;} 

Caso de prueba escrito a mano

$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7; 

Esto hace la comparación de cadenas y la cadena reemplaza ambas en la condición while. Si se cumple la condición while, actualiza la parte izquierda de la comparación con el resultado. Infórmeme de cualquier mejora.

Respuesta

Jolf , 15 bytes

Pruébelo aquí ¿De verdad tengo que explicarlo?

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 

Respuesta

Clojure, 71 bytes

Clojure es menos que ideal para jugar al golf debido a su naturaleza prolija, pero no obstante es un ejercicio interesante:

Versión golf, usando interoperabilidad Java:

(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x)))) 

Versión sin golf, usando la interoperabilidad de Java:

(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x)))) 

Sin golf » puro Clojure » versión:

(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x)))) 

Responder

Bash, 102 82 67 (+7)? bytes

versión extglob

 x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v  

Esto está destinado a colocarse en un archivo y llamarse, por ejemplo, con bash -O extglob 789.sh 6567678989689789656. ¿El (+7)? bytes es para si la opción extglob cuenta como bytes.

¡Gracias a @BinaryZebra por señalar las características de extglob!


Versión no 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  

Esto está destinado a colocarse en un archivo y llamarse con, por ejemplo, ./789.sh 65678989656.

Hace uso de la expansión de parámetros para buscar y reemplazar en un bucle. Hice una serie de expansiones para reemplazarlas, ya que no conozco una forma de encadenar expansiones de manera más eficaz.

Comentarios

  • Bienvenido a ¡PPCG!
  • @BinaryZebra Ah, gracias por la sintaxis @(). Sabía que tenía que haber una manera de combinarlos. Y @Mego, gracias por la bienvenida !

Respuesta

Python 3, 46 bytes

 import re lambda s:re.sub(r"6*7(6|89)*","7",s)  

Responder

Japt v2.0a0, 12 bytes

e/6?7(6|89/7 

Pruébelo en línea !

Cómo funciona

String.e es una función de reemplazo recursiva. Japt 2 tiene una nueva sintaxis de expresiones regulares y autocompletado de paréntesis dentro de expresiones regulares, lo que guarda un byte aquí. (En Japt 1.x, teníamos que pasar cadenas en lugar de expresiones regulares, lo cual era un poco torpe).

Respuesta

Dyalog APL , 17 bytes

"6*7(6|89)*"⎕R"7" 

"6* cualquier número de seis
7 seguido de un siete
()*" seguido de cero o más secuencias de…
6|89 un seis u ocho y nueve

⎕R R reemplace eso con

"7" un siete

Respuesta

05AB1E , 12 bytes

Δ67‚7:789¬: 

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

 Δ # 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)  

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *