Pourquoi 6 avait-il peur de 7?

Pourquoi 6 avait-il peur de 7? Parce que 7 8 9!

Étant donné une chaîne, appliquez les transformations suivantes:

  • Sil y a un 6 à côté dun 7, supprimez le 6 (6 a peur sur 7)
  • Si la séquence « 789 » apparaît, supprimez le 8 et le 9 (7 mangeaient 9)

(Si je « ne me trompe pas, il ne » t quel que soit lordre dans lequel vous effectuez les transformations)

Continuez à appliquer ces transformations jusquà ce que vous ne puissiez plus.

Exemple:

78966

Nous voyons dabord « 789 », donc la chaîne devient « 766 ». Ensuite, nous voyons « 76 », donc nous retirons le 6 et la chaîne devient « 76 ». Ensuite, nous voyons à nouveau « 76 », il nous reste donc « 7 ».

Cas de test:

  • 987 = > 987 (Pas dans le bon ordre. Ne fait rien.)
  • 6 7 => 6 7 (Lespace blanc agit comme un tampon entre 6 et 7. Rien ne se passe)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

Commentaires

  • Pourquoi Vista avait-il peur de 7? Parce que 7 8 10.
  • Un autre cas de test 68978966897896 = > 68977
  • @ThomasKwa Oh, je comprends: Microsoft a sauté Windows 9 parce quil acceptait lénigme. 😉
  • Pourquoi avoir peur de sept était cinq? Parce que six sept huit. –Yoda
  • Six avait peur de sept parce que sept avaient les yeux froids et morts.

Réponse

Retina , 12

Traduction de la réponse sed :

6*7(6|89)* 7 

Essayez-le en ligne

Commentaires

Réponse

Javascript ES6, 29 octets

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

Test:

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

Commentaires

  • Génial, et puisque 9 est mangé, vous navez que 2 octets et gagnez avec cette réponse: P

Réponse

Java, 126 81 66 58 octets

Merci à @GamrCorps pour avoir fourni la version lambda de ce code!

Merci à @ user902383 pour avoir signalé une astuce dautoboxing!

. ..yup.

Cest en fait plus long que moi attendu – Java remplace les éléments dans les chaînes par replaceAll() une fois par correspondance, pas de façon répétée jusquà ce quil cesse de changer. Jai donc dû utiliser une boucle for fantaisie.

Forme Lambda:

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

Forme de fonction:

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

Code non-golf testable:

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

Commentaires

  • Pourquoi ne pas aller avec un lambda? Économisera au moins 15 octets
  • @GamrCorps Je ne sais pas ‘ comment exprimer cela – nutilisez jamais de fonctions.
  • quoi = « 1002f10ca7 »>

est le point dinterface et non de classe?

  • @eis Interface supprime le besoin de déclarer main comme public, ce qui donne le moindre avantage. Voir: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 La réduction que vous ‘ se fait en remplaçant .equals par !=, ce qui ne fait pas la même chose. == (ou !=) compare par emplacement hexadécimal de lobjet, pas par valeur. Sinon, elle ‘ a la même longueur. while() fait 7 octets, for(;;) 7 octets.
  • Réponse

    GNU Sed, 17

    Le score inclut +1 pour loption -r.

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

    Commentaires

    • Ne fonctionne ‘ pour 67789 doit renvoyer 77 mais il renvoie à la place 677
    • Vous pouvez utiliser s/67|7(6|89)/7/ au lieu de s/6?7(6|89)/7/
    • Bon sang, je me demande où Larry a eu lidée de s///g?

    Réponse

    Perl 6 , 19 18 octets

     {S:g/6*7[6|89]*/7/} # 19 bytes  

     $ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes  

    (Notez que [6|89] est le non-captur version de (6|89) qui sécrit (?:6|89) en Perl 5.<[6|89]> est la façon dont vous écririez ce que « s orthographié comme [6|89] en Perl 5)

    utilisation:

     $ 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  

    Commentaires

    • Je ne ‘ ne connais pas Perl 6, mais je suppose il sagit dune substitution répétée. Si 6* et [6|89]* don ‘ ne correspondent à rien , quest-ce qui empêche le 7 dêtre remplacé par 7 à linfini?
    • @DigitalTrauma Il échange 7 avec 7 puis recommence à la position suivante, allant jusquà la fin. :g est labréviation de :global pas repeat until it doesn't match anymore.
    • @DigitalTrauma Pour obtenir s/67|76|789/7/ à travailler sur Je devrais lécrire comme quelque chose à leffet: while s/67|76|789/7/ {} qui, bien sûr, ne sarrêterait jamais si vous lécriviez comme while s/6*7[6|89]*/7/ {} comme vous vous en doutez. De plus, la fin du commentaire précédent peut sembler méchante, cest-à-dire pas comme il a été prévu
    • Ne devrait pas ‘ t le [] être remplacé par ()? Vous ne ‘ ne voulez pas faire correspondre les tuyaux ou 79999.
    • @jwodder Non [] est la version Perl 6 non capturante de (), ce à quoi vous pensez est orthographié <[6|89]> en Perl 6 .

    Réponse

    Pyth, 17 octets

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

    Essayez-le ici.

    Leaky Nun la devancé dun octet dans les commentaires.

    Commentaires

    Réponse

    Perl 5 , 17 octets

     perl -pe "s/6*7(6|89)*/7/g" # 16 + 1  

    utilisation:

     $ 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  

    Réponse

    Mathematica, 52 octets

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

    Explication:

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

    Commentaires

    • Le code golfé est plus clair que le code dexplication .. 🙂
    • @Rob Haven ‘ Jai déjà fait de nombreuses explications, en optant pour une approche systématique.
    • Je taquinais juste, mon pote 🙂

    Réponse

    Rouille, 96 octets

     fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}  

    Désespérément long, comme dhabitude pour Rust …

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

    Commentaires

    • Au moins ‘ nest pas Java

    Réponse

    Lisp Emacs, 59 octets

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

    Cela devient un peu plus clair avec les espaces:

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

    Réponse

    Ruby, 27 octets

    Cette solution est issue des commentaires, crédit à Brad Gilbert b2gills .

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

    Ruby, 37 octets

    (ancienne solution)

    Cette solution utilise le fait que vous naurez jamais besoin de remplacer plus de fois que de caractères dans la chaîne.

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

    Commentaires

    • Vous pouvez utiliser chars au lieu de size.times pour en enregistrer quelques-uns octets.
    • Est-ce que ‘ t Ruby a lindicateur global pour la substitution de regex, ou cela prendrait-il plus doctets pour être activé?
    • @ BradGilbertb2gills , dans Ruby, cest comme dans Awk: il existe des méthodes séparées sub() et gsub() pour remplacer en premier ou en totalité. Donc global est juste un caractère plus long.
    • @manatwork Alors jécrirais ceci quelque chose comme: ->s{s.gsub /6*7(6|89)*/,'7'}, et laissez gsub faire tout le travail de bouclage.
    • Si je comprends correctement les règles des indicateurs de ligne de commande, vous pouvez économiser 16 octets en utilisant lindicateur de ligne de commande -p (+1) en le rendant gsub /6*7(6|89)*/,?7 utilisation ruby -pe "gsub /6*7(6|89)*/,?7" pour un total de 20 + 1 octets

    Réponse

    Japt , 15 octets

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

    Solution RegEx simple

    Essayez-le en ligne

    Réponse

    PowerShell, 27 octets

    $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 

    En utilisant:

    • le modèle dexpression régulière de quelquun dautre
    • la manière -replace effectue un remplacement global par défaut dans PowerShell
    • déroulement de la boucle, où il appliquera lopérateur -regex au tableau $args en lappliquant à tous les éléments individuellement, et il ny a quun seul élément ici car il ny a quun seul paramètre de script, donc ça marche bien et on peut éviter davoir pour indexer lélément [0].

    Une tentative précédente de nouveauté avant de réaliser un remplacement global le ferait; 74 octets de construction dune chaîne de « -replace -replace -replace » en utilisant la multiplication de chaînes, autant de fois que la longueur de la chaîne, puis eval () ing it:

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

    (Avec un peu de substitution de chaîne pour raccourcir le nombre de remplacements).

    Réponse

    MATL , 17 octets

    jt""789|76"55cYX] 

    Exemple

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

    EDIT : Essayez-le en ligne!

    Explication

    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 

    Cela fonctionne en appliquant un remplacement dexpression régulier pour autant de fois quil y a de caractères dans la chaîne dorigine . Cela suffit, car chaque substitution réduit le nombre de caractères.

    Réponse

    Sérieusement, 29 octets

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

    Prend lentrée sous forme de chaîne entre guillemets, comme "6789". Essayez-le en ligne (vous devrez citer manuellement lentrée).

    Explication:

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

    Réponse

    PHP, 36 octets

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

    solution regex, prend $ une chaîne et remplace via lexpression.

    Commentaires

    • GET les paramètres ne sont pas acceptables comme méthode dentrée en PHP . Vous devrez soit en faire une fonction et transmettre lentrée en tant que paramètres de fonction, soit obtenir lentrée de $argv ou STDIN.
    • @Mego Il ne semble pas y avoir consensus sur le post auquel vous avez lié.
    • @immibis Correct. Un consensus est nécessaire pour rendre acceptable une méthode dE / S. Labsence dun seul signifie quil nest pas acceptable.
    • TL; DR vous avez de sérieux inconvénients si vous utilisez PHP pour codegolf.

    Réponse

    Thue , 26 octets

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

    y compris une nouvelle ligne à la fin.

    Lentrée est ajoutée au programme avant de le démarrer.
    La sortie est lue sur létat du programme lorsquil se termine, de la même manière quune machine de Turing.
    (Thue a un flux de sortie, mais il est difficile à utiliser correctement, donc je ne suis pas sûr que ce soit une méthode de sortie acceptable)

    Commentaires

    • Je ne pense pas ‘. Si vous avez un moyen de STDOUT, vous devez. Désolé!
    • Oui, cela est autorisé selon la méta-publication.

    Réponse

    CJam, 70 64 octets

    Merci à @Peter Taylor davoir coupé {"789":I}{"76:":I}? en "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

    Je le sais pourrait probablement être joué beaucoup plus loin et votre aide serait grandement appréciée, mais franchement, je suis juste content davoir réussi à obtenir la réponse. Cétait ma première tentative décrire CJam.

    Explication:

    "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 

    Commentaires

    • Je nai ‘ pas tenté cette question moi-même, donc je ‘ ne sais pas si cest la meilleure approche, mais si vous voulez faire un fractionnement et une jointure, jetez un œil à / et *. Notez également que penser en termes de piles lorsque vous ‘ êtes habitué aux langages de type C prend s une certaine adaptation. Par exemple. {"789":I}{"76":I}? peut extraire le devoir pour devenir "789""76"?:I, qui peut être transformé en 78976`3/?:I .
    • Merci! Cependant, je ne pourrais pas ‘ comprendre comment utiliser votre deuxième suggestion.
    • Désolé, mon erreur.78976`3/ donne un tableau ["789" "76"]; alors plutôt que dutiliser ? vous auriez besoin dutiliser = pour indexer; mais il ‘ est dos à lavant, il faudrait donc que lindex soit inversé, perdant lavantage.

    Réponse

    R, 35 octets

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

    Je ne savais pas que je pourrais utiliser gsub de cette façon, un grand merci pour chaque réponse ici qui ma fait apprendre quelque chose de nouveau.

    Réponse

    /// , 19 octets (non concurrents)

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

    Vous ne pouvez pas réellement fournir une entrée dans cette langue, donc lentrée supposée se trouve à droite du code.

    Commentaires

    • Notez que Itflabtijtslwi est composé de barres obliques mais avec entrée.
    • @FryAmTheEggman Bien que celui-ci entre caractères , pas chaînes .
    • Il semble quil manque une barre oblique dans votre lien.

    Réponse

    PHP 51 caractères

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

    Scénario de test écrit à la main

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

    La comparaison de chaînes et la chaîne remplacent les deux dans la condition while. Si la condition while est remplie, il met à jour la main gauche de la comparaison avec le résultat. Faites-moi part de toute amélioration.

    Réponse

    Jolf , 15 octets

    Essayez-le ici! Dois-je vraiment expliquer?

    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 

    Réponse

    Clojure, 71 octets

    Clojure est loin dêtre idéal pour le golf en raison de son nature verbeuse – mais néanmoins cest un exercice intéressant:

    Version golfée, utilisant linteropérabilité Java:

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

    Version non golfée, en utilisant linteropérabilité Java:

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

    Sans golf  » pure Clojure  » version:

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

    Réponse

    Bash, 102 82 67 (+7)? octets

    version extglob

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

    Ceci est destiné à être placé dans un fichier et appelé par exemple avec bash -O extglob 789.sh 6567678989689789656. Le (+7)? bytes est pour si loption extglob compte dans les octets.

    Merci à @BinaryZebra pour avoir signalé les fonctionnalités dextglob!


    Version non-extglob (82 octets)

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

    Ceci est destiné à être placé dans un fichier et appelé par exemple ./789.sh 65678989656.

    Il utilise lexpansion des paramètres pour rechercher et remplacer dans une boucle. Jai impliqué une série dextensions pour effectuer le remplacement car je ne suis pas au courant dun moyen denchaîner plus efficacement les extensions.

    Commentaires

    • Bienvenue dans PPCG!
    • @BinaryZebra Ah, merci pour la syntaxe @(). Je savais quil devait y avoir un moyen de les combiner. Et @Mego, merci pour laccueil !

    Réponse

    Python 3, 46 octets

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

    Réponse

    Japt v2.0a0, 12 octets

    e/6?7(6|89/7 

    Essayez-le en ligne !

    Comment ça marche

    String.e est une fonction de remplacement récursive. Japt 2 a une nouvelle syntaxe regex et lauto-complétion de parenthèses à lintérieur de regex, ce qui économise un octet ici. (Dans Japt 1.x, nous avons dû passer des chaînes à la place des expressions régulières, ce qui était un peu maladroit.)

    Réponse

    Dyalog APL , 17 octets

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

    "6* nimporte quel nombre de six
    7 suivi de sept
    ()*" suivi de zéro ou plusieurs séquences de…
    6|89 six ou huit-neuf

    ⎕R R remplacer cela par

    "7" un sept

    Réponse

    05AB1E , 12 octets

    Δ67‚7:789¬: 

    Essayez-le en ligne ou vérifiez tous les cas de test .

    Explication:

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

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *