İfadeler oluşturmak için takma adı değiştirin


9

C direktifinden esinlenilmiştir #define.

Meydan okuma

Bazı takma adlarla bir ifade ve her takma ad metniyle bir dizi verilir. Her diğer adı kendi metniyle değiştirerek ilk ifadeyi çıktılayın.

Bir takma ad, bir keskin ve #ardından dizideki dizini ile tanımlanır (dizin sıfır veya birde başlayabilir). Takma ad, metninin içinde başka bir takma ad içerebilir ve bunların tümünü (belki yinelemeli olarak) çözmeniz gerekir. Takma adın hiçbir zaman sonsuz döngüye girmeyeceğini varsayabilirsiniz. Takma ad önde gelen sıfırlara sahip olmaz ( #02dizindeki takma ad değil, dizindeki 2takma ad ve 0ardından metin 2).

Dizinin 20 öğeyi geçmeyeceğini varsayabilirsiniz.

Bir program yazabilir veya bir işlev hatta bir #define-it iyi olurdu :)

Dilinize daha uygun başka bir giriş yöntemi de kullanabilirsiniz.

Misal

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

Adım adım:

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

Bu olduğu için , bayt cinsinden en kısa cevap kazanır!

Başka örnekler

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

Yukarıdaki örneklerde dizin sıfırdan başlayan Array kullanılmıştır.


1 endeksleme seçeneğini kullanırsak, neden 0'ın #0görünmemesi gerektiği konusunda endişelenmemize gerek yok mu? Yoksa #01geçerli ancak bir takma ad değil (yani, olduğu gibi bırakılıyor)?
FryAmTheEggman

@FryAmTheEggman. Bu durumda görmezden #01
kaldırıldı

0-9 için python ile kolay, zihin 0-19 en aza indirmeye çalışıyor şişmiş: D
Antti Haapala

1
Basit bir sorun gibi görünen şeyde gizli bir karmaşıklık var. Harika bir soru!
Josh

Yanıtlar:


4

JavaScript (ES6) 58

Özyinelemeli işlev

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

Ölçek

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>


Takma ad dizini 9'dan büyük olan başka bir test durumu ekledim.
kaldırıldı

2

Mathematica, 74 bayt

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

Çok karmaşık değil. Çoğu sadece endeksleri yaratmaya adanmıştır.


1
@WashingtonGuedes Düzeltildi.
LegionMammal978

2

Julia 112 107 66 bayt

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

Bu, bir dizeyi ve diziyi kabul eden ve bir dize döndüren özyinelemeli bir işlevdir. 0 tabanlı indeksleme kullanır.

Biz bir dize oluşturarak başlamak r girdi dizesi olarak s Normal ifadenin tüm maçları ile #1?\dunsuru ile değiştirilir x maçın dışarı çözümlenir 1 + tamsayı karşılık gelir. Bu eşitse s , biz dönmek s aksi takdirde biz geçen Recurse, r string.


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

İstendiği gibi, tek bir #definesorunu çözme! C makroları özyinelemeli olamaz, bu nedenle sorunun yinelemeli olarak çözülmesi gerekiyordu. Makro 3 argüman alır; ifade p, dizi ave dizinin uzunluğu l. Sadece boşluksuz çözümümden boşluk bıraktım; Kaydedebileceğim birkaç karakter daha olduğunu biliyorum, ama beni 200'ün altına indireceğini sanmıyorum. Bu kesinlikle rekabetçi bir çözüm olmayacak. Çözüm tamamen golf oynamaktadır. Aşağıdaki fonksiyon şeklinde çözülmemiş çözüm:

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

Ve test kodu:

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: Golf bir sihir çalıştı. Sanırım alabildiğim kadar kısa ve okunaksız.


Adamım, güzel biri !!! ... Yapabilirsem tekrar vekalet ediyorum;)
kaldırıldı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.