Remplacer l'alias pour former des phrases

9

Inspiré par la C- directive #define.

Défi

Étant donné une phrase avec un alias et un tableau avec chaque texte d'alias. Sortez la phrase initiale en remplaçant chaque alias par son texte respectif.

Un alias est défini par un pointu #suivi de son index dans le tableau (l'index peut commencer à zéro ou un). L'alias peut contenir un autre alias à l'intérieur de son texte, et vous devez tous les résoudre (peut-être récursivement). Vous pouvez supposer que l'alias ne fonctionnera jamais dans une boucle infinie. L'alias n'aura pas de zéros non significatifs (ce #02n'est pas un alias à l'index 2, c'est un alias à l'index 0suivi du texte 2).

Vous pouvez supposer que le tableau ne dépassera pas 20 éléments.

Vous pouvez écrire un programme, ou une fonction ou même un #define-il serait bien :)

Vous pouvez également utiliser une autre méthode d'entrée qui convient mieux à votre langue.

Exemple

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

Pas à pas:

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

Puisqu'il s'agit de , la réponse la plus courte en octets gagne!

Un autre échantillon

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

Les exemples ci-dessus ont utilisé Array avec un index commençant à zéro.

supprimé
la source
Si nous utilisons l'option d'indexation 1, n'avons-nous pas à nous soucier de la première chose 0 car #0elle ne devrait pas apparaître? Ou est #01valide mais pas un alias (c'est-à-dire qu'il est simplement laissé tel quel)?
FryAmTheEggman
@FryAmTheEggman. Dans ce cas, vous devez simplement ignorer#01
supprimé
Facile avec python pour 0-9, époustouflant en essayant de minimiser 0-19: D
Antti Haapala
1
Il y a une quantité surprenante de complexité cachée dans ce qui semble être un problème simple. Grande question!
Josh

Réponses:

4

JavaScript (ES6) 58

Fonction récursive

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

Tester

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
la source
J'ai ajouté un autre cas de test avec un index d'alias supérieur à 9.
supprimé
2

Mathematica, 74 octets

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

Pas trop compliqué. La majeure partie est uniquement dédiée à la création des indices.

LegionMammal978
la source
1
@WashingtonGuedes Fixed.
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)

Il s'agit d'une fonction récursive qui accepte une chaîne et un tableau et renvoie une chaîne. Il utilise une indexation basée sur 0.

Nous commençons par construire une chaîne r comme chaîne d'entrée s avec toutes les correspondances de l'expression régulière #1?\dremplacées par l'élément de x correspondant à 1 + l'entier analysé hors de la correspondance. Si cela est égal à s , nous renvoyons s , sinon nous recursons, en passant r comme chaîne.

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

Comme demandé, une seule #definesolution au problème! Les macros C ne peuvent pas être récursives, le problème a donc dû être résolu de manière itérative. La macro prend 3 arguments; la phrase p, le tableau aet la longueur du tableau l. J'ai seulement supprimé les espaces blancs de ma solution non golfée; Je sais qu'il y a quelques autres personnages que je peux enregistrer, mais je ne pense pas que cela me mettra en dessous de 200. Ce ne sera certainement pas une solution compétitive. La solution est entièrement jouée. Solution non golfée sous la forme d'une fonction ci-dessous:

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

Et testez le code:

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: A travaillé la magie du golf. C'est aussi court et illisible que je pense qu'il peut l'être.

Josh
la source
Mec, gentil !!! ... Je voterais à nouveau si je pouvais;)
supprimé