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
댓글
Answer
답변
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”>
를 반환해야합니다.
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]*
가 일치하지 않는 ‘ 인 경우 ,7
가7
광고 무한대로 대체되는 것을 중단하는 것은 무엇입니까? - @DigitalTrauma 와
7
는 다음 위치에서 다시 시작하여 끝까지 작동합니다.:g
는:global
는repeat 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 바이트
답변
답변
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)
68978966897896
= >68977