Thay thế bí danh để tạo thành cụm từ


9

Lấy cảm hứng từ C -directive #define.

Thử thách

Cho một cụm từ với một số bí danh và một mảng với mỗi văn bản bí danh. Xuất cụm từ ban đầu thay thế từng bí danh bằng văn bản tương ứng.

Một bí danh được xác định bởi một sắc nét #theo sau là chỉ mục của nó trong mảng (chỉ mục có thể bắt đầu từ 0 hoặc 1). Bí danh có thể chứa một bí danh khác trong văn bản của nó và bạn phải giải quyết tất cả chúng (có thể đệ quy). Bạn có thể giả sử bí danh sẽ không bao giờ chạy vào một vòng lặp vô hạn. Bí danh sẽ không có các số 0 đứng đầu ( #02không phải là bí danh tại chỉ mục 2, đó là bí danh tại chỉ mục 0theo sau là văn bản 2).

Bạn có thể giả sử mảng sẽ không vượt qua 20 mục.

Bạn có thể viết một chương trình, hoặc một chức năng hoặc thậm chí là #define- nó sẽ rất tuyệt :)

Bạn cũng có thể sử dụng một phương thức nhập khác phù hợp hơn với ngôn ngữ của bạn.

Thí dụ

phrase: "#0 & #3"
array: [
    "Programming #1",
    "Puzzles",
    "Code",
    "#2 Golf"
]
output: "Programming Puzzles & Code Golf"

Từng bước một:

0> "#0 & #3"
1> "Programming #1 & #2 Golf"
2> "Programming Puzzles & Code Golf"

Vì đây là , câu trả lời ngắn nhất bằng byte sẽ thắng!

Một mẫu khác

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

Các ví dụ trên sử dụng Array với chỉ số bắt đầu từ 0.


Nếu chúng ta sử dụng tùy chọn lập chỉ mục 1, chúng ta không phải lo lắng về điều 0 hàng đầu #0không nên xuất hiện? Hoặc là #01hợp lệ nhưng không phải là bí danh (nghĩa là nó chỉ còn lại trong đó)?
FryAmTheEggman 17/03/2016

@FryAmTheEggman. Trong trường hợp đó, bạn chỉ nên bỏ qua#01
đã xóa

Dễ dàng với con trăn trong 0-9, tâm trí cố gắng giảm thiểu 0-19: D
Antti Haapala 17/03/2016

1
Có một số lượng phức tạp đáng ngạc nhiên ẩn trong những gì dường như là một vấn đề đơn giản. Câu hỏi tuyệt vời!
Josh

Câu trả lời:


4

JavaScript (ES6) 58

Hàm đệ quy

f=(s,h,r=s.replace(/#(1?\d)/g,(_,x)=>h[x]))=>r==s?r:f(r,h)

Kiểm tra

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>


Tôi đã thêm một trường hợp thử nghiệm khác với chỉ số bí danh lớn hơn 9.
đã xóa

2

Toán học, 74 byte

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

Không quá phức tạp. Hầu hết chỉ dành riêng cho việc tạo các chỉ số.


1
@WashingtonGuedes Đã sửa.
LegionMammal978 17/03/2016

2

Julia, 112 107 66 byte

f(s,x)=(r=replace(s,r"#1?\d",m->x[1+parse(m[2:end])]))==s?s:f(r,x)

Đây là một hàm đệ quy chấp nhận một chuỗi một mảng và trả về một chuỗi. Nó sử dụng lập chỉ mục dựa trên 0.

Chúng tôi bắt đầu bằng cách xây dựng một chuỗi r là chuỗi đầu vào s với tất cả các kết quả khớp của biểu thức chính quy được #1?\dthay thế bằng phần tử x tương ứng với 1 + số nguyên được phân tách khỏi khớp. Nếu giá trị này bằng s , chúng ta trả về s , nếu không, chúng ta lặp lại, chuyển r thành chuỗi.


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

Theo yêu cầu, một #definegiải quyết vấn đề! Các macro C không thể được đệ quy, vì vậy vấn đề phải được giải quyết lặp đi lặp lại. Macro có 3 đối số; cụm từ p, mảng avà độ dài của mảng l. Tôi chỉ tước khoảng trắng khỏi giải pháp vô căn cứ của mình; Tôi biết có một vài nhân vật nữa tôi có thể lưu, nhưng tôi không nghĩ rằng nó sẽ giúp tôi dưới 200. Đây chắc chắn sẽ không phải là một giải pháp cạnh tranh. Giải pháp được đánh golf hoàn toàn. Giải pháp chưa được xử lý dưới dạng hàm dưới đây:

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

Và mã kiểm tra:

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

EDIT: Làm việc một số phép thuật golf. Nó ngắn và không thể đọc được như tôi nghĩ nó có thể nhận được.


Người đàn ông, tốt đẹp !!! ... Tôi sẽ nâng cấp nó một lần nữa nếu tôi có thể;)
đã xóa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.