Perché 6 aveva paura di 7? Perché 7 8 9!
Data una stringa, applica le seguenti trasformazioni:
- Se cè un 6 accanto a un 7 rimuovi il 6 (6 ha paura di 7)
- Se appare la sequenza “789” rimuovi l8 e il 9 (7 mangiato 9)
(Se “non sbaglio non lo fa” importa in quale ordine esegui le trasformazioni)
Continua ad applicare queste trasformazioni finché non puoi più.
Esempio:
78966
Per prima cosa vediamo “789”, quindi la stringa diventa “766”. Quindi vediamo “76”, quindi estraiamo il 6 e la stringa diventa “76”. Quindi vediamo di nuovo “76”, quindi ci resta “7”.
Casi di test:
-
987
= >987
(Non nellordine corretto. Non fa nulla.) -
6 7
=>6 7
(lo spazio vuoto funge da buffer tra 6 e 7. Non accade nulla) -
676
=>7
-
7896789
=>77
-
7689
=>7
-
abcd
=>abcd
Commenti
Risposta
Risposta
Javascript ES6, 29 byte
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])
Commenti
- Ottimo, e dato che 9 viene mangiato, hai solo 2 byte e vinci con questa risposta: P
Risposta
Java, 126 81 66 58 byte
Grazie a @GamrCorps per aver fornito la versione lambda di questo codice!
Grazie a @ user902383 per aver indicato un trucco dellautoboxing!
. ..yup.
In realtà è più lungo di me previsto – Java sostituisce gli elementi nelle stringhe con replaceAll()
una volta per corrispondenza, non ripetutamente finché non smette di cambiare. Quindi ho dovuto usare un ciclo for fantasia.
Modulo lambda:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Modulo funzione:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Codice ungolfed testabile:
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;} }
Commenti
- Perché non andare con una lambda? Salverà almeno 15 byte
- @GamrCorps Non ‘ sapere come esprimerlo, non usare mai funzioni.
- cosa ‘ è il punto di interfaccia e non di classe?
- @eis Interface elimina la necessità di dichiarare main come pubblico, il che offre il minimo vantaggio. Vedi: codegolf.stackexchange.com/a/64713/44713
- @ user902383 La riduzione tu ‘ è modificando
.equals
in!=
, il che non fa la stessa cosa.==
(o!=
) confronta in base alla posizione esadecimale delloggetto, non in base al valore. In caso contrario, ‘ ha la stessa lunghezza.while()
è 7 byte,for(;;)
è 7 byte.
Risposta
GNU Sed, 17
Il punteggio include +1 per lopzione -r
.
s/6*7(6|89)*/7/g
Commenti
- ‘ t funziona per
67789
dovrebbe restituire77
ma restituisce invece677
- Puoi utilizzare
s/67|7(6|89)/7/
invece dis/6?7(6|89)/7/
- Caspita, mi chiedo da dove Larry abbia avuto lidea di
s///g
?
Risposta
Perl 6 , 19 18 byte
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
(Tieni presente che [6|89]
è il non-captur versione di (6|89)
che è scritto come (?:6|89)
in Perl 5.<[6|89]>
è il modo in cui scriveresti “s scritto come [6|89]
in Perl 5)
utilizzo:
$ 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
Commenti
- Non ‘ non conosco Perl 6, ma presumo questa è una sostituzione ripetuta. Se
6*
e[6|89]*
don ‘ non corrispondono , cosa impedisce che7
venga sostituito con7
ad infinitum? - @DigitalTrauma Scambia
7
con7
quindi ricomincia dalla posizione successiva, procedendo fino alla fine.:g
è labbreviazione di:global
nonrepeat until it doesn't match anymore
. - @DigitalTrauma Per ottenere
s/67|76|789/7/
a lavora su dovrei scriverlo come qualcosa che abbia leffetto di:while s/67|76|789/7/ {}
che ovviamente non si fermerebbe mai se lo scrivessi comewhile s/6*7[6|89]*/7/ {}
come ti aspetteresti. Inoltre, la fine del commento precedente potrebbe risultare meschina, ovvero non come era inteso - Non dovrebbe ‘ t
[]
essere modificato in()
? Non ‘ vuoi far corrispondere pipe o79999
. - @jwodder No
[]
è la versione non-capturing Perl 6 di()
, ciò a cui stai pensando è scritto come<[6|89]>
in Perl 6 .
Risposta
Pyth, 17 byte
u:G"67|76|789"\7z
Leaky Nun ha superato di un byte nei commenti.
Commenti
Risposta
Perl 5 , 17 byte
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
utilizzo:
$ 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
Risposta
Mathematica, 52 byte
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
Spiegazione:
& 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.
Commenti
- Il codice del golf è più chiaro del codice di spiegazione .. 🙂
- @Rob Haven ‘ Ho già fatto molte spiegazioni, adottando un approccio sistematico.
- Stavo solo scherzando, amico 🙂
Risposta
Rust, 96 byte
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Disperatamente lungo, come al solito per 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 }
Commenti
- Almeno ‘ non è Java
Risposta
Emacs Lisp, 59 byte
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Diventa un po più chiaro con gli spazi:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Risposta
Ruby, 27 byte
Questa soluzione proviene dai commenti, merito di Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7}
Ruby, 37 byte
(vecchia soluzione)
Questa soluzione utilizza il fatto che non sarà mai necessario sostituire più volte dei caratteri nella stringa.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Commenti
- Puoi utilizzare
chars
invece disize.times
per salvarne alcuni byte. - ‘ t Ruby ha il flag globale per la sostituzione delle espressioni regolari o ci vorranno più byte per abilitarlo?
- @ BradGilbertb2gills , in Ruby è come in Awk: ci sono metodi separati
sub()
egsub()
da sostituire per primi o tutti. Quindi globale è solo un carattere più lungo. - @manatwork Quindi scriverei qualcosa del tipo:
->s{s.gsub /6*7(6|89)*/,'7'}
e lascia chegsub
fa tutto il lavoro di loop. - Se capisco correttamente le regole dei flag della riga di comando, potresti salvare 16 byte utilizzando il flag della riga di comando -p (+1) rendendolo
gsub /6*7(6|89)*/,?7
con utilizzoruby -pe "gsub /6*7(6|89)*/,?7"
per un totale di 20 + 1 byte
Risposta
Rispondi
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
Facendo uso di:
- modello regex di qualcun altro
- il modo
-replace
esegue una sostituzione globale per impostazione predefinita in PowerShell - loop unrolling, dove applicherà loperatore
-regex
allarray$args
applicandolo a tutti gli elementi individualmente, e qui cè un solo elemento perché cè un solo parametro di script, quindi funziona bene e possiamo evitare di avere allelemento index[0]
.
Novità precedente tentativo prima di realizzare una sostituzione globale lo farebbe; 74 byte di creazione di una catena di “-replace -replace -replace” utilizzando la moltiplicazione delle stringhe, tante volte quanto la lunghezza della stringa, quindi eval () ing:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(con un po di sostituzione di stringhe per abbreviare il numero di sostituzioni).
Answer
MATL , 17 byte
jt""789|76"55cYX]
Esempio
>> matl > jt""789|76"55cYX] > > 7896789 77
MODIFICA : Provalo online!
Spiegazione
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
Funziona applicando una normale sostituzione di espressione per tante volte quanti sono i caratteri nella stringa originale . Questo è sufficiente, poiché ogni sostituzione riduce il numero di caratteri.
Risposta
Scherzi a parte, 29 byte
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
Accetta linput come una stringa tra virgolette doppie, come "6789"
. Provalo online (dovrai citare manualmente linput).
Spiegazione:
,;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"
Risposta
PHP, 36 byte
preg_replace("/6*7(6|89)*/","7",$a);
soluzione regex, accetta $ una stringa e la sostituisce tramite lespressione.
Commenti
- GET i parametri non sono accettabili come metodo di input in PHP . Dovrai renderla una funzione e passare linput come parametri della funzione oppure ricevere linput da
$argv
o STDIN. - @Mego Sembra che non ci sia consenso sul post a cui ti sei collegato.
- @immibis Correct. È necessario un consenso per rendere accettabile un metodo di I / O. La mancanza di uno significa che non è accettabile.
- TL; DR hai seri svantaggi se usi PHP per codegolf.
Risposta
Gio , 26 byte
67::=7 76::=7 789::=7 ::=
includendo una nuova riga finale.
Linput viene aggiunto al programma prima di avviarlo.
Loutput viene letto dallo stato del programma quando termina, in modo simile a una macchina di Turing.
(Thue ha un flusso di output, ma è difficile da usare correttamente, quindi non sono sicuro che questo sia un metodo di output accettabile)
Commenti
- Non ‘ la penso così. Se hai un modo per STDOUT, devi. Spiacenti!
- Sì, questo è consentito secondo il meta post.
Risposta
CJam, 70 64 byte
Grazie a @Peter Taylor per aver tagliato {"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 so potrebbe probabilmente essere giocato molto di più e il tuo aiuto sarebbe molto apprezzato, ma francamente sono solo felice di essere riuscito a ottenere la risposta. Questo è stato il mio primo tentativo di scrivere CJam.
Spiegazione:
"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
Commenti
- Non ho ‘ tentato questa domanda me stesso, quindi ‘ non sono sicuro che questo sia lapproccio migliore, ma se vuoi fare la divisione e lunione, dai unocchiata a
/
e*
. Tieni inoltre presente che pensare in termini di pile quando ‘ sei abituato a linguaggi simili a C richiede è un po di adattamento. Per esempio.{"789":I}{"76":I}?
può ritirare il compito per diventare"789""76"?:I
, che può essere ulteriormente assegnato a78976`3/?:I
. - Grazie! Tuttavia, non sono riuscito a ‘ capire come utilizzare il secondo suggerimento.
- Scusa, errore mio.
78976`3/
fornisce un array["789" "76"]
; quindi invece di utilizzare?
dovresti utilizzare=
per indicizzare; ma è ‘ in senso inverso, quindi sarebbe necessario invertire lindice, perdendo così il vantaggio.
Risposta
R, 35 byte
cat(gsub("6*7(6|89)*",7,scan(,"")))
Non sapevo di poter usare gsub
in questo modo, un grande grazie per ogni risposta qui che mi ha fatto imparare qualcosa di nuovo.
Risposta
/// , 19 byte (non in competizione)
/67/7//76/7//789/7/
Non puoi effettivamente fornire input in questa lingua, quindi il presunto input va a destra del codice.
Commenti
- Nota che Itflabtijtslwi è barrato ma con input.
- @FryAmTheEggman Anche se questo inserisce caratteri , non stringhe .
- Sembra che nel tuo link manchi una barra.
Risposta
PHP 51 caratteri
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Test case scritto a mano lunga
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
Questo fa il confronto tra stringhe e la stringa sostituisce entrambi nella condizione while. Se la condizione while è soddisfatta, aggiorna la mano sinistra del confronto con il risultato. Fammi sapere di eventuali miglioramenti.
Risposta
Jolf , 15 byte
Provalo qui! Devo davvero spiegare?
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
Risposta
Clojure, 71 byte
Clojure è tuttaltro che ideale per il golf a causa della sua natura prolissa, ma nondimeno è un esercizio interessante:
Versione da golf, che utilizza linteroperabilità Java:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Versione senza golf, utilizzando Java Interop:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Un-golfed ” puro Clojure ” versione:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
Answer
Bash, 102 82 67 (+7)? byte
versione extglob
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
Questo deve essere messo in un file e chiamato ad esempio con bash -O extglob 789.sh 6567678989689789656
. Il (+7)? bytes è per se lopzione extglob conta per i byte.
Grazie a @BinaryZebra per aver evidenziato le funzionalità extglob!
Versione non extglob (82 byte)
x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v
Questo deve essere messo in un file e chiamato ad es. ./789.sh 65678989656
.
Utilizza lespansione dei parametri per cercare e sostituire in un ciclo. Ho coinvolto una serie di espansioni per eseguire la sostituzione poiché “non sono a conoscenza di un modo per concatenare espansioni in modo più efficace.
Commenti
- Benvenuto in PPCG!
- @BinaryZebra Ah, grazie per la sintassi
@()
. Sapevo che doveva esserci un modo per combinarli. E @Mego, grazie per il benvenuto !
Risposta
Python 3, 46 byte
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
Risposta
Japt v2.0a0, 12 byte
e/6?7(6|89/7
Come funziona
String.e
è una funzione di sostituzione ricorsiva. Japt 2 ha una nuova sintassi regex e completamento automatico di parentesi allinterno di regex, che qui salva un byte (in Japt 1.x, dovevamo passare stringhe al posto di regex, il che era un po goffo.)
Risposta
Dyalog APL , 17 byte
"6*7(6|89)*"⎕R"7"
"6*
qualsiasi numero di sei
7
seguito da sette
(
… )*"
seguito da zero o più sequenze di…
6|89
un sei o otto nove
⎕R
R sostituisci con
"7"
a sette
Risposta
05AB1E , 12 byte
Δ67‚7:789¬:
Provalo online o verifica tutti i casi di test .
Spiegazione:
Δ # 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