Golf kode untuk teman-teman saya yang sebenarnya

35

... dan golf asli untuk teman kode saya.

Ini adalah tantangan berdasarkan komik XKCD berusia satu tahun yang sebagian besar terdiri dari roti panggang (parodi dari komik pertama) mengikuti pola yang berbeda, tetapi dengan sedikit variasi.

Tugas Anda adalah menulis sebuah program (atau fungsi) yang mengambil bagian pertama dari setiap roti bakar dari komik (semuanya hingga dan termasuk friends) sebagai input (melalui stdin atau argumen fungsi) dan menghasilkan (atau mengembalikan) teks tepat dari babak kedua. Anda tidak harus menangani input yang tidak valid, celah standar berlaku, kode terpendek dalam byte menang.

Contohnya

Untuk membantu mereka yang tidak ingin menyalin roti panggang dari tempat lain, inilah semuanya, dipisahkan menjadi input dan 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!
ivzem
sumber
Saya pikir Anda memiliki salah ketik di Single-payer(bukan Single-player).
Kevin Cruijssen
4
Kevin: Tidak. Memang benar Single-payer.
ivzem
@KevinCruijssen - Mungkin salah ketik, tetapi jika demikian itu adalah Randall @ XKCD's, bukan ivzem. Ada diskusi tentang itu di Jelaskan xkcd . Juga, ivzem - segera setelah saya melihat judul di daftar HNQ, saya yakin Anda merujuk komik itu. Sudah selesai dilakukan dengan baik!
Bobson

Jawaban:

18

Retina , 119 byte

Versi sebelumnya tidak mengelola dengan benar ruang dalam "padatan platonis", ini berfungsi dan lebih pendek :)

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

Cobalah online!

Ini mengubah input menjadi output melalui serangkaian pergantian.

Bagian yang paling menarik adalah substitusi ini (semacam golf regex):

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

Yang melakukan hampir semua pekerjaan, dengan memisahkan kata pertama, menempatkan potongan-potongannya di tempat yang tepat, menghilangkan ruang ekstra, dan membangun struktur output. Untuk bekerja dengan benar pada test case "Tumbleweeds" ini tergantung pada subtitusi sebelumnya "eds" -> "ed".

Sisanya sebagian besar terdiri dari pergantian yang menangani kasus-kasus khusus. Bagian menarik lainnya adalah:

T`TL`Tl

Ini mengubah segalanya kecuali "T" (untuk Tumblr) menjadi huruf kecil.

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

Ini menempatkan "." pada akhir setiap kalimat yang mengandung kata dengan "y" beberapa huruf setelah "p" ("picik" dan "pembayar" dalam praktiknya). Lalu beri tanda "!" di akhir semua kalimat yang diakhiri dengan "s" (semua yang lain).

Leo
sumber
Ini mencetak ruang ekstra setelahnya platonic. Perbaikan yang disarankan: TIO (+5 byte)
math junkie
1
@math_junkie Terima kasih, saya telah mengunggah versi baru yang memperbaiki masalah dengan spasi dan bahkan lebih pendek :)
Leo
10

Python 2, 291 269 293 255 247 byte

Terima kasih Erik the Outgolfertelah menghemat 22 byte!

+24 byte untuk memperhitungkan beberapa output yang berakhir dengan .bukannya!

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]

Solusi sederhana untuk memulai. Periksa huruf kedelapan input, seperti yang disarankan dalam komentar, dan mencari output yang sesuai dalam kamus array.

Cobalah secara Online!

pecandu matematika
sumber
Anda mungkin lupa Single-payer for my real friends...
Mathieu Rodic
@MathieuRodic Tidak, itu cukup disengaja. RealPlayeradalah kasus khusus
pecandu matematika
Ups, maaf, baca terlalu cepat.
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

Ini menggunakan string ini sebagai bagian utama. "|" adalah pemisah dan "_" adalah penampung ruang jadi split akan bekerja dengan benar.

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

Contoh input: "Padatan Platonis untuk teman-teman saya yang sebenarnya" Penjelasan:

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

Python 3 , 788 , 403 , 359 396 byte

Versi terbaru

Ini sekarang usaha saya yang kelima. Saya sudah berhasil setengah dari program asli saya. Sekarang termasuk "-" yang hilang dan saya percaya adalah solusi lengkap. Masih saya curiga di sisi besar; tetapi lebih dekat ke gawang. Saya sudah banyak membantu . Terima kasih untuk semua panduannya.

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)

Cobalah online!


Posting Asli

Ini adalah posting pertama saya di golf kode jadi permintaan maaf sebelumnya untuk program saya yang canggung. Tidak dapat melihat bagaimana suatu program dapat dibuat untuk mengubah "Champagne" menjadi "pain", "sham" dengan menguraikan kata-kata. Namun saya ingin melihat orang lain menyelesaikannya. Jadi, ketika tingkat kemampuan saya menentukan bahwa program saya perlu tahu sebelumnya bahwa "Champagne" adalah "pain", "sham", tampaknya ada sedikit gunanya dalam benar-benar mengkode permintaan input. Sebagai hasilnya saya meninggalkannya dan menjadi sedikit literal dengan hasil cetak saya. Semoga tidak apa-apa :)

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
sumber
3
Dari Pusat Bantuan : Semua solusi untuk tantangan harus: [...] Menjadi pesaing serius untuk kriteria kemenangan yang digunakan. Misalnya, entri ke kode golf kontes , dan entri ke kontes kecepatan harus melakukan upaya untuk menjadi cepat.
Erik the Outgolfer
1
Halo dan selamat datang di situs ini. Ini adalah pertanyaan kode-golf yang mengharuskan Anda berupaya meminimalkan panjang kode Anda. Anda harus menghapus spasi yang tidak perlu dan mengganti nama variabel menjadi 1 karakter.
Wheat Wizard
Anda dapat menempatkan seluruh daftar frase dalam satu baris, mengurangi jarak ke satu spasi, menempatkan cetakan bersama dalam satu baris dengan jika dan yang lain, dan spasi putih dalam cetakan tidak diperlukan. Lagi pula, saya tidak tahu apakah Anda diizinkan mencetak semua hasil;)
Mega Man
1
Halo! Sepertinya ini adalah jawaban golf kode pertama Anda. Sayangnya, Anda tampaknya telah salah paham tentang pertanyaan, terutama tabel "Contoh" di bagian bawah, yang hanya menunjukkan bagaimana setiap input harus dipetakan ke output masing-masing. Saat ini, program Anda hanya mencetak tabel itu._Juga, itu adalah praktik standar untuk menempatkan kode Anda dalam blok kode (pilih dan klik {}) untuk keterbacaan yang lebih baik dan untuk menyebutkan bahasa pilihan dan jumlah byte Anda, karena situs ini adalah lebih seperti sebuah kompetisi daripada sebuah situs tanya jawab. _ Wheat Wizard sudah melakukan itu, jadi itu lebih baik
ivzem
Hai dan selamat datang di PPCG. Anda bisa kehilangan banyak byte dengan menghapus spasi dan menggunakan variabel huruf tunggal. Saya ingat ketika saya pertama kali mulai di sini butuh waktu untuk terbiasa. Saya kira Anda seperti saya. Anda menghabiskan banyak waktu menulis kode yang dapat dibaca. Seperti yang saya katakan, selamat datang di PPCG dan dunia baru;)
ElPedro
6

Röda , 299 292 288 259 byte

4 byte disimpan berkat @fergusq untuk menggunakan ,alih-alih ..dalam pushpernyataan

Bytes disimpan berkat @fergusq yang menunjukkan jalan 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]]}

Cobalah online!

Sangat dekat dengan Python ... sangat dekat .... Langkahmu, Python.

Penjelasan

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
sumber
Bisakah Anda menyimpan satu byte dengan menggunakan interpolasi string dalam pernyataan terakhir? Sunting: sebenarnya cara terpendek mungkin adalah mendorong banyak string ke aliran, bukan satu, yaitu. ganti ..dengan ,.
fergusq
@fergusq Terima kasih atas tipnya!
Kritixi Lithos
Anda juga bisa menggunakannya r=indexOf(a[7:8],"noarspekc").
fergusq
@fergusq Ah, saya tidak tahu ada builtin seperti itu. Terima kasih!
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)]

Uji

Arnauld
sumber
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];
pengguna63956
sumber
3

Perl, 173 168 bytes

Menghapus baris baru dan lekukan, ini menjadi 173 byte kode Perl5. Tanpa malu-malu mencuri regexp pertama dari jawaban Retina Leo. (Punyaku beberapa karakter lagi)

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

Untuk versi perl5> = 5.14 5 byte lainnya dapat dicukur dengan eval dan modifier substitusi reg / baru. Berakhir dengan 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}

Cobalah online!

Kjetil S.
sumber
2

C, 367 byte

Tidak berakhir sesingkat kelihatannya.

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
sumber
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 berkat @Zircon .

Pasti bisa bermain golf dengan menggunakan sesuatu yang berbeda dari Peta ..

Penjelasan:

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

Kode uji:

Coba di sini. (ideone.com disadap akhir-akhir ini, jadi saya menggunakan TIO sekarang ..)

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
sumber
1
Saya pikir Anda dapat menyimpan byte dengan menggunakan inisialisasi double-brace dan putbukannya m.put.
Zircon
2

C (gcc) , 311 byte

Pola yang jelas, tetapi begitu banyak pengecualian. Tetap saja, pasti ada cara yang lebih baik dari ini!

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

Cobalah online!

gastropner
sumber