แทนที่นามแฝงเป็นวลี


9

แรงบันดาลใจจากC#define -directive

ท้าทาย

ระบุวลีหนึ่งด้วยนามแฝงบางส่วนและอีกหนึ่งอาร์เรย์มีข้อความนามแฝงแต่ละข้อความ เอาท์พุทวลีเริ่มต้นแทนที่แต่ละนามแฝงด้วยข้อความที่เกี่ยวข้อง

นามแฝงถูกกำหนดโดยหนึ่งคม#ตามด้วยดัชนีในอาร์เรย์ (ดัชนีอาจเริ่มต้นที่ศูนย์หรือหนึ่ง) นามแฝงสามารถมีนามแฝงอื่นภายในข้อความและคุณต้องแก้ไขพวกเขาทั้งหมด (อาจเรียกซ้ำ) คุณสามารถสันนิษฐานได้ว่านามแฝงจะไม่วิ่งเข้าไปในวงไม่มีที่สิ้นสุด นามแฝงจะไม่มีเลขศูนย์นำหน้า ( #02ไม่ใช่นามแฝงที่ดัชนี2เป็นนามแฝงที่ดัชนี0ตามด้วยข้อความ2)

คุณสามารถสันนิษฐานได้ว่าอาเรย์จะไม่ผ่านความยาว 20 รายการ

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นหรือแม้แต่#define-it ก็ดี :)

คุณสามารถใช้วิธีการป้อนข้อมูลอื่นที่เหมาะกับภาษาของคุณมากขึ้น

ตัวอย่าง

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

ตัวอย่างข้างต้นใช้ Array พร้อมดัชนีเริ่มต้นที่ศูนย์


หากเราใช้ตัวเลือกการจัดทำดัชนี 1 เราไม่ต้องกังวลเกี่ยวกับสิ่งที่นำหน้าเพราะ#0ไม่ควรปรากฏหรือไม่ หรือ#01ถูกต้อง แต่ไม่ใช่นามแฝง (เช่นเพิ่งเป็นไปตามที่เป็นอยู่)?
FryAmTheEggman

@FryAmTheEggman ในกรณีดังกล่าวคุณควรเพิกเฉย#01
นำออก

ง่ายด้วย python สำหรับ 0-9 อย่าลืมพยายามลด 0-19: D
Antti Haapala

1
มีจำนวนความซับซ้อนที่น่าประหลาดใจซ่อนอยู่ในสิ่งที่ดูเหมือนจะเป็นปัญหาง่าย เป็นคำถามที่ดีมาก!
Josh

คำตอบ:


4

JavaScript (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>


ฉันได้เพิ่มอีกกรณีทดสอบที่มีดัชนีนามแฝงมากกว่า 9
ลบ

2

Mathematica, 74 ไบต์

FixedPoint[#~StringReplace~a&,a=0;a=Reverse["#"<>ToString@a++->#&/@#2];#]&

ไม่ซับซ้อนเกินไป ส่วนใหญ่จะใช้เพื่อสร้างดัชนีเท่านั้น


1
@WashingtonGuedes แก้ไขแล้ว
LegionMammal978

2

Julia, 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 + จำนวนเต็มแยกออกจากการแข่งขัน หากนี่เท่ากับsเราจะคืนค่าsมิฉะนั้นเราจะเรียกเก็บเงินคืนผ่านrเป็นสตริง


1

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ย์ ฉันถอดช่องว่างออกจากสารละลายที่ไม่ได้รับแรง ฉันรู้ว่ามีตัวละครอีกไม่กี่ตัวที่ฉันสามารถบันทึกได้ แต่ฉันไม่คิดว่ามันจะทำให้ฉันต่ำกว่า 200 ตัวได้นี่ไม่ใช่วิธีการแข่งขันที่แน่นอน ทางออกคือกอล์ฟอย่างเต็มที่ วิธีการแก้ปัญหา Ungolfed ในรูปแบบของฟังก์ชั่นด้านล่าง:

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

แก้ไข: ใช้เวทมนตร์กอล์ฟ มันสั้นและอ่านไม่ออกอย่างที่ฉันคิดว่ามันทำได้


ผู้ชายคนหนึ่งที่ดี !!! ... ฉันจะโหวตมันอีกครั้งถ้าทำได้;)
นำออก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.