6은 왜 7을 두려워 했습니까?

6이 7을 두려워한 이유는 무엇입니까? 왜냐하면 7 8 9!

주어진 문자열은 다음 변환을 적용합니다.

  • 7 옆에 6이 있으면 6을 제거합니다 (6은 두려워 of 7)
  • 시퀀스 “789”가 나타나면 8과 9를 제거 (7 ate 9)

(내가 착각하지 않았다면 어떤 순서로 변환하든 상관 없습니다)

더 이상 불가능할 때까지 이러한 변환을 계속 적용하십시오.

예 :

78966

먼저 “789”가 표시되므로 문자열은 “766”이됩니다. 그러면 “76”이 표시되므로 6을 빼면 문자열이 “76”이됩니다. 그런 다음 “76”이 다시 표시되므로 “7”이 남습니다.

테스트 사례 :

  • 987 = > 987 (올바른 순서가 아닙니다. 아무것도하지 않습니다.)
  • 6 7 => 6 7 (공백은 6에서 7 사이의 버퍼 역할을합니다.)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

댓글

  • Vista가 7을 두려워한 이유는 무엇입니까? 7 8 10이기 때문입니다.
  • 다른 테스트 사례 68978966897896 = > 68977
  • @ThomasKwa 아, 알겠습니다. Microsoft는 수수께끼를 풀고 있기 때문에 Windows 9를 건너 뛰었습니다. 😉
  • 7을 두려워하는 이유는 무엇입니까? 왜냐하면 여섯 일곱 여덟. -요다
  • 6 명은 7 명이 차갑고 죽은 눈을 가지고 있었기 때문에 7 명을 두려워했습니다.

Answer

Retina , 12

sed 답변 번역 :

6*7(6|89)* 7 

온라인으로 사용해보기

댓글

답변

Javascript ES6, 29 바이트

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

테스트 :

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

댓글

  • 좋아요. 9 개를 먹었으므로 2 바이트 만 남았고이 답변으로 이겼습니다 .P

답변

Java, 126 81 66 58 바이트

이 코드의 람다 버전을 제공 한 @GamrCorps에게 감사드립니다!

오토 박싱 트릭을 지적 해 주신 @ user902383에게 감사드립니다!

. ..yup.

실제로 저보다 길어요 예상 됨-Java는 문자열의 항목을 일치 당 한 번씩 replaceAll()로 바꿉니다. 변경이 중지 될 때까지 반복되지 않습니다. 그래서 멋진 for 루프를 사용해야했습니다.

Lambda 형식 :

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

함수 형식 :

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

테스트 가능한 Ungolfed 코드 :

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

댓글

  • 람다와 함께 가지 않겠습니까? 최소 15 바이트를 절약합니다.
  • @GamrCorps Don ‘ 그것을 표현하는 방법을 모릅니다. 함수를 사용하지 마십시오.
  • what ‘ 클래스가 아니라 인터페이스의 요점입니까?
  • @eis 인터페이스는 main을 public으로 선언 할 필요가 없으므로 약간의 이점이 있습니다. 참조 : codegolf.stackexchange.com/a/64713/44713
  • @ user902383 감소량 ‘는 .equals!=로 변경하여 동일한 작업을 수행하지 않습니다 . == (또는 !=)는 값이 아닌 개체 16 진수 위치를 기준으로 비교합니다. 그렇지 않으면 ‘ 길이가 같습니다. while()는 7 바이트, for(;;)는 7 바이트입니다.

Answer

GNU Sed, 17

점수에는 -r 옵션에 대한 +1이 포함됩니다.

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

댓글

  • ‘ 는 77를 반환해야하지만 대신 677
  • 를 반환해야합니다.

  • iv id =를 사용할 수 있습니다. s/6?7(6|89)/7/ 대신 “5927c22883”>
  • 이런, Larry가 s///g?
  • 답변

    Perl 6 , 19 18 바이트

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

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

    ([6|89]는 캡처가 아닌 Perl 5에서 철자가 (?:6|89)(6|89)의 ing 버전입니다.<[6|89]>는 Perl 5에서 [6|89]로 철자를 쓰는 방법입니다.

    사용법 :

     $ 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  

    댓글

    • Perl 6에 대해 잘 모르지만 ‘ 반복되는 대체입니다. 6*[6|89]*가 일치하지 않는 ‘ 인 경우 , 77 광고 무한대로 대체되는 것을 중단하는 것은 무엇입니까?
    • @DigitalTrauma 와 7는 다음 위치에서 다시 시작하여 끝까지 작동합니다. :g:globalrepeat until it doesn't match anymore가 아닙니다.
    • @DigitalTrauma s/67|76|789/7/while s/67|76|789/7/ {}의 효과를 위해 작성해야합니다. . 또한 이전 댓글의 끝이 의미있는 것으로 나올 수 있습니다. 즉, 의도 된 방식이 아닙니다
    • 반드시 ‘ []()로 변경되지 않습니까? ‘ 파이프를 일치시키고 싶지 않거나 79999.
    • @jwodder 아니요 []()의 Perl 6 비 캡처 버전이며, Perl 6에서는 <[6|89]>로 철자가 표시됩니다. .

    답변

    Pyth, 17 바이트

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

    여기에서 시도해보세요.

    Leaky Nun이 댓글에서이 값을 1 바이트 넘겼습니다.

    댓글

    답변

    Perl 5 , 17 바이트

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

    사용 :

     $ 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  

    답변

    Mathematica, 52 바이트

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

    설명 :

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

    코멘트

    • 골프 코드가 설명 코드보다 명확합니다 .. 🙂
    • @Rob Haven ‘ 이전에 많은 설명을하지 않았고 체계적인 접근 방식을 취했습니다.
    • 그냥 놀리고 있었어요 🙂

    답변

    Rust, 96 바이트

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

    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 }  

    댓글

    • 적어도 자바가 아닌 ‘

    답변

    Emacs Lisp, 59 바이트

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

    공백을 사용하면 좀 더 명확 해집니다.

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

    답변

    Ruby, 27 바이트

    이 솔루션은 Brad Gilbert b2gills 의 의견을 바탕으로합니다.

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

    Ruby, 37 바이트

    (이전 솔루션)

    이 솔루션은 문자열의 문자보다 더 많이 바꿀 필요가 없다는 사실을 사용합니다.

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

    댓글

    • size.times 대신 chars를 사용하여 몇 가지를 절약 할 수 있습니다. 바이트.
    • Ruby에 정규식 대체를위한 전역 플래그가있는 경우 ‘ 아니면 활성화하는 데 더 많은 바이트가 필요합니까?
    • @ BradGilbertb2gills , Ruby에서는 Awk와 비슷합니다. 먼저 또는 모두를 대체 할 별도의 sub()gsub() 메서드가 있습니다. 따라서 global은 한 문자 더 길어집니다.
    • @manatwork 그런 다음 ->s{s.gsub /6*7(6|89)*/,'7'}와 같이 작성하고 gsub 모든 루핑 작업을 수행합니다.
    • 명령 줄 플래그의 규칙을 올바르게 이해했다면 -p 명령 줄 플래그 (+1)를 사용하여 16 바이트를 절약 할 수 있습니다. gsub /6*7(6|89)*/,?7 사용 ruby -pe "gsub /6*7(6|89)*/,?7" 총 20 + 1 바이트

    답변

    Japt , 15 바이트

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

    Simple RegEx 솔루션

    온라인으로 사용해보기

    답변

    PowerShell, 27 바이트

    $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 

    사용 :

    • 다른 사람의 정규식 패턴
    • 방법 -replace는 PowerShell에서 기본적으로 전역 교체를 수행합니다.
    • 루프 언 롤링에서 -regex 연산자를 배열에 적용합니다. $args 모든 요소에 개별적으로 적용하고 여기에는 스크립트 매개 변수가 하나뿐이기 때문에 여기에 요소가 하나만 있으므로 정상적으로 작동하고 요소 [0]를 색인화합니다.

    전역 교체를 실현하기 전에 참신한 이전 시도가이를 수행 할 것입니다. 74 바이트의 문자열 곱셈을 사용하여 “-replace -replace -replace”체인을 구축 한 다음 문자열 길이만큼 eval ()합니다.

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

    (교체 횟수를 줄이기 위해 약간의 문자열 대체 포함).

    답변

    MATL , 17 바이트

    jt""789|76"55cYX] 

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

    수정 : 온라인으로 사용해보세요!

    설명

    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 

    이는 원래 문자열에있는 문자 수만큼 에 대한 정규 표현식 대체를 적용하여 작동합니다. 대체 할 때마다 문자 수가 줄어들 기 때문에 충분합니다.

    답변

    정말, 29 바이트

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

    "6789"와 같이 큰 따옴표로 묶인 문자열로 입력을받습니다. 온라인으로 사용해보세요 (입력 한 내용을 수동으로 인용해야 함).

    설명 :

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

    답변

    PHP, 36 바이트

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

    정규식 솔루션, $ a 문자열을 취하고 표현식을 통해 대체합니다.

    코멘트

    • GET 매개 변수는 PHP에서 입력 방법으로 허용되지 않습니다 . 이것을 함수로 만들고 입력을 함수 매개 변수로 전달하거나 $argv 또는 STDIN에서 입력을 받아야합니다.
    • @Mego 링크 한 게시물에 대한 합의.
    • @immibis 맞습니다. I / O 방법을 수용 할 수 있도록하려면 합의가 필요합니다. 하나가 없다는 것은 받아 들일 수 없다는 것을 의미합니다.
    • TL; DR codegolf에 PHP를 사용하면 심각한 단점이 있습니다.

    답변

    Thue , 26 바이트

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

    후행 개행을 포함합니다.

    입력은 시작하기 전에 프로그램에 추가됩니다.
    출력은 Turing 머신과 유사하게 프로그램이 종료 될 때 프로그램 상태에서 읽 힙니다.
    (Thue 출력 스트림이 있지만 올바르게 사용하기가 어려우므로 이것이 허용되는 출력 방법인지 확실하지 않습니다.

    코멘트

    • ‘ 그렇게 생각하지 않습니다. STDOUT에 대한 방법이 있다면해야합니다. 죄송합니다!
    • 예, 메타 게시물에 따라 허용됩니다.

    답변

    CJam, 70 64 바이트

    {"789":I}{"76:":I}?"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

    알아요 골프를 더 많이 치를 수 있고 도움을 주시면 대단히 감사하겠습니다.하지만 솔직히 답을 얻을 수있어서 기쁩니다. 이것이 CJam을 작성하려는 첫 시도였습니다.

    설명 :

    "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 

    댓글

    • 이 질문을 시도한 적이 없음 ‘ 나 자신이므로 ‘이게 최선의 방법인지 확실하지 않지만 분할 및 결합을 수행하려면 /*. 또한 ‘ C와 유사한 언어에 익숙한 경우 스택 측면에서 생각하면 일부 적응입니다. 예 : {"789":I}{"76":I}?는 과제를 가져와 "789""76"?:I가 될 수 있으며, 78976`3/?:I에 추가 골프를 칠 수 있습니다. .
    • 감사합니다! 하지만 ‘ 두 번째 제안을 사용하는 방법을 이해하지 못했습니다.
    • 죄송합니다. 실수입니다.78976`3/는 배열을 제공합니다. ["789" "76"]; 그런 다음 ?를 사용하는 대신 =를 사용하여 색인을 생성해야합니다. 그러나 ‘ 앞뒤로 이동하므로 색인이 반전되어 이점을 잃게됩니다.

    답변

    R, 35 바이트

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

    이렇게하면 새로운 것을 배울 수있게 해준 모든 답변에 감사드립니다.

    답변

    /// , 19 바이트 (비경쟁)

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

    실제로이 언어로 입력을 제공 할 수 없으므로 예상 입력이 코드 오른쪽으로 이동합니다.

    코멘트

    • Itflabtijtslwi 는 슬래시이지만 입력이 있습니다.
    • @FryAmTheEggman 비록 문자열 이 아닌 문자 를 입력합니다. i>.
    • 링크에 슬래시가 하나 누락 된 것 같습니다.

    답변

    PHP 51 자

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

    긴 손으로 작성된 테스트 케이스

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

    이것은 문자열 비교를 수행하고 문자열은 while 조건에서 둘 다 대체합니다. 조건이 충족되면 비교 결과를 왼쪽으로 업데이트합니다. 개선 사항이 있으면 알려주세요.

    답변

    Jolf , 15 바이트

    여기에서 사용해보세요! 정말로 설명해야합니까?

    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 

    답변

    Clojure, 71 바이트

    Clojure는 다음과 같은 이유로 골프에 적합하지 않습니다. 장황한 성격-그러나 그럼에도 불구하고 흥미로운 실습입니다.

    Java interop을 사용하는 골프 버전 :

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

    골프되지 않은 버전, Java interop 사용 :

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

    Ungolfed ” 순수 Clojure ” 버전 :

    (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)? 바이트

    extglob 버전

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

    파일에 넣고 bash -O extglob 789.sh 6567678989689789656. (+7)? bytes는 extglob 옵션이 바이트에 포함되는 경우입니다.

    extglob 기능을 지적 해 주신 @BinaryZebra에게 감사드립니다!


    비 -extglob 버전 (82 바이트)

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

    이것은 파일에 넣고 다음과 같이 호출하기위한 것입니다. ./789.sh 65678989656.

    매개 변수 확장을 사용하여 루프에서 검색 및 교체합니다. 확장을 더 효과적으로 연결하는 방법을 알지 못하기 때문에 교체를 위해 일련의 확장을 수행했습니다.

    댓글

    • 환영합니다. PPCG!
    • @BinaryZebra 아, @() 구문을 사용해 주셔서 감사합니다.이 구문을 결합 할 방법이 있어야한다는 것을 알고 있습니다. @Mego, 환영합니다. !

    답변

    Python 3, 46 바이트

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

    답변

    Japt v2.0a0, 12 바이트

    e/6?7(6|89/7 

    온라인으로 사용해보기 !

    작동 방식

    String.e는 재귀 적 교체 기능입니다. Japt 2에는 새로운 정규식 구문과 자동 완성 기능이 있습니다. 여기에 1 바이트를 절약 할 수있는 정규식 내부의 괄호입니다. (Japt 1.x에서는 정규식 대신 문자열을 전달해야했지만 다소 어색했습니다.)

    Answer

    Dyalog APL , 17 바이트

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

    "6* 6 개
    7 뒤에 7 개
    ()*" 뒤에 0 개 이상의 시퀀스…
    6|89 6 또는 8-9

    ⎕R R 다음으로 교체

    "7" a seven

    답변

    05AB1E , 12 바이트

    Δ67‚7:789¬: 

    온라인으로 시도 하거나 모든 테스트 사례를 확인 하세요.

    설명 :

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

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다