Miért félt 6 a 7-től?

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

  • Miért félt a Vista a 7-től? Mert 7 8 10.
  • Egy másik teszteset 68978966897896 = > 68977
  • @ThomasKwa Ó, értem: A Microsoft kihagyta a Windows 9-et, mert együtt jártak a találós kérdéssel. 😉
  • Miért félt a héttől az öt? Mert hat hét nyolc. – Yoda
  • Hatan féltek héttől, mert hétnek hideg, elhalt szeme volt.

Válasz

Retina , 12

A nyugodt válasz fordítása :

6*7(6|89)* 7 

Próbálja ki online

Megjegyzések

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 ehelyett 677
  • 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 a 7 helyettesítését az 7 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 nem repeat 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, vagy 79999.
  • @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 

Próbálja ki itt.

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 a size.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() és gsub() 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, hogy gsub 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

Japt , 15 bájt

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

Egyszerű RegEx megoldás

Próbálja ki online

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

Próbálja ki online !

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)  

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük