C 지시어에서 영감을 얻었습니다 #define
.
도전
별명을 가진 하나의 문구와 별명 텍스트를 가진 하나의 배열이 제공됩니다. 각 별칭을 해당 텍스트로 바꾸는 초기 문구를 출력하십시오.
별칭은 #
배열에서 하나의 sharp 다음에 해당 인덱스 가 정의됩니다 (인덱스가 0 또는 1에서 시작될 수 있음). 별명은 텍스트 내에 다른 별명을 포함 할 수 있으며 모든 별명을 재귀 적으로 분석해야합니다. 별칭이 무한 루프에 빠지지 않는다고 가정 할 수 있습니다. 별명은 선행 0을 갖지 않습니다 ( #02
index의 별명은 아니고 index의 2
별명 0
은 text입니다 2
).
배열이 20 개의 항목 길이를 전달하지 않는다고 가정 할 수 있습니다.
프로그램이나 함수를 작성하거나 심지어 #define
좋을 수도 있습니다. 🙂
언어에 더 적합한 다른 입력 방법을 사용할 수도 있습니다.
예
phrase: "#0 & #3"
array: [
"Programming #1",
"Puzzles",
"Code",
"#2 Golf"
]
output: "Programming Puzzles & Code Golf"
단계별 :
0> "#0 & #3"
1> "Programming #1 & #2 Golf"
2> "Programming Puzzles & Code Golf"
이 때문에 코드 골프바이트 단위의 최단 답변이 승리합니다!
다른 샘플
phrase: "#0!"
array: [
"We are #1",
"#2",
"#3",
"#4 !",
"graduating"
]
output: "We are graduating !!"
phrase: "##0#1#0#21#3#4"
array: [
"a",
"m",
"z",
"n",
"g"
]
output: "#amaz1ng"
phrase: "##1#23"
array: [
"WEIRD",
"0 C",
"AS"
]
output: "WEIRD CAS3"
phrase: "#1#7#6y#4#7#10s#7b#11#0#0#11r#7#0h#6#5#2#5#9#4."
array: [
"t",
"#12#3",
"#11ga#3",
"#0#10v#11",
"#0h#10#8g",
"#7#8",
"a#8",
" ",
"n",
"o",
"i",
"e",
"P#9s#10"
]
output: "Positive anything is better than negative nothing."
위의 예제는 인덱스가 0에서 시작하는 Array를 사용했습니다.
답변
자바 스크립트 (ES6) 58
재귀 함수
f=(s,h,r=s.replace(/#(1?\d)/g,(_,x)=>h[x]))=>r==s?r:f(r,h)
테스트
f=(s,h,r=s.replace(/#(1?\d)/g,(_,x)=>h[x]))=>r==s?r:f(r,h)
// Version without default parameters, same length but using a global
// f=(s,h)=>(r=s.replace(/#(1?\d)/g,(_,x)=>h[x]))==s?r:f(r,h)
console.log=x=>O.textContent+=x+'\n'
;[
['##1#23',['WEIRD','0 C','AS']],
["#0!",["We are #1","#2","#3","#4 !","graduating"]],
["##0#1#0#21#3#4",["a","m","z","n","g"]],
["##0#1#0#21#13#4",["a","m","z","","g","","","","","","","","","n"]],
["#1#7#6y#4#7#10s#7b#11#0#0#11r#7#0h#6#5#2#5#9#4.",
["t","#12#3","#11ga#3","#0#10v#11","#0h#10#8g","#7#8","a#8"," ","n","o","i","e","P#9s#10"]
],
["#0 & #3",["Programming #1","Puzzles","Code","#2 Golf"]]
].forEach(t=>{
var a=t[0],b=t[1]
console.log(a+' ['+b+']\n -> '+f(a,b))
})
<pre id=O></pre>
답변
Mathematica, 74 바이트
FixedPoint[#~StringReplace~a&,a=0;a=Reverse["#"<>ToString@a++->#&/@#2];#]&
너무 복잡하지 않습니다. 그것의 대부분은 인덱스를 만들기 위해 최선을 다하고 있습니다.
답변
줄리아, 112 (107) 66 바이트
f(s,x)=(r=replace(s,r"#1?\d",m->x[1+parse(m[2:end])]))==s?s:f(r,x)
이것은 문자열 배열을 받아들이고 문자열을 반환하는 재귀 함수입니다. 0 기반 인덱싱을 사용합니다.
우리는 문자열 구성하여 시작 R 입력 문자열 들 정규 표현식의 모든 일치와 #1?\d
의 요소로 대체 x는 경기의 파싱 1 개 + 정수에 해당. 이 같은 경우 의 , 우리는 반환 들 그렇지 않으면 우리는 통과, 재귀, R을 문자열로.
답변
C, 269 232
#define f(p,a,l)char*n,o[999],i=0,c,x;for(strcpy(o,p);o[i];)o[i]==35&isdigit(o[i+1])?c=o[i+1]-48,c=isdigit(o[i+2])&c?10*c+o[i+2]-48:c,n=a[c<l?c:c/10],x=strlen(n),memmove(o+i+x,o+i+2+c/10,strlen(o+i)),i=!memmove(o+i,n,x):++i;puts(o);
요청에 #define
따라 문제를 해결 하는 단일 ! C 매크로는 재귀적일 수 없으므로 문제를 반복적으로 해결해야했습니다. 매크로는 3 개의 인수를 취합니다. 문구 p
배열 a
과 배열의 길이 l
. 나는 ungolfed 솔루션에서 공백 만 제거했습니다. 저장할 수있는 문자가 몇 개 더 있다는 것을 알고 있지만 200 개 미만으로 줄 것이라고 생각하지 않습니다. 이것은 경쟁 솔루션이 아닐 것입니다. 해결책은 완전히 골프입니다. 아래 함수 형태의 언 골프 솔루션 :
f(char*p,char**a,int l){
char o[999]={0},i=0;
strcpy(o,p);
while(o[i]){
if(o[i]=='#'&&isdigit(o[i+1])){
int c = o[i+1]-'0';
if(isdigit(o[i+2])&&c)
c=10*c+o[i+2]-'0';
if(c>=l)
c/=10;
char *n=a[c];
memmove(o+i+strlen(n),o+i+2+c/10,strlen(o+i));
memmove(o+i,n,strlen(n));
i=0;
}else{
i++;
}
}
puts(o);
}
그리고 테스트 코드 :
void test(char *phrase, char **array, int length) {
f(phrase, array, length);
}
main() {
const char *t1[] = {
"Programming #1","Puzzles","Code","#2 Golf"
};
test("#0 & #3", t1, 4);
const char *t2[] = {
"We are #1","#2","#3","#4 !","graduating"
};
test("#0!", t2, 5);
const char *t3[] = {
"a","m","z", "n","g"
};
test("##0#1#0#21#3#4", t3, 5);
const char *t4[] = {
"WEIRD","0 C","AS"
};
test("##1#23", t4, 3);
const char *t5[] = {
"t","#12#3","#11ga#3","#0#10v#11","#0h#10#8g","#7#8","a#8"," ","n","o","i","e","P#9s#10"
};
test("#1#7#6y#4#7#10s#7b#11#0#0#11r#7#0h#6#5#2#5#9#4.", t5, 13);
}
편집 : 골프 마술을했습니다. 내가 생각하는 것만 큼 짧고 읽을 수 없습니다.