Codice golf per i miei veri amici


35

... e vero golf per i miei amici del codice.

Questa è una sfida basata su un fumetto XKCD di un anno che consiste principalmente di toast (parodie del primo nel fumetto) seguendo uno schema distinto, ma con qualche leggera variazione.

Il tuo compito è quello di scrivere un programma (o una funzione) che prenda la prima metà di ogni brindisi dal fumetto (tutto fino a compreso il friends) come input (tramite stdin o un argomento di funzione) e restituisca (o restituisca) il testo preciso di la seconda metà. Non è necessario gestire input non validi, si applicano scappatoie standard, vince il codice più corto in byte.

Esempi

Per aiutare coloro che non vogliono copiare i toast da nessun'altra parte, eccoli qui, separati in input e output.

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!

Penso che tu abbia un refuso a Single-payer(invece di Single-player).
Kevin Cruijssen,

4
Kevin: No. Lo è davvero Single-payer.
Ivzem,

@KevinCruijssen - Potrebbe essere un errore di battitura, ma in tal caso è Randall @ XKCD's, non ivzem. C'è una discussione su Explain xkcd . Inoltre, ivzem - non appena ho visto il titolo nell'elenco HNQ, ero sicuro che stavi facendo riferimento a quel fumetto. Molto bene!
Bobson,

Risposte:


18

Retina , 119 byte

La versione precedente non gestiva correttamente lo spazio nei "solidi platonici", questa funziona ed è più corta :)

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

Provalo online!

Questo trasforma l'input nell'output attraverso una serie di sostituzioni.

La parte più interessante è questa sostituzione (tipo di golf regex):

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

Il che fa quasi tutto il lavoro, suddividendo la prima parola, posizionando i suoi pezzi nei posti giusti, rimuovendo gli spazi extra e costruendo la struttura dell'output. Per funzionare correttamente sul test case "Tumbleweeds" questo dipende dalla precedente sostituzione "eds" -> "ed".

Il resto è composto principalmente da sostituzioni che trattano casi speciali. Altre parti interessanti sono:

T`TL`Tl

Questo trasforma tutto tranne "T" (per Tumblr) in minuscolo.

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

Questo pone un "." alla fine di ogni frase contenente una parola con una "y" alcune lettere dopo una "p" ("meschino" e "pagatore" in pratica). Quindi posiziona un "!" alla fine di tutte le frasi che terminano con una "s" (tutte le altre).


Questo stampa uno spazio extra dopo platonic. Correzione suggerita: TIO (+5 byte)
drogato di matematica

1
@math_junkie Grazie, ho caricato una nuova versione che risolve il problema con gli spazi ed è ancora più breve :)
Leo

10

Python 2, 291 269 293 255 247 byte

Grazie Erik the Outgolferper aver salvato 22 byte!

+24 byte per tenere conto di alcuni output che terminano .invece di!

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]

Soluzione semplice per iniziare le cose. Controlla l'ottava lettera dell'input, come suggerito nei commenti, e cerca l'output corrispondente in un dizionario in un array.

Provalo online!


Potresti aver dimenticato Single-payer for my real friends...
Mathieu Rodic,

@MathieuRodic No, è abbastanza intenzionale. RealPlayerè un caso speciale
drogato di matematica il

Spiacenti, leggi troppo in fretta.
Mathieu Rodic,

6

SOGL , 143 byte

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

Questo utilizza questa stringa come parte principale. "|" sono gli splitter e "_" sono segnaposto di spazio, quindi split funzionerebbe correttamente.

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

Esempio di input: "Solidi platonici per i miei veri amici" Spiegazione:

..‘,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_"]]

6

Python 3 , 788 , 403 , 359 396 byte

Ultima versione

Questo è ora il mio quinto tentativo. Sono riuscito a dimezzare le dimensioni del mio programma originale. Ora include il "-" mancante e credo che sia una soluzione completa. Sospetto ancora dal lato voluminoso; ma molto più vicino all'obiettivo. Ho avuto molto aiuto . Grazie per tutte le indicazioni utili.

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)

Provalo online!


Pubblicazione originale

Questo è il mio primo post sul golf del codice, quindi mi scuso in anticipo per il mio programma goffo. Non riesco a vedere come si potrebbe creare un programma per convertire "Champagne" in "dolore", "finzione" analizzando le parole. Tuttavia, vorrei vedere qualcun altro risolverlo. Quindi, poiché il mio livello di abilità impone che il mio programma abbia bisogno di sapere in anticipo che "Champagne" è "dolore", "finzione", sembrava davvero inutile codificare effettivamente una richiesta di input. Di conseguenza l'ho lasciato fuori e sono stato un po 'letterale con il mio output di stampa. Spero sia 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!")

3
Dal Centro assistenza : tutte le soluzioni alle sfide dovrebbero: [...] essere un serio contendente per i criteri vincenti in uso. Ad esempio, è necessario giocare a golf per partecipare a una gara di golf a codice , e un tentativo per partecipare a una gara di velocità dovrebbe essere veloce.
Erik the Outgolfer,

1
Ciao e benvenuto nel sito. Questa è una domanda di code-golf che richiede di fare uno sforzo per ridurre al minimo la lunghezza del codice. È necessario rimuovere gli spazi bianchi non necessari e rinominare le variabili in modo che siano lunghe 1 carattere.
Mago del grano

Puoi mettere l'intera fraseLista in una riga, ridurre il rientro in uno spazio, unire le stampe in una riga con if e else, e lo spazio bianco nelle stampe non è necessario. Comunque, non so se ti è permesso stampare solo tutte le uscite;)
Mega Man

1
Ciao! Sembra che questa sia la tua prima risposta di golf in codice. Sfortunatamente, sembra che tu abbia frainteso la domanda, in particolare la tabella "Esempi" in fondo, che mostra come ogni input dovrebbe essere mappato su un rispettivo output. Attualmente, il tuo programma stampa semplicemente quella tabella._Inoltre, è pratica standard collocare il codice in un blocco di codice (selezionarlo e fare clic su {}) per una migliore leggibilità e menzionare la tua lingua di scelta e il conteggio dei byte, poiché questo sito è più simile a una competizione che a un sito di domande e risposte ._ Wheat Wizard lo ha già fatto, quindi è meglio
ivzem

Ciao e benvenuto in PPCG. È possibile perdere molti byte rimuovendo gli spazi e utilizzando variabili a lettera singola. Ricordo che quando ho iniziato qui ho impiegato un po 'di tempo per abituarmi. Immagino che tu sia come me. Trascorri molto tempo a scrivere codice leggibile. Come ho detto, benvenuto in PPCG e in un nuovo mondo;)
ElPedro,

6

Röda , 299 292 288 259 byte

4 byte salvati grazie a @fergusq per l'utilizzo ,anziché ..nelle pushistruzioni

Byte salvati grazie a @fergusq che mi mostra il modo di 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]]}

Provalo online!

Così vicino a Python ... così vicino .... La tua mossa, Python.

Spiegazione

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*/
}

Puoi salvare un byte usando l'interpolazione di stringhe nell'ultima istruzione? Modifica: in realtà il modo più breve è probabilmente di spingere molte stringhe nello stream invece di una, ad es. sostituire ..con ,.
Fergusq,

@fergusq Grazie per la punta!
Kritixi Lithos,

Inoltre puoi semplicemente usare r=indexOf(a[7:8],"noarspekc").
Fergusq,

@fergusq Ah, non sapevo che esistesse un simile sistema. Grazie!
Kritixi Lithos,

5

JavaScript (ES6), 230 228 221 216 byte

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


3

PHP, 202 220 204 203 byte

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

3

Perl, 173 168 byte

Rimuovendo newline e rientri, questo diventa 173 byte di codice Perl5. Senza vergogna rubato la prima regexp dalla risposta di Retina di Leo. (Il mio era più lungo di alcuni caratteri)

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

Per la versione perl5> = 5.14 è possibile eliminare altri 5 byte con eval e il nuovo modificatore di sostituzione regexp / r. Finendo con 168 byte:

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}

Provalo online!


2

C, 367 byte

Non è finito così corto come sembrava.

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

2

Java 7, 585 553 byte

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 byte grazie a @Zircon .

Può sicuramente essere giocato a golf usando qualcosa di diverso da una mappa ..

Spiegazione:

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

Codice di prova:

Provalo qui. (ideone.com è stato infastidito di recente, quindi sto usando TIO ora ..)

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

1
Penso che puoi salvare byte usando l'inizializzazione a doppia parentesi e putinvece di m.put.
Zircone,

2

C (gcc) , 311 byte

Schemi chiari, ma tante eccezioni. Tuttavia, ci deve essere un modo migliore di questo!

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.