Ersetzen Sie den Alias, um Phrasen zu bilden

9

Inspiriert von der C- Direktive #define.

Herausforderung

Gegeben eine Phrase mit einem Alias ​​und ein Array mit jedem Alias-Text. Geben Sie die ursprüngliche Phrase aus und ersetzen Sie jeden Alias ​​durch den entsprechenden Text.

Ein Alias ​​wird durch einen Punkt definiert, #gefolgt von seinem Index im Array (der Index kann bei Null oder Eins beginnen). Der Alias ​​kann einen anderen Alias ​​in seinem Text enthalten, und Sie müssen alle auflösen (möglicherweise rekursiv). Sie können davon ausgehen, dass der Alias ​​niemals in eine Endlosschleife gerät. Alias ​​hat keine führenden Nullen ( #02ist kein Alias ​​am Index 2, sondern ein Alias ​​am Index, 0gefolgt vom Text 2).

Sie können davon ausgehen, dass das Array nicht länger als 20 Elemente ist.

Du kannst ein Programm schreiben oder eine Funktion oder sogar ein #define-es wäre schön :)

Sie können auch eine andere Eingabemethode verwenden, die besser zu Ihrer Sprache passt.

Beispiel

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

Schritt für Schritt:

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

Da dies , gewinnt die kürzeste Antwort in Bytes!

Ein weiteres Beispiel

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

In den obigen Beispielen wurde ein Array mit einem Index verwendet, der bei Null beginnt.

entfernt
quelle
Wenn wir die 1-Indizierungsoption verwenden, müssen wir uns dann keine Sorgen um die führende 0 machen, da #0sie nicht angezeigt werden sollte? Oder ist #01gültig, aber kein Alias ​​(dh es bleibt einfach so wie es ist)?
FryAmTheEggman
@FryAmTheEggman. In diesem Fall sollten Sie einfach ignorieren#01
entfernt
Einfach mit Python für 0-9, umwerfend versucht 0-19 zu minimieren: D
Antti Haapala
1
In einem scheinbar einfachen Problem steckt eine überraschende Menge an Komplexität. Gute Frage!
Josh

Antworten:

4

JavaScript (ES6) 58

Rekursive Funktion

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

Prüfung

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
quelle
Ich habe einen anderen Testfall mit Alias' Index von mehr als 9 hinzugefügt
entfernt
2

Mathematica, 74 Bytes

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

Nicht zu kompliziert. Das meiste davon ist nur der Erstellung der Indizes gewidmet.

LegionMammal978
quelle
1
@WashingtonGuedes behoben.
LegionMammal978
2

Julia, 112 107 66 Bytes

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

Dies ist eine rekursive Funktion, die eine Zeichenfolge und ein Array akzeptiert und eine Zeichenfolge zurückgibt. Es verwendet eine 0-basierte Indizierung.

Wir beginnen mit der Konstruktion einer Zeichenfolge r als Eingabezeichenfolge s, wobei alle Übereinstimmungen des regulären Ausdrucks #1?\ddurch das Element x ersetzt werden , das 1 + der aus der Übereinstimmung analysierten Ganzzahl entspricht. Wenn dies gleich s ist , geben wir s zurück , andernfalls rekursieren wir und übergeben r als Zeichenfolge.

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

Wie gewünscht, eine einzige #defineLösung des Problems! C-Makros können nicht rekursiv sein, daher musste das Problem iterativ gelöst werden. Das Makro akzeptiert 3 Argumente. die Phrase p, das Array aund die Länge des Arrays l. Ich habe nur Leerzeichen aus meiner Lösung ohne Wolf entfernt. Ich weiß, dass ich noch ein paar Zeichen speichern kann, aber ich glaube nicht, dass ich dadurch unter 200 komme. Dies wird definitiv keine wettbewerbsfähige Lösung sein. Die Lösung ist voll Golf. Ungolfed Lösung in Form einer Funktion unten:

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

Und Testcode:

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: Hat etwas Golfzauber gewirkt. Es ist so kurz und unleserlich, wie ich denke, dass es nur geht.

Josh
quelle
Mann, nett !!! ... Ich würde es upvote wieder , wenn ich könnte;)
entfernt