Ganti alias untuk membentuk frasa

9

Terinspirasi oleh C -directive #define.

Tantangan

Diberikan satu frasa dengan beberapa alias, dan satu larik dengan masing-masing teks alias. Keluarkan frasa awal menggantikan setiap alias dengan teks masing-masing.

Sebuah alias didefinisikan oleh satu yang tajam #diikuti oleh indeksnya dalam array (indeks mungkin mulai dari nol atau satu). Alias ​​dapat berisi alias lain di dalam teksnya, dan Anda harus menyelesaikannya semua (mungkin secara rekursif). Anda dapat mengasumsikan alias tidak akan pernah mengalami infinite-loop. Alias ​​tidak akan memiliki angka nol di depan ( #02bukan alias di indeks 2, melainkan alias di indeks 0diikuti oleh teks 2).

Anda dapat mengasumsikan array tidak akan melewati 20 item.

Anda dapat menulis suatu program, atau suatu fungsi atau bahkan #define-akan menyenangkan :)

Anda juga dapat menggunakan metode input lain yang lebih cocok untuk bahasa Anda.

Contoh

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

Selangkah demi selangkah:

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

Karena ini adalah , jawaban tersingkat dalam byte menang!

Sampel lain

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

Contoh di atas menggunakan Array dengan indeks mulai dari nol.

dihapus
sumber
Jika kita menggunakan opsi pengindeksan 1, apakah kita tidak perlu khawatir tentang 0 hal utama karena #0seharusnya tidak muncul? Atau #01valid tetapi bukan alias (yaitu hanya dibiarkan apa adanya)?
FryAmTheEggman
@FryAmTheEggman. Dalam hal ini Anda harus mengabaikan#01
dihapus
Mudah dengan python untuk 0-9, mind blown mencoba meminimalkan 0-19: D
Antti Haapala
1
Ada sejumlah kompleksitas mengejutkan yang tersembunyi dalam apa yang tampaknya merupakan masalah sederhana. Pertanyaan bagus!
Josh

Jawaban:

4

JavaScript (ES6) 58

Fungsi rekursif

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

Uji

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>

edc65
sumber
Saya telah menambahkan test case lain dengan alias 'indeks lebih besar dari 9.
dihapus
2

Mathematica, 74 byte

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

Tidak terlalu rumit. Sebagian besar hanya didedikasikan untuk membuat indeks.

LegionMammal978
sumber
1
@WashingtonGuedes Diperbaiki.
LegionMammal978
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)

Ini adalah fungsi rekursif yang menerima string suatu array dan mengembalikan string. Ini menggunakan pengindeksan berbasis 0.

Kita mulai dengan membangun string r sebagai string input s dengan semua kecocokan dari ekspresi reguler #1?\ddiganti dengan elemen x yang sesuai dengan 1 + bilangan bulat yang diuraikan keluar dari kecocokan. Jika ini sama dengan s , kita mengembalikan s , jika tidak kita berulang, melewati r sebagai string.

Alex A.
sumber
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);

Seperti yang diminta, satu #definepemecahan masalah! Makro C tidak bisa rekursif, jadi masalahnya harus dipecahkan secara iteratif. Makro mengambil 3 argumen; frasa p, array a, dan panjang array l. Saya hanya menghapus ruang putih dari solusi saya yang tidak disunat; Saya tahu ada beberapa karakter lagi yang bisa saya selamatkan, tetapi saya rasa itu tidak akan membuat saya di bawah 200. Ini pasti bukan solusi kompetitif. Solusi sepenuhnya golf. Solusi yang tidak digabungkan dalam bentuk fungsi di bawah ini:

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

Dan kode uji:

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: Mengerjakan beberapa keajaiban golf. Ini sesingkat dan tidak terbaca yang saya pikir bisa didapat.

Josh
sumber
Astaga, bagus !!! ... Saya akan memperbaikinya lagi jika saya bisa;)
dihapus