Code golf pour mes vrais amis

35

... et vrai golf pour mes amis de code.

Il s’agit d’un défi basé sur une bande dessinée XKCD d’un an, qui consiste principalement en toasts (parodies du premier dans la bande dessinée) suivant un schéma distinct, mais avec quelques légères variations.

Votre tâche est d’écrire un programme (ou une fonction) qui prend la première moitié d’un toast de la bande dessinée (tout le reste friends) en entrée (via stdin ou un argument de fonction) et affiche (ou renvoie) le texte précis de la seconde moitié. Vous n'êtes pas obligé de gérer une entrée non valide, des failles standard s'appliquent, le code le plus court en octets gagne.

Exemples

Pour aider ceux qui ne veulent pas copier les toasts de n’importe où ailleurs, voici tous ceux-ci, séparés en entrée et en sortie.

Input: Champagne for my real friends
Output: and real pain for my sham friends!

Input: Pseudopods for my real friends
Output: and real pods for my pseudo-friends!

Input: Petticoats for my real friends
Output: and real coats for my petty friends.

Input: Loosestrife for my real friends
Output: and real strife for my loose friends!

Input: Ladybugs for my real friends
Output: and real bugs for my lady friends!

Input: Single-payer for my real friends
Output: and RealPlayer for my single friends.

Input: Tumbleweeds for my real friends
Output: and real weed for my Tumblr friends!

Input: Fauxhawks for my real friends
Output: and real hawks for my faux friends!

Input: Platonic solids for my real friends
Output: and real solids for my platonic friends!
ivzem
la source
Je pense que vous avez une faute de frappe à Single-payer(au lieu de Single-player).
Kevin Cruijssen
4
Kevin: Non, c'est vraiment ça Single-payer.
Ivzem
@KevinCruijssen - C'est peut-être une faute de frappe, mais si c'est du moins Randall @ XKCD, pas ivzem. Il y a une discussion à ce sujet sur Explain xkcd . Aussi, ivzem - dès que j'ai vu le titre sur la liste HNQ, j'étais sûr que vous faisiez référence à cette bande dessinée. Bien joué!
Bobson

Réponses:

18

Retina , 119 octets

La version précédente ne gérait pas correctement l'espace dans "Solides platoniques", celle-ci fonctionne et est plus courte :)

ew
rw
eds
ed
(\w+) ?([^oatr ]\w{3}.+)real
and real $2$1
C
S
gne
in
o 
o-
ti
ty
T`TL`Tl
p\w+y.+
$&.
s$
s!
real -p
RealPl

Essayez-le en ligne!

Cela transforme l'entrée en sortie à travers une série de substitutions.

La partie la plus intéressante est cette substitution (une sorte de golf regex):

(\w+) ?([^oatr ]\w{3}.+)real
and real $2$1

Ce qui fait presque tout le travail, en scindant le premier mot, en plaçant ses morceaux aux bons endroits, en supprimant les espaces supplémentaires et en construisant la structure de la sortie. Pour fonctionner correctement sur le scénario de test "Tumbleweeds", cela dépend de la substitution précédente "eds" -> "ed".

Le reste est principalement composé de substitutions qui traitent de cas particuliers. Les autres parties intéressantes sont:

T`TL`Tl

Cela rend tout sauf "T" (pour Tumblr) en minuscule.

p\w+y.+
$&.
s$
s!

Cela place un "." à la fin de chaque phrase contenant un mot avec un "y" quelques lettres après un "p" ("petit" et "payeur" dans la pratique). Puis place un "!" à la fin de toutes les phrases se terminant par un "s" (tous les autres).

Leo
la source
Cela imprime un espace supplémentaire après platonic. Solution proposée: TIO (+5 bytes)
junkie en mathématiques
1
@math_junkie Merci, j'ai mis en ligne une nouvelle version qui résout le problème d'espace et qui est encore plus courte :)
Leo
10

Python 2, 291 269 293 255 247 octets

Merci d' Erik the Outgolferavoir économisé 22 octets!

+24 octets à compte pour certaines sorties se terminant au .lieu de!

lambda x:'and '+['real '+'pain%ssham ,pods%spseudo-,coats%spetty ,strife%sloose ,bugs%slady ,weed%sTumblr ,hawks%sfaux ,solids%splatonic '.split(',')['noarsekc'.find(x[7])],'RealPlayer%ssingle ']['-'in x]%' for my '+x[-7:]+'!.'['-'in x or'tt'in x]

Solution simple pour commencer les choses. Vérifie la huitième lettre de l'entrée, comme suggéré dans les commentaires, et recherche la sortie correspondante dans un dictionnaire sous forme de tableau.

Essayez-le en ligne!

junkie de maths
la source
Vous avez peut-être oublié Single-payer for my real friends...
Mathieu Rodic
@MathieuRodic Non, c'est tout à fait intentionnel. RealPlayerest un cas spécial
junkie en mathématiques
Oups, désolé, lisez trop vite.
Mathieu Rodic
6

SOGL , 143 octets

_╔x⅜²‘,8WWAa"⅞+1Tλ²⅞ƨ◄…χŗbdŗu8ņ∑Ι⅓I‼hzΔμō┘═q‼xΘ▼²ηpG⅔─┌¡↕+wd÷[≈┐α┌ļ○(‚δΦEΤα{‚φ▒k׀:╚s&⅛↑»‘ |Θwθ1w"ρ└⁸‘S∆∫⁴‘a1>*+oo"¤Ε○Φr‘o2w _@ŗo"æn‘o"χ}49⁶‘aWT

Ceci utilise cette chaîne comme partie principale. "|" Les séparateurs et "_" sont des espaces réservés afin que la scission fonctionne correctement.

RealPlayer single_|weed Tumblr_|strife loose_|bugs lady_|pods pseudo-|pain sham_|solids platonic_|coats petty_|hawks faux_

Exemple de saisie: "Solides platoniques pour mes vrais amis" Explication:

..‘,8WWAa"..‘ |Θwθ1w"..‘S∆∫⁴‘a1>*+oo"..‘o2w _@ŗo"..‘o"..‘aWT  strings shortened
..‘                                                           push "personcake" (the indexing string) ["personcake"]
    8W                                                        get the 8-th char                       
   ,                                                           from the input                         ["personcake", "c"]
      W                                                       get its in "personcake" (1-indexed)     [7]
       Aa                                                     save on variable A                      [7]
         "..‘                                                 push the long string                    [7, "RealPlayer...faux_"]
              |Θ                                              split on "|"                            [7, ["RealPlayer single_", ..., "hawks faux_"]]
                w                                             get the Ath item of the array           [["..."], "solids platonic_"]
                 θ                                            split on spaces                         [["..."], ["solids", "platonic_"]]
                  1w                                          get the 1st item                        [["..."], ["solids", "platonic_"], "solids"]
                    "..‘                                      push "and "                             [["..."], ["solids", "platonic_"], "solids", "and "]
                        S∆∫⁴‘                                 push "real "                            [["..."], ["solids", "platonic_"], "solids", "and ", "real "]
                             a1>*                             multiply by A(index) > 1                [["..."], ["solids", "platonic_"], "solids", "and ", "real "]
                                 +                            join together                           [["..."], ["solids", "platonic_"], "solids", "and real "]
                                  o                           output                                  [["..."], ["solids", "platonic_"], "solids"]
                                   o                          output (the 1st item of the array)      [["..."], ["solids", "platonic_"]]
                                    "..‘o                     output " for my "                       [["..."], ["solids", "platonic_"]]
                                         2w                   get the 2nd item of the array           [["..."], ["solids", "platonic_"], "platonic_"]
                                            _@ŗ               replace "_" with " "                    [["..."], ["solids", "platonic_"], "platonic "]
                                               o              output that                             [["..."], ["solids", "platonic_"]]
                                                "..‘o         output "friends"                        [["..."], ["solids", "platonic_"]]
                                                     "..‘     push ".!!!!!!.!"                        [["..."], ["solids", "platonic_"], ".!!!!!!.!"]
                                                         aW   get the Ath item                        [["..."], ["solids", "platonic_"], "!"]
                                                           T  output, disabling implicit output       [["..."], ["solids", "platonic_"]]
dzaima
la source
6

Python 3 , 788 , 403 , 359 396 octets

Dernière version

C'est maintenant ma cinquième tentative. J'ai réussi à réduire de moitié la taille de mon programme d'origine. Il inclut maintenant le "-" manquant et je pense que c'est une solution complète. Je soupçonne encore du côté volumineux; mais beaucoup plus proche du but. J'ai eu beaucoup d'aide . Merci pour tous les conseils utiles.

s=input()
x=0
l= "Ch,pain,Sham,Ps,pods,psuedo-,Pe,coats,petty,Lo,strife,loose,La,bugs,lady,Si,RealPlayer,single,Tu,weed,Tumblr,Fa,hawks,faux,Pl,solids,platonic".split(",")
a,b,c,d,e,f,g,h = " and real","for my","friends",".!","print(a,l[p+1],b,l[p+2]",",c+d[0])","+c+d[1])",",c+d[1])"
for p in range(0,27,3):
 x+=1
 if s[:2] == l[p]:
  if x == 2: eval(e+g)
  else: eval(e+f if x in(3,6) else e+h)

Essayez-le en ligne!


Affichage original

C’est mon premier article sur le code golf, alors excuses à l’avance pour mon programme maladroit. Vous ne pouvez pas voir comment un programme pourrait être créé pour convertir "Champagne" en "douleur", "simulacre" en analysant les mots. Cependant, j'aimerais voir quelqu'un d'autre résoudre ce problème. Donc, comme mon niveau de compétence indique que mon programme doit savoir à l’avance que "Champagne" est "douloureux", "simulacre", il ne semblait guère utile de coder une demande d’entrée. En conséquence, je l'ai laissé de côté et j'ai été un peu littéral avec mes impressions. J'espère que ça va:)

phraseList= [   ("Champagne","pain","Sham"), 
                ("Psudeopods","pods","psuedo-"), 
                ("Petticoats","coats","petty"),
                ("Loosestrife","strife","loose"),
                ("Ladybugs","bugs","lady"),
                ("Single-payer","coats","petty"),
                ("Petticoats","RealPlayer","single"),
                ("Tumbleweeds","weed","Tumblr"),
                ("Fauxhawks","hawks","faux"),
                ("Platonic solids","real solids","platonic")
                ]

for phrase in phraseList:
    print("Input: ",phrase[0], "for my real friends.")
    if "-" in phrase[2]:
        print("Output: and real", phrase[1], "for my", phrase[2]+ "friends!")
    else:
        print("Output: and real", phrase[1], "for my", phrase[2], "friends!")
Brian
la source
3
Depuis le centre d’aide : Toutes les solutions aux défis doivent: [...] être un sérieux prétendant aux critères gagnants utilisés. Par exemple, une entrée à un concours de golf de code doit être jouée au golf , et une entrée à un concours de vitesse devrait tenter d'être rapide.
Erik l'Outgolfer
1
Bonjour et bienvenue sur le site. C’est une question de code-golf qui vous oblige à faire un effort pour minimiser la longueur de votre code. Vous devez supprimer les espaces inutiles et renommer les variables de 1 caractère.
Wheat Wizard
Vous pouvez mettre toute la phraseListe sur une ligne, réduire l'indentation à un espace, mettre les empreintes dans une seule ligne avec if et else et les espaces dans les empreintes ne sont pas nécessaires. Quoi qu'il en soit, je ne sais pas si vous êtes autorisé à simplement imprimer toutes les sorties;)
Mega Man
1
Bonjour! Il semble que ce soit votre première réponse au code de golf. Malheureusement, vous semblez avoir mal compris la question, en particulier le tableau "Exemples" en bas, qui montre simplement comment chaque entrée doit correspondre à une sortie respective. Actuellement, votre programme n’imprime que cette table._En outre, il est courant de placer votre code dans un bloc de code (sélectionnez-le et cliquez sur {}) pour une meilleure lisibilité et pour mentionner votre langue de choix et le nombre d'octets, car ce site est ça ressemble plus à une compétition qu'à un site de questions-réponses._ Wheat Wizard l'a déjà fait, alors c'est mieux
ivzem
Bonjour et bienvenue sur PPCG. Vous pourriez perdre beaucoup d'octets en supprimant des espaces et en utilisant des variables d'une seule lettre. Je me souviens que lorsque j'ai commencé ici, il a fallu un certain temps pour s'y habituer. Je suppose que tu es comme moi. Vous passez beaucoup de temps à écrire du code lisible. Comme je l'ai dit, bienvenue dans PPCG et un nouveau monde;)
ElPedro
6

Röda , 299 292 288 259 octets

4 octets enregistrés grâce à @fergusq pour une utilisation ,au lieu de ..dans les pushinstructions

Octets sauvés grâce à @fergusq me montrant le chemin de indexOf

h a{r=indexOf(a[7:8],"noarspekc")A="pain>pods>coats>strife>Player>bugs>weed>hawks>solids>sham >pseudo->petty >loose >lady >single >Tumblr >faux >platonic >!>!>.>!>!>.>!>!>!"/">";["and "];["Real"]if[r=4]else["real "];[A[r]," for my ",A[r+9],"friends",A[r+18]]}

Essayez-le en ligne!

Si proche de Python ... si proche .... Votre geste, Python.

Explication

h a{
  r=indexOf(a[7:8],"noarspekc")  /*Gets the index of the character in this string*/
  /*Variable A contains all the unique words for each test case*/
  A="pain>pods>coats>strife>Player>bugs>weed>hawks>solids>sham >pseudo->petty >loose >lady >single >Tumblr >faux >platonic >!>!>.>!>!>.>!>!>!"/">"
  ["and "]
  ["Real"]if[r=4]else["real "]   /*RealPlayer*/
  [A[r]," for my ",A[r+9],"friends",A[r+18]]   /*Print everything using var A*/
}
Kritixi Lithos
la source
Pouvez-vous sauvegarder un octet en utilisant une interpolation de chaîne dans la dernière instruction? Edit: en fait, le moyen le plus court est probablement de placer plusieurs chaînes dans le flux au lieu d’une seule, c’est-à-dire. remplacer ..par ,.
fergusq
@fergusq Merci pour le tuyau!
Kritixi Lithos
Aussi, vous pouvez simplement utiliser r=indexOf(a[7:8],"noarspekc").
Fergusq
@fergusq Ah, je ne savais pas qu'un tel construit existait. Merci!
Kritixi Lithos
5

JavaScript (ES6), 230 228 221 216 octets

s=>'and '+((n='paonrsekc'.search(s[7]))?'real ':'')+'RealPl740s5 /450p3y /540p5-/pain0s3 /460l4 /340l3 /540T4r /350f3 /860p7 '.split`/`[n].replace(/\d\d?/g,n=>s.substr(n/10+1,n%10)||' for my ')+'friends'+'.!'[+(n>1)]

Tester

Arnauld
la source
3

PHP, 202 220 204 203 octets

and real <?=[pods,solids,hawks,strife,RealPlayer,pain,bugs,weed,coats][$q=md5($argv[1].LnI)%9].' for my '.[pseudo,platonic,faux,loose,single,sham,lady,Tumblr,petty][$q].' -'[!$q].friends.'.!'[!$q||$q&3];
utilisateur63956
la source
3

Perl, 173 168 octets

En supprimant les retours à la ligne et les indentations, cela devient 173 octets de code Perl5. Volé sans vergogne la première expression rationnelle de la réponse de Leo à la rétine. (Le mien était quelques caractères plus long)

sub f{
  my($_)=@_;
  s,(\S+[oieyxm ])(\S{4}.+)real,and real $2\l$1,;
  s,gne,in,;
  s,ch,sh,;
  s,ti,ty,;
  s,eds,ed,;
  s,tumble,Tumblr,;
  s,real -p,RealPl,;
  s,o ,o-,;
  s,c ,c,;
  /ng|tt/?"$_.":"$_!"
}

Pour perl5 version> = 5.14, 5 octets supplémentaires peuvent être supprimés avec eval et le nouveau modificateur de substitution / r regexp. Pour finir avec 168 octets:

sub f{my($_)=@_;eval's,(\S+[oieyxm ])(\S{4}.+)real,and real $2\l$1Xgne,inXch,shXti,tyXeds,edXtumble,TumblrXreal -p,RealPlXo ,o-Xc ,c,;/ng|tt/?"$_.":"$_!"'=~s/X/,;s,/gr}

Essayez-le en ligne!

Kjetil S.
la source
2

C, 367 octets

Ne s'est pas retrouvé aussi court qu'il y paraissait.

i,j,c;f(char*s){c=s[7]-97;char t[9],u[200];char*r=s;s+=j=c&&c-17?c-10&&c-18?c-2?5:8:3:4;for(i=0;*++s-32;t[i++]=*s);t[c-4?i:i-1]=0;for(i=0;*r++-t[0];)u[i++]=*(r-1);u[i]=32;u[i+1]=0;u[0]+=32;u[c?i:i-1]=c?c-2?c-14?32:45:0:121;printf("and %s%s for my %sfriends%c",c-15?"real ":"RealPlayer",c-15?c-13?t:"pain":"",c-13?c-4?c-17?u:"loose ":"Tumblr ":"sham ",c&&c-15?33:46);}
Steadybox
la source
2

Java 7, 585 553 octets

import java.util.*;String c(String s){Map m=new HashMap(){{put("Ch","pain");put("Ps","pods");put("Pe","coats");put("Lo","strife");put("La","bugs");put("Si","Player");put("Tu","weed");put("Fa","hawks");put("Pl","solids");put("Ch1","sham ");put("Ps1","pseudo-");put("Pe1","petty ");put("Lo1","loose ");put("La1","lady ");put("Si1","single ");put("Tu1","Tumblr ");put("Fa1","faux ");put("Pl1","platonic ");}};String r=s.substring(0,2);int c=r.charAt(1);return"and "+(c=='i'?"Real":"real ")+m.get(r)+" for my "+m.get(r+1)+"friends"+(c=='i'|c=='e'?'.':'!');}

-32 octets grâce à @Zircon .

Peut certainement être joué au golf en utilisant quelque chose de différent d'une carte.

Explication:

import java.util.*;            // Import required for the Map & HashMap
String c(String s){            // Method with String parameter and String return-type
  Map m=new HashMap(){{        //  The Map
    put("Ch","pain");put("Ps","pods");put("Pe","coats");put("Lo","strife");put("La","bugs");put("Si","Player");put("Tu","weed");put("Fa","hawks");
                               //  Add mapping from first two characters with first word
    put("Ch1","sham ");put("Ps1","pseudo-");put("Pe1","petty ");put("Lo1","loose ");put("La1","lady ");put("Si1","single ");put("Tu1","Tumblr ");put("Fa1","faux ");put("Pl1","platonic ");
                               //  Add mapping from first two characters + "1" with second word (+ space or '-' for edge-case `pseudo-friends`)
  }};                          // End of Map initialization
  String r=s.substring(0,2);   //  Get the first two characters of the input String
  int c=r.charAt(1);           //  Get the second character
  return "and "                //  return "and "
    + (c=='i'?"Real":"real ")  //   + "Real" or "real " for edge-case `RealPlayers`
    + m.get(r)                 //   + first word from Map
    + " for my "               //   + " for my "
    + m.get(r+1)               //   + second word from Map
    + "friends"                //   + "friends"
    + (c=='i'|c=='e' ? '.'     //   + '.' for edge-cases 'Petticoats' and 'Single-player
      : '!');                  //     or '!' for all other cases
}                              // End of method

Code de test:

Essayez ici. (ideone.com est buggé récemment, donc j'utilise TIO maintenant ..)

import java.util.*;
class M{
  static String c(String s){Map m=new HashMap();m.put("Ch","pain");m.put("Ps","pods");m.put("Pe","coats");m.put("Lo","strife");m.put("La","bugs");m.put("Si","Player");m.put("Tu","weed");m.put("Fa","hawks");m.put("Pl","solids");m.put("Ch1","sham ");m.put("Ps1","pseudo-");m.put("Pe1","petty ");m.put("Lo1","loose ");m.put("La1","lady ");m.put("Si1","single ");m.put("Tu1","Tumblr ");m.put("Fa1","faux ");m.put("Pl1","platonic ");String r=s.substring(0,2);int c=r.charAt(1);return"and "+(c=='i'?"Real":"real ")+m.get(r)+" for my "+m.get(r+1)+"friends"+(c=='i'|c=='e'?'.':'!');}

  public static void main(String[] a){
    System.out.println(c("Champagne for my real friends"));
    System.out.println(c("Pseudopods for my real friends"));
    System.out.println(c("Petticoats for my real friends"));
    System.out.println(c("Loosestrife for my real friends"));
    System.out.println(c("Ladybugs for my real friends"));
    System.out.println(c("Single-player for my real friends"));
    System.out.println(c("Tumbleweeds for my real friends"));
    System.out.println(c("Fauxhawks for my real friends"));
    System.out.println(c("Platonic solids for my real friends"));
  }
}
Kevin Cruijssen
la source
1
Je pense que vous pouvez économiser des octets en utilisant l’initialisation à double attache et putau lieu de m.put.
Zircon
2

C (gcc) , 311 octets

Des modèles clairs, mais de nombreuses exceptions. Pourtant, il doit y avoir un meilleur moyen que cela!

f(char*s){char*t="\"5$#(=931",*r[]={"pain", "sham","pods","pseudo","coats","petty","strife","loose","bugs","lady","Player","single","weed","Tumblr","hawks","faux","solids","platonic"};int i=strchr(t,*s^s[2])-t;printf("and %s%s for my %s%cfriends%c",i^5?"real ":"Real",r[i*2],r[i*2+1],i^1?32:45,i^5&&i^2?33:46);}

Essayez-le en ligne!

gastropner
la source