Miért félt 6 a 7-től? Mert 7 8 9!
Adott karakterlánc esetén alkalmazza a következő átalakításokat:
- Ha a 7 mellett egy 6 van, akkor távolítsa el a 6-ot (6 fél a 7-ből)
- Ha megjelenik a “789” szekvencia, távolítsa el a 8-at és a 9-et (7 evett 9-et)
(Ha “nem tévedek, akkor nem” t mindegy, milyen sorrendben hajtja végre az átalakításokat)
Addig alkalmazza ezeket az átalakításokat, amíg már nem tud.
Példa:
78966
Először a “789” -et látjuk, így a karakterlánc “766” lesz. Ekkor látjuk a “76” -t, tehát kivesszük a 6-ot, és a húrból “76” lesz. Ezután újra látjuk a “76” -t, tehát marad a “7”.
Tesztesetek:
-
987
= >987
(Nem megfelelő sorrendben. Nem csinál semmit.) -
6 7
=>6 7
(A szóköz 6 és 7 között pufferként működik. Semmi sem történik) -
676
=>7
-
7896789
=>77
-
7689
=>7
-
abcd
=>abcd
Megjegyzések
Válasz
Válasz
Javascript ES6, 29 bájt
s=>s.replace(/6*7(89|6)*/g,7)
Teszt:
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])
Hozzászólások
- Nagyszerű, és mivel a 9-et megették, csak 2 bájtod van, és ezzel a válaszsal nyersz: P
Válasz
Java, 126 81 66 58 bájt
Köszönet @GamrCorps-nak, hogy megadta ennek a kódnak a lambda verzióját!
Köszönet a @ user902383-nak, hogy rámutatott egy autoboxing trükkre!
. ..ja.
Valójában hosszabb, mint én várható – a Java a karakterláncokban szereplő elemeket meccsenként egyszer replaceAll()
-re cseréli, és nem többször, amíg le nem áll a változás. Tehát egy fantáziát kellett használnom a ciklushoz.
Lambda forma:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Funkcióforma:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Tesztelhető ungolfozott kód:
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;} }
Megjegyzések
- Miért nem megy egy lambdával? Legalább 15 bájtot fog megtakarítani.
- @GamrCorps Don ‘ nem tudja ezt megfogalmazni – soha ne használjon függvényeket.
- mit ‘ s az interfész lényege és nem osztálya?
- @eis Interface feleslegessé teszi a main nyilvánosnak nyilvánításának szükségességét, ami a legkisebb előnyt is biztosítja. Lásd: codegolf.stackexchange.com/a/64713/44713
- @ user902383 A csökkentés ‘ re készítés úgy történik, hogy a
.equals
-et!=
-re változtatja, ami nem ugyanazt csinálja. A==
(vagy!=
) objektum hexa-hely szerinti összehasonlítást végez, nem pedig érték szerint. ‘ egyébként azonos hosszúságú.while()
7 bájt,for(;;)
7 bájt.
Válasz
GNU Sed, 17
A pontszám + 1-et tartalmaz az -r
opcióhoz.
s/6*7(6|89)*/7/g
Megjegyzések
- Nem működik ‘ a vissza kell adnia
77
, de ehelyett677
- használhatja a
s/67|7(6|89)/7/
s/6?7(6|89)/7/
- Gee, kíváncsi vagyok, honnan jött Larry a
s///g
?
Válasz
Perl 6 , 19 18 bájt
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
(Ne feledje, hogy a [6|89]
a nem elfogó a (6|89)
verziója, amelyet (?:6|89)
néven írnak a Perl 5-ben.A <[6|89]>
így írhatná, hogy mi írva [6|89]
a Perl 5-ben)
felhasználás:
$ 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
Megjegyzések
- Nem ismerem ‘ a Perl 6-ot, de feltételezem ez egy ismételt helyettesítés. Ha a
6*
és a[6|89]*
don ‘ t semmivel nem egyezik , mi akadályozza meg a7
helyettesítését az7
ad infinitummal? - @DigitalTrauma Felcseréli a
7
a következővel:7
, majd a következő pozíciónál kezdi újra a végét.:g
:global
nemrepeat until it doesn't match anymore
. - @DigitalTrauma A
s/67|76|789/7/
elérése dolgozzon a azt kellene írnom, mint valami effektust:while s/67|76|789/7/ {}
, ami természetesen soha nem áll le, ha ahogy elvárhatod. Ezenkívül az előző megjegyzés vége átlagos lelkületű lehet, vagyis nem , hogyan szándékozták - Nem kellett volna ‘ t a
[]
t()
-re kell változtatni? Nem ‘ nem akar csöveket illeszteni, vagy79999
. - @jwodder nem
[]
a()
Perl 6 nem rögzítő változata, amire gondol,<[6|89]>
a Perl 6-ban .
Válasz
Piton, 17 bájt
u:G"67|76|789"\7z
A Leaky Apáca ezt egy byte-tal túllépte a megjegyzésekben.
Megjegyzések
Válasz
Perl 5 , 17 bájt
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
használat:
$ 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
Válasz
Mathematica, 52 bájt
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
Magyarázat:
& 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.
megjegyzések
- A golfozott kód világosabb, mint a magyarázó kód .. 🙂
- @Rob Haven ‘ t sokszor kifejtett, szisztematikus megközelítést alkalmazva.
- Csak ugrattam, társam 🙂
Válasz
Rozsda, 96 bájt
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Reménytelenül hosszú, mint a Rust esetében szokás …
Nem sikerült:
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 }
Megjegyzések
- Legalábbis ez ‘ nem Java
Válasz
Lisp Emacs, 59 bájt
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Szóközzel kissé világosabbá válik:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Válasz
Ruby, 27 bájt
Ez a megoldás a megjegyzésekből, a Brad Gilbert b2gills től származik.
->s{s.gsub /6*7(6|89)*/,?7}
Rubin, 37 bájt
(régi megoldás)
Ez a megoldás azt a tényt használja, hogy soha nem kell többször cserélnie, mint a karakterek a karakterláncban.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Megjegyzések
- A
chars
szót használhatja asize.times
helyett néhány megmentéséhez. bájtok. - Do not ‘ t Ruby rendelkezik a globális zászlóval a regex helyettesítéshez, vagy ennek több bájtra lenne szüksége az engedélyezéshez?
- @ BradGilbertb2gills , a Ruby-ban olyan, mint az Awk-ban: különálló
sub()
ésgsub()
módszerek helyettesíthetők először vagy mindegyikkel. Tehát a globális csak egy karakterrel hosszabb. - @manatwork Akkor ezt írnám:
->s{s.gsub /6*7(6|89)*/,'7'}
, és hagynám, hogygsub
végezze el az összes hurkolási munkát. - Ha jól értem a parancssori jelzők szabályait, 16 bájtot menthetne a -p parancssori jelző (+1) használatával
gsub /6*7(6|89)*/,?7
ruby -pe "gsub /6*7(6|89)*/,?7"
használat összesen 20 + 1 bájt
Válasz
Válasz
PowerShell, 27 bájtok
$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
A következők használata:
- valaki más regex mintája
- az út
-replace
alapértelmezés szerint globális cserét hajt végre a PowerShell - hurok letekerésében, ahol a
-regex
operátort alkalmazza a tömbre$args
úgy, hogy mindegyik elemre külön-külön alkalmazzuk, és itt csak egy elem van, mert csak egy szkriptparaméter van, tehát rendben működik, és elkerülhetjük, hogy a[0]
elem indexeléséhez.
A korábbi újdonság-kísérlet, mielőtt megvalósítaná a globális cserét, megtenné; 74 bájt a “-replace -replace -replace” lánc felépítésével string-szorzással, ahányszor a karakterlánc hossza, majd eval ():
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(Egy kis karakterlánc-helyettesítéssel a cserék számának rövidítéséhez).
Válasz
MATL , 17 bájt
jt""789|76"55cYX]
példa
>> matl > jt""789|76"55cYX] > > 7896789 77
SZERKESZTÉS : Próbálja ki online!
Magyarázat
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
Ez úgy működik, hogy a rendszeres expresion cserét annyiszor alkalmazza, ahány karakter van az eredeti karakterláncban . Ez elég, mivel minden helyettesítés csökkenti a karakterek számát.
Válasz
Komolyan, 29 bájt
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
A bevitelt kettős idézőjelű karakterláncként veszi fel, például "6789"
. Próbálja ki online (kézzel kell idéznie a bevitelt).
Magyarázat:
,;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"
Válasz
PHP, 36 bájt
preg_replace("/6*7(6|89)*/","7",$a);
regex megoldás, megad egy $ karakterláncot, és a kifejezésen keresztül cserél.
Megjegyzések
- GET paraméterek nem fogadhatók el beviteli módszerként a PHP-ben . Vagy meg kell adnia ezt egy függvénynek, és át kell adnia az inputot függvényparaméterként, vagy be kell szereznie a bemenetet a
$argv
vagy az STDIN címről. - @Mego Úgy tűnik, hogy nincs konszenzus az Ön által linkelt bejegyzéssel kapcsolatban.
- @immibis Helyes. Az I / O módszer elfogadhatóvá tételéhez konszenzusra van szükség. Az egyik hiánya azt jelenti, hogy ez nem elfogadható.
- TL; DR komoly hátrányai vannak, ha a PHP-t használod a codegolfhoz.
Válasz
Sze , 26 bájt
67::=7 76::=7 789::=7 ::=
tartalmaz egy záró új sort.
A bemenetet hozzá kell fűzni a programhoz, mielőtt elindítanánk.
A kimenetet leolvassák a program állapotáról, amikor leáll, hasonlóan egy Turing-géphez.
(Thue van kimeneti folyama, de nehéz használni helyesen, ezért nem vagyok biztos abban, hogy ez elfogadható kimeneti módszer-e)
Megjegyzések
- Nem gondolom. Ha van módja STDOUT-ra, akkor muszáj. Sajnálom!
- Igen, ez a meta bejegyzés szerint megengedett.
Válasz
CJam, 70 64 bájt
Köszönöm @Peter Taylornak, hogy {"789":I}{"76:":I}?
-et "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
Ezt tudom valószínűleg sokkal többet lehet golfozni, és a segítségedet nagyra értékeljük, de őszintén szólva nagyon boldog vagyok, hogy sikerült megkapnom a választ. Ez volt az első kísérletem a CJam megírására.
Magyarázat:
"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
Megjegyzések
- Még nem próbáltam meg ezt a kérdést ‘ magam, ezért ‘ nem vagyok biztos benne, hogy ez a legjobb megközelítés, de ha fel akarja osztani és csatlakozni, akkor nézze meg a
/
és*
. Vegye figyelembe azt is, hogy a halmokban való gondolkodás, amikor ‘ a C-szerű nyelvekhez szokott s némi alkalmazkodás. Például.{"789":I}{"76":I}?
kihúzhatja a feladatot, hogy"789""76"?:I
legyen, amelyet tovább golfozni78976`3/?:I
. - Köszönöm! Nem tudtam azonban ‘ megérteni a második javaslatod felhasználását.
- Sajnálom, hibám.
78976`3/
egy tömböt ad["789" "76"]
; akkor a?
helyett a=
-t kell használni az indexeléshez; de ‘ hátulról van hátra, ezért meg kellene fordítani az indexet, elveszítve az előnyét.
Válasz
R, 35 bájt
cat(gsub("6*7(6|89)*",7,scan(,"")))
Nem tudtam, hogy használhatom a gsub
így nagy köszönet minden itteni válaszért, amely valami új tanulásra késztetett.
Válasz
/// , 19 bájt (nem versenyző)
/67/7//76/7//789/7/
Nem adhat meg ténylegesen bevitelt ezen a nyelven, így a feltételezett bevitel a kódtól jobbra megy.
Megjegyzések
- Ne feledje, hogy Itflabtijtslwi perjel, de bemenettel.
- @FryAmTheEggman Bár ez karaktereket , de nem karakterláncokat .
- Úgy tűnik, hogy a linkedből hiányzik egy perjel.
Válasz
PHP 51 karakter
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Hosszú kézzel írt teszteset
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
Ez a karakterlánc-összehasonlítást hajtja végre, és a string mindkettőt felveszi a while feltételben. Ha a feltétel teljesül, frissíti az összehasonlítás bal kezét az eredménnyel. Értesítsen a fejlesztésekről.
Válasz
Jolf , 15 bájt
Próbálja ki itt! Tényleg magyaráznom kell?
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
Válasz
Clojure, 71 bájt
A Clojure kevésbé ideális a golfozáshoz, mivel bőbeszédű természet – de ennek ellenére érdekes gyakorlat:
Golfozott verzió, Java interop használatával:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Nem golfozott verzió, Java interop használata:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Nem golfozott ” tiszta Clojure ” verzió:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
Válasz
Bash, 102 82 67 (+7)? bájt
extglob verzió
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
Ezt egy fájlba kell tenni, és pl .: bash -O extglob 789.sh 6567678989689789656
. A (+7)? byte-ok arra szolgálnak, ha az extglob opció beleszámít a bájtokba.
Köszönet a @BinaryZebra-nak, hogy rámutattak az extglob szolgáltatásokra!
Nem extglob verzió (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
Ezt fájlba kell helyezni, és pl. ./789.sh 65678989656
.
A paraméterbővítést használja a ciklusban történő keresésre és cserére. Bővítések sorozatát vontam be a pótlás elvégzésére, mivel nem tudok arról, hogyan lehetne hatékonyabban láncolni a bővítéseket.
Hozzászólások
- Üdvözöljük PPCG!
- @BinaryZebra Ah, köszönöm a
@()
szintaxist. Tudtam, hogy ezeknek az ötvözésére van mód. És @Mego, köszönöm a fogadtatást !
Válasz
Python 3, 46 bájt
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
Válasz
Japt v2.0a0, 12 bájt
e/6?7(6|89/7
Hogyan működik
String.e
rekurzív helyettesítő funkció. A 2. Japt új regexszintaxissal és automatikus kiegészítéssel látták el zárójelek a regexen belül, ami ide ment egy bájtot. (Az 1.x Japt-ban sztringeket kellett átadnunk a regexek helyett, ami meglehetősen nehézkes volt.)
Válasz
Dialog APL , 17 bájt
"6*7(6|89)*"⎕R"7"
"6*
tetszőleges számú hatos
7
, majd egy hét
(
… )*"
, amelyet nulla vagy több szekvencia követ…
6|89
egy hat vagy nyolc-kilenc
⎕R
R ehely, amelyet a
"7"
a hét
Válasz
05AB1E , 12 bájt
Δ67‚7:789¬:
Próbálja ki online vagy ellenőrizze az összes tesztesetet .
Magyarázat:
Δ # 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