Code Golf für meine echten Freunde

35

... und echtes Golf für meine Codefreunde.

Dies ist eine Herausforderung, die auf einem einjährigen XKCD-Comic basiert, der hauptsächlich aus Toasts (Parodien der ersten im Comic) besteht, die einem bestimmten Muster folgen, jedoch geringfügige Abweichungen aufweisen.

Ihre Aufgabe ist es, ein Programm (oder eine Funktion) zu schreiben, das die erste Hälfte eines Toasts aus dem Comic (bis einschließlich friends) als Eingabe (über stdin oder ein Funktionsargument) entnimmt und den genauen Text von ausgibt (oder zurückgibt) die zweite Hälfte. Sie müssen keine ungültigen Eingaben verarbeiten, es gelten Standardlücken, der kürzeste Code in Bytes gewinnt.

Beispiele

Um diejenigen zu unterstützen, die die Toasts nicht von irgendwo anders kopieren möchten, finden Sie hier alle, die in Eingabe und Ausgabe unterteilt sind.

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
quelle
Ich denke, Sie haben einen Tippfehler bei Single-payer(anstelle von Single-player).
Kevin Cruijssen
4
Kevin: Nein, das ist es wirklich Single-payer.
Ivzem
@ KevinCruijssen - Es könnte ein Tippfehler sein, aber wenn ja, ist es Randall @ XKCD's, nicht ivzem. Es gibt eine Diskussion darüber auf Explain xkcd . Außerdem ivzem - als ich den Titel in der HNQ-Liste sah, war ich mir sicher, dass Sie sich auf diesen Comic bezogen haben. Gut gemacht!
Bobson

Antworten:

18

Netzhaut , 119 Bytes

Die Vorgängerversion hat den Platz in "platonischen Festkörpern" nicht richtig geschafft, dieser funktioniert und ist kürzer :)

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

Probieren Sie es online!

Dadurch wird die Eingabe durch eine Reihe von Ersetzungen in die Ausgabe umgewandelt.

Der interessanteste Teil ist diese Substitution (eine Art Regex-Golf):

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

Das erledigt fast die ganze Arbeit, indem es das erste Wort aufteilt, seine Teile an den richtigen Stellen platziert, zusätzliche Leerzeichen entfernt und die Struktur der Ausgabe aufbaut. Um im Testfall "Tumbleweeds" korrekt zu funktionieren, hängt dies von der vorherigen Substitution "eds" -> "ed" ab.

Der Rest setzt sich hauptsächlich aus Substitutionen zusammen, die sich mit Sonderfällen befassen. Andere interessante Teile sind:

T`TL`Tl

Dadurch wird alles außer "T" (für Tumblr) in Kleinbuchstaben umgewandelt.

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

Dies setzt ein "." am Ende jedes Satzes, der ein Wort mit einem "y" enthält, einige Buchstaben nach einem "p" ("petty" und "payer" in der Praxis). Dann setzt ein "!" am Ende aller Sätze, die mit einem "s" enden (alle anderen).

Löwe
quelle
Dies druckt ein zusätzliches Leerzeichen nach platonic. Vorgeschlagener Fix: TIO (+5 Bytes)
Mathe-Junkie
1
@math_junkie Danke, ich habe eine neue Version hochgeladen, die das Problem mit Leerzeichen behebt und noch kürzer ist :)
Leo
10

Python 2, 291 269 293 255 247 Bytes

Vielen Dank Erik the Outgolferfür das Speichern von 22 Bytes!

+24 Bytes, um einige Ausgaben zu berücksichtigen, die auf .anstatt enden!

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]

Einfache Lösung für den Anfang. Überprüft den achten Buchstaben der Eingabe, wie in den Kommentaren vorgeschlagen, und sucht die entsprechende Ausgabe in einem Wörterbuch und einem Array.

Probieren Sie es online!

Mathe-Junkie
quelle
Sie haben vielleicht vergessen Single-payer for my real friends...
Mathieu Rodic
@MathieuRodic Nein, das ist durchaus gewollt. RealPlayerist ein Sonderfall
Math Junkie
Hoppla, entschuldige, lies zu schnell.
Mathieu Rodic
6

SOGL , 143 Bytes

_╔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

Dies verwendet diese Zeichenfolge als Hauptteil. "|" Sind die Teiler und "_" sind Leerzeichen Platzhalter, so würde das Teilen korrekt funktionieren.

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

Eingabebeispiel: "Platonische Körper für meine wahren Freunde" Erläuterung:

..‘,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
quelle
6

Python 3 , 788 , 403 , 359, 396 Bytes

Letzte Version

Dies ist jetzt mein fünfter Versuch. Ich habe es geschafft, die Hälfte meines ursprünglichen Programms zu erreichen. Es enthält jetzt das fehlende "-" und ist meiner Meinung nach eine vollständige Lösung. Ich vermute immer noch, dass es sperrig ist; aber viel näher am Ziel. Ich hatte viel Hilfe . Vielen Dank für die hilfreiche Anleitung.

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)

Probieren Sie es online!


Ursprüngliche Buchung

Dies ist mein erster Beitrag zum Thema Codegolf, daher entschuldige ich mich im Voraus für mein ungeschicktes Programm. Kann nicht sehen, wie ein Programm gemacht werden kann, um "Champagner" in "Schmerz", "Schein" umzuwandeln, indem die Wörter analysiert werden. Ich würde jedoch gerne sehen, dass jemand anderes das löst. Da mein Kenntnisstand vorschreibt, dass mein Programm im Voraus wissen muss, dass "Champagner" "Schmerz", "Schein" ist, schien es wenig sinnvoll, eine Eingabeanforderung tatsächlich zu codieren. Infolgedessen habe ich es ausgelassen und war mit meiner Druckausgabe ein bisschen wörtlich. Hoffe das ist ok :)

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
quelle
3
Aus dem Help Center : Alle Lösungen für Herausforderungen sollten: [...] ein ernstzunehmender Anwärter auf die verwendeten Gewinnkriterien sein. Zum Beispiel muss eine Teilnahme an einem Code-Golfwettbewerb erfolgreich sein, und eine Teilnahme an einem Geschwindigkeitswettbewerb sollte den Versuch machen, schnell zu sein.
Erik der Outgolfer
1
Hallo und willkommen auf der Seite. Dies ist eine Code-Golf- Frage, bei der Sie sich bemühen müssen, die Länge Ihres Codes zu minimieren. Sie sollten unnötige Leerzeichen entfernen und die Variablen so umbenennen, dass sie 1 Zeichen lang sind.
Wheat Wizard
Sie können die gesamte Ausdrucksliste in eine Zeile setzen, den Einzug auf ein Leerzeichen reduzieren, die Ausdrucke mit if und else in einer Zeile zusammenfassen, und das Leerzeichen in den Ausdrucken ist nicht erforderlich. Wie auch immer, ich weiß nicht, ob Sie nur alle Ausgaben drucken dürfen;)
Mega Man
1
Hallo! Anscheinend ist dies Ihre erste Code-Golf-Antwort. Leider scheinen Sie die Frage falsch verstanden zu haben, insbesondere die Tabelle "Beispiele" unten, in der nur gezeigt wird, wie jede Eingabe einer entsprechenden Ausgabe zugeordnet werden soll. Derzeit gibt Ihr Programm nur diese Tabelle aus. Es ist auch üblich, Ihren Code in einem Codeblock abzulegen (wählen Sie ihn aus und klicken Sie auf {}), um die Lesbarkeit zu verbessern und die Sprache Ihrer Wahl und die Anzahl der Bytes anzugeben, wie dies bei dieser Site der Fall ist Mehr wie ein Wettbewerb als eine Frage-und-Antwort-Seite. Der Weizen-Zauberer hat das bereits getan, also ist das besser
ivzem
Hallo und willkommen bei PPCG. Sie könnten viele Bytes verlieren, indem Sie Leerzeichen entfernen und Variablen mit einem Buchstaben verwenden. Ich erinnere mich, als ich hier anfing, dauerte es einige Zeit, bis ich mich daran gewöhnt hatte. Ich denke du bist wie ich. Sie verbringen viel Zeit damit, lesbaren Code zu schreiben. Wie gesagt, willkommen bei PPCG und einer neuen Welt;)
ElPedro
6

Röda , 299 292 288 259 Bytes

Dank @fergusq wurden 4 Bytes für die Verwendung ,anstelle ..der pushAnweisungen gespeichert

Dank @fergusq gespeicherte Bytes zeigen mir den Weg von 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]]}

Probieren Sie es online!

So nah an Python ... so nah an ... Dein Zug, Python.

Erläuterung

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
quelle
Können Sie ein Byte speichern, indem Sie in der letzten Anweisung die Zeichenfolgeninterpolation verwenden? Edit: eigentlich ist der kürzeste Weg wahrscheinlich, viele Zeichenfolgen anstelle einer zum Stream zu verschieben, d. H. ersetzen ..mit ,.
Fergusq
@fergusq Danke für den Tipp!
Kritixi Lithos
Auch können Sie nur verwenden r=indexOf(a[7:8],"noarspekc").
Fergusq
@fergusq Ah, ich wusste nicht, dass so ein eingebautes existiert. Vielen Dank!
Kritixi Lithos
5

JavaScript (ES6), 230 228 221 216 Bytes

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

Prüfung

Arnauld
quelle
3

PHP, 202 220 204 203 Bytes

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];
user63956
quelle
3

Perl, 173 168 Bytes

Das Entfernen von Zeilenumbrüchen und Einrückungen ergibt 173 Byte Perl5-Code. Schamlos gestohlen erste Regexp von Leo Retina Antwort. (Meins war ein paar Zeichen länger)

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/?"$_.":"$_!"
}

Für die Version perl5> = 5.14 können mit eval und dem neuen Substitutionsmodifikator / r regexp weitere 5 Bytes abgeschnitten werden. Endet mit 168 Bytes:

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}

Probieren Sie es online!

Kjetil S.
quelle
2

C 367 Bytes

Nicht so kurz, wie es schien.

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
quelle
2

Java 7, 585 553 Bytes

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 Bytes dank @Zircon .

Kann definitiv mit etwas anderem als einer Karte gespielt werden.

Erläuterung:

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

Testcode:

Probieren Sie es hier aus. (ideone.com ist in letzter Zeit fehlerhaft, daher benutze ich jetzt TIO ..)

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
quelle
1
Ich denke, Sie können Bytes sparen, indem Sie doppelte Klammer Initialisierung und putanstelle von verwenden m.put.
Zirkon
2

C (gcc) , 311 Bytes

Klare Muster, aber so viele Ausnahmen. Trotzdem muss es einen besseren Weg geben!

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

Probieren Sie es online!

Gastropner
quelle