Kod golfa dla moich prawdziwych przyjaciół

35

... i prawdziwy golf dla moich znajomych z kodu.

Jest to wyzwanie oparte na rocznym komiksie XKCD, który składa się głównie z tostów (parodie pierwszego w komiksie) według wyraźnego wzoru, ale z pewnymi niewielkimi zmianami.

Twoim zadaniem jest napisanie programu (lub funkcji), który pobiera pierwszą połowę dowolnego tostu z komiksu (wszystko do włącznie friends) jako dane wejściowe (przez stdin lub argument funkcji) i wyświetla (lub zwraca) dokładny tekst druga połowa. Nie musisz obsługiwać nieprawidłowych danych wejściowych, obowiązują standardowe luki, wygrywa najkrótszy kod w bajtach.

Przykłady

Aby pomóc tym, którzy nie chcą kopiować tostów z innych miejsc, oto wszystkie z nich, podzielone na dane wejściowe i wyjściowe.

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
źródło
Myślę, że masz literówkę w Single-payer(zamiast Single-player).
Kevin Cruijssen
4
Kevin: Nie. Naprawdę tak jest Single-payer.
ivzem
@KevinCruijssen - To może być literówka, ale jeśli tak, to Randall @ XKCD, a nie ivzem. Jest dyskusja na ten temat na Explain xkcd . Ponadto, ivzem - jak tylko zobaczyłem tytuł na liście HNQ, byłem pewien, że odwołujesz się do tego komiksu. Dobra robota!
Bobson,

Odpowiedzi:

18

Siatkówka , 119 bajtów

Poprzednia wersja nie zarządzała poprawnie przestrzenią w „bryłach platońskich”, ta działa i jest krótsza :)

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

Wypróbuj online!

Przekształca to dane wejściowe w dane wyjściowe poprzez serię podstawień.

Najbardziej interesującą częścią jest ta zamiana (rodzaj golfa regularnego):

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

Który wykonuje prawie wszystkie zadania, dzieląc pierwsze słowo, umieszczając jego elementy we właściwych miejscach, usuwając dodatkowe spacje i budując strukturę wyników. Aby działać poprawnie w przypadku testowym „Tumbleweeds”, zależy to od wcześniejszego podstawienia „eds” -> „ed”.

Reszta składa się głównie z zastępstw, które dotyczą specjalnych przypadków. Inne interesujące części to:

T`TL`Tl

To zmienia wszystko oprócz „T” (dla Tumblr) na małe litery.

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

To umieszcza „.” na końcu każdego zdania zawierającego słowo z „y”, kilka liter po „p” (w praktyce „drobny” i „płatnik”). Następnie umieszcza „!” na końcu wszystkich zdań kończących się na „s” (wszystkie pozostałe).

Lew
źródło
Spowoduje to wydrukowanie dodatkowego miejsca po platonic. Sugerowana poprawka: TIO (+5 bajtów)
ćpun matematyki
1
@math_junkie Dziękuję, przesłałem nową wersję, która rozwiązuje problem ze spacjami i jest jeszcze krótsza :)
Leo
10

Python 2, 291 269 293 255 247 bajtów

Dzięki Erik the Outgolferza zaoszczędzenie 22 bajtów!

+24 bajty do uwzględnienia niektórych wyjść kończących się na .zamiast!

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]

Proste rozwiązanie na początek. Sprawdza ósmą literę wejścia, jak zasugerowano w komentarzach, i wyszukuje odpowiednie dane wyjściowe w słowniku tablicy.

Wypróbuj online!

ćpun matematyki
źródło
Być może zapomniałeś Single-payer for my real friends...
Mathieu Rodic
@MathieuRodic Nie, to całkiem celowe. RealPlayerto szczególny przypadek
ćpun matematyki
Ups, przepraszam, czytam za szybko.
Mathieu Rodic
6

SOGL , 143 bajty

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

Używa tego ciągu jako głównej części. „|” są rozdzielaczami, a „_” to symbole zastępcze, więc podział działałby poprawnie.

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

Przykład wprowadzania: „Bryły platońskie dla moich prawdziwych przyjaciół” Objaśnienie:

..‘,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
źródło
6

Python 3 , 788 , 403 , 359 396 bajtów

Ostatnia wersja

To teraz moja piąta próba. Udało mi się zmniejszyć o połowę rozmiar mojego oryginalnego programu. Zawiera teraz brakujące „-” i uważam, że jest to kompletne rozwiązanie. Nadal podejrzewam, że jest nieporęczny; ale znacznie bliżej celu. Miałem dużo pomocy . Dziękuję za wszystkie pomocne wskazówki.

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)

Wypróbuj online!


Oryginalny post

To mój pierwszy post na temat golfa z kodem, więc z góry przepraszam za mój niezdarny program. Nie widzę, jak można stworzyć program do konwersji „szampana” na „ból”, „fikcję” przez parsowanie słów. Chciałbym jednak, aby ktoś inny to rozwiązał. Tak więc, ponieważ mój poziom umiejętności dyktuje, że mój program musi wiedzieć z góry, że „Szampan” to „ból”, „fikcja”, nie było sensu kodowanie żądania wprowadzania danych. W rezultacie zrezygnowałem z tego i byłem trochę dosłowny z moim wydrukiem. Mam nadzieję, że w porządku:)

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
źródło
3
Z Centrum pomocy : wszystkie rozwiązania problemów powinny: [...] Być poważnym pretendentem do zwycięskich kryteriów w użyciu. Na przykład wejście do zawodów w golfa kodowego wymaga gry w golfa, a wejście do zawodów szybkich powinno być próbą szybkiego.
Erik the Outgolfer
1
Witam na stronie. To jest pytanie do golfa, które wymaga zminimalizowania długości kodu. Powinieneś usunąć niepotrzebne białe znaki i zmienić nazwy zmiennych na 1 znak.
Wheat Wizard
Możesz umieścić całą frazę w jednym wierszu, zmniejszyć wcięcie do jednej spacji, połączyć wydruki razem w jednym wierszu z if i jeszcze, a białe znaki na wydrukach nie są konieczne. W każdym razie nie wiem, czy wolno ci po prostu wydrukować wszystkie wyjścia;)
Mega Man,
1
Dzień dobry! Wygląda na to, że to Twoja pierwsza odpowiedź na golfa. Niestety wydaje się, że źle zrozumiałeś pytanie, zwłaszcza tabelę „Przykłady” u dołu, która pokazuje, jak każde wejście powinno być odwzorowane na odpowiedni wynik. Obecnie program po prostu drukuje tę tabelę. Standardową praktyką jest także umieszczanie kodu w bloku kodu (zaznacz go i kliknij {}), aby uzyskać lepszą czytelność, i wspomnij o wybranym języku i liczbie bajtów, ponieważ ta witryna jest bardziej jak konkurencja niż strona pytań i odpowiedzi ._ Wheat Wizard już to zrobił, więc to lepiej
ivzem
Witam i witam w PPCG. Możesz stracić wiele bajtów, usuwając spacje i stosując zmienne jednoliterowe. Pamiętam, kiedy tu zaczynałem, przyzwyczaiłem się do tego. Chyba jesteś taki jak ja. Dużo czasu spędzasz na pisaniu czytelnego kodu. Jak już powiedziałem, witamy w PPCG i nowym świecie;)
ElPedro
6

Röda , 299 292 288 259 bajtów

4 bajty zapisane dzięki @fergusq do użycia ,zamiast ..w pushinstrukcjach

Bajty zapisane dzięki @fergusq pokazując mi drogę 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]]}

Wypróbuj online!

Tak blisko Pythona ... tak blisko ... Twój ruch, Python.

Wyjaśnienie

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
źródło
Czy można zapisać jeden bajt, używając interpolacji łańcuchów w ostatniej instrukcji? Edycja: w rzeczywistości najkrótszą drogą jest prawdopodobnie przepchnięcie wielu ciągów do strumienia zamiast jednego, tj. wymienić ..z ,.
fergusq
@fergusq Dzięki za wskazówkę!
Kritixi Lithos
Możesz także po prostu użyć r=indexOf(a[7:8],"noarspekc").
fergusq
@fergusq Ah, nie wiedziałem, że takie wbudowane istniało. Dzięki!
Kritixi Lithos
5

JavaScript (ES6), 230 228 221 216 bajtów

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

Test

Arnauld
źródło
3

PHP, 202 220 204 203 bajty

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];
użytkownik63956
źródło
3

Perl, 173 168 bajtów

Usuwając znaki nowej linii i wcięcia, staje się to 173 bajtów kodu Perl5. Bezwstydnie ukradł pierwsze wyrażenie regularne z odpowiedzi Leo na Retinę. (Mój był o kilka znaków dłużej)

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

Dla wersji perl5> = 5.14 można zgolić kolejne 5 bajtów za pomocą eval i nowego modyfikatora podstawienia / r regexp. Kończy się na 168 bajtów:

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}

Wypróbuj online!

Kjetil S.
źródło
2

C, 367 bajtów

Nie skończyło się tak krótko, jak się wydawało.

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
źródło
2

Java 7, 585 553 bajtów

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 bajtów dzięki @Zircon .

Można zdecydowanie zagrać w golfa, używając czegoś innego niż mapa ...

Wyjaśnienie:

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

Kod testowy:

Wypróbuj tutaj. (ideone.com jest ostatnio błędny, więc teraz używam 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
źródło
1
Myślę, że możesz zaoszczędzić bajty za pomocą inicjalizacji podwójnego nawiasu klamrowego i putzamiast m.put.
Zircon
2

C (gcc) , 311 bajtów

Jasne wzory, ale tyle wyjątków. Jednak musi istnieć lepszy sposób!

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

Wypróbuj online!

gastropner
źródło