Gerçek arkadaşlarım için golf kodu


35

... ve kod arkadaşlarım için gerçek golf.

Bu, belirgin bir desen izleyen, çoğunlukla hafif bir değişkenlik gösteren tostlardan (çizgi romandaki ilk parodilerden oluşan) bir yıllık XKCD çizgi romanına dayanan bir mücadeledir .

Göreviniz, herhangi bir tostun ilk yarısını çizgi romandan (her şey dahil ve dahil olmak üzere friends) herhangi bir tostun girdi (stdin veya işlev argümanı üzerinden) çıkarıp tam metni çıkaran (veya döndüren) bir program (veya işlev) yazmaktır . ikinci yarı. Geçersiz girişi işlemeniz gerekmez, standart boşluklar uygulanır, bayt cinsinden en kısa kod kazanır.

Örnekler

Tostları başka bir yerden kopyalamak istemeyenler için, giriş ve çıkış olarak ayrılmış hepsi burada.

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!

Bence Single-payer(yerine Single-player) bir yazım hatası var .
Kevin Cruijssen

4
Kevin: Hayır Single-payer. Gerçekten öyle .
ivzem

@KevinCruijssen - Bir yazım hatası olabilir, ama öyleyse Randall @ XKCD'nin, ivzem değil. Explain xkcd hakkında bir tartışma var . Ayrıca, ivzem - HNQ listesinde ünvanı görür görmez, bu çizgi romandan bahsettiğinden emindim. Aferin!
Bobson,

Yanıtlar:


18

Retina , 119 bayt

Önceki sürüm "platonik katılarda" alanı doğru şekilde yönetemedi, bu çalışıyor ve daha kısa :)

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

Çevrimiçi deneyin!

Bu girdiyi bir dizi ikame yoluyla çıktıya dönüştürür.

En ilginç kısım, bu oyuncu değişikliği (bir regex golfünün türü):

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

Neredeyse tüm işi yapan, ilk sözcüğü bölerek, parçalarını doğru yerlere yerleştirerek, fazladan boşlukları kaldırarak ve çıktının yapısını oluşturarak. "Tumbleweeds" test senaryosunda doğru çalışmak için bu önceki "eds" -> "ed" değiştirmesine bağlıdır.

Gerisi çoğunlukla özel durumlarla ilgilenen ikamelerden oluşur. Diğer ilginç kısımlar:

T`TL`Tl

Bu, "T" (Tumblr için) dışındaki her şeyi küçük harfe dönüştürür.

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

Bu bir "." Yerleştirir. Her cümlenin sonunda "p" ten sonra bazı harfleri içeren "y" kelimesini içeren bir cümle ("küçük" ve "mükellefi"). Sonra bir "!" "c" ile biten tüm cümlelerin sonunda (diğerleri).


Bu sonradan fazladan bir boşluk basar platonic. Önerilen düzeltme: TIO (+5 bayt)
matematik bağımlısı

1
@ math_junkie Teşekkür ederim, boşluk ile sorunu düzelten ve daha da kısa olan yeni bir sürüm yükledim :)
Leo

10

Python 2, 291 269 293 255 247 bayt

Erik the Outgolfer22 bayt kaydettiğiniz için teşekkür ederiz !

+24 bayt .yerine biten bazı çıktıları hesaba katar!

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]

İşleri başlatmak için basit bir çözüm. Çekler karşılık gelen çıkış yukarı sekizinci olarak Yorum önerilen giriş mektup, ve görünüm sözlükten bir dizi.

Çevrimiçi Deneyin!


Single-payer for my real friends
Unutmuş

@MathieuRodic Hayır, bu oldukça kasıtlı. RealPlayerözel bir durum
matematik bağımlısı

Hata! Üzgünüz, çok hızlı okuyun.
Mathieu Rodic

6

SOGL , 143 bayt

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

Bu, bu dizeyi ana bölüm olarak kullanır. "|" bölücüler ve "_" boşluk yer tutuculardır, böylelikle bölme düzgün çalışacaktır.

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

Girdi örneği: "Gerçek arkadaşlar için Platonik katılar" Açıklama:

..‘,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 bayt

En son versiyon

Bu şimdi beşinci girişimim. Orijinal programımın yarısı kadarını başardım. Şimdi eksik "-" i içeriyor ve tam bir çözüm olduğuna inanıyorum. Yine de hantal tarafında şüpheliyim; ama hedefe çok daha yakın. Çok fazla yardım aldım . Tüm yardımcı rehberlik için teşekkürler.

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)

Çevrimiçi deneyin!


Orijinal Gönderme

Bu benim ilk golf kodum, bu yüzden benim beceriksiz programım için şimdiden özür dilerim. "Şampanya" yı "acı" ya da "sham" a çevirmek için kelimeleri ayrıştırmanın nasıl yapılacağını göremiyorum. Ancak bunu başka birinin çözdüğünü görmek isterim. Bu nedenle, yetenek düzeyimin programımın önceden "Şampanya" nın "acı", "sahte" olduğunu bilmesi gerektiğini belirttiğinden, aslında bir giriş isteğini kodlamanın çok az noktası olduğu görülüyordu. Sonuç olarak dışarıda bıraktım ve baskı çıktımla ilgili biraz hazır oldum. Umarım bu iyidir:)

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
Yardım Merkezinden : Tüm zorluklara yönelik çözümler : [...] Kullanımdaki kazanan kriterler için ciddi bir rakip olmalısınız. Örneğin, bir kod golf yarışmasına bir giriş golfe atılmalı ve bir hız yarışmasına giriş hızlı olmaya çalışmalıdır.
Outgolfer Erik

1
Merhaba ve siteye hoşgeldiniz. Bu, kodunuzun uzunluğunu en aza indirmek için çaba göstermenizi gerektiren bir kod golfü sorusudur. Gereksiz boşlukları kaldırmalı ve değişkenleri 1 karakter uzunluğunda olacak şekilde yeniden adlandırmalısınız.
Buğday Sihirbazı

Tüm cümle listesini bir satıra koyabilir, girintiyi bir alana indirgeyebilir, baskıları bir satırda if ile birlikte bırakabilirsiniz ve baskılardaki boşluklar gerekli değildir. Neyse, sadece tüm çıktıları basmanıza izin verilip verilmediğini bilmiyorum;)
Mega Man

1
Merhaba! Bu ilk kod golf cevabınız gibi görünüyor. Ne yazık ki, her bir girdinin ilgili çıktıya nasıl eşlenmesi gerektiğini gösteren, özellikle alttaki dipteki “Örnekler” tablosunu yanlış anladığınız görülüyor. Şu anda, programınız sadece bu tabloyu basar. Ayrıca, daha iyi okunabilirlik için kodunuzu bir kod bloğuna yerleştirmek de (pratik seçin ve {} 'ye tıklamanız) ve bu sitedeki seçim dili ve bayt sayısını belirtmeniz standart bir uygulamadır. Q&A sitesinden daha fazla rekabet gibi. Buğday Sihirbazı çoktan bunu yaptı, yani bu daha iyi
ivzem

Merhaba ve PPCG'ye hoş geldiniz. Boşluk kaldırarak ve tek harfli değişkenleri kullanarak çok fazla bayt kaybedebilirsiniz. Buraya ilk başladığımda alışmak biraz zaman aldı. Sanırım sen de benim gibisin. Okunabilir kod yazmak için çok zaman harcıyorsunuz. Dediğim gibi, PPCG'ye ve yeni bir dünyaya hoş geldiniz;)
ElPedro

6

Röda , 299 292 288 259 bayt

4 bayt kullanarak @fergusq sayesinde kaydedilen ,yerine ..de pushifadeleri

@Fergusq sayesinde bana gösterilen yolu kaydetti 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]]}

Çevrimiçi deneyin!

Python'a çok yakın ... çok yakın .... Senin hareketin Python.

açıklama

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

Son ifadedeki dize enterpolasyonunu kullanarak bir bayt kaydedebilir misiniz? Düzenleme: aslında en kısa yol muhtemelen dizeleri yerine bir çok dizgiyi itmektir. yerine ..sahip ,.
fergusq

@fergusq Tahmininiz için teşekkürler!
Kritixi Lithos 12:17

Ayrıca sadece kullanabilirsiniz r=indexOf(a[7:8],"noarspekc").
fergusq

@ fergusq Ah, böyle bir yerleşik olduğunu bilmiyordum. Teşekkürler!
Kritixi Lithos

5

JavaScript (ES6), 230 228 221 216 bayt

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

Ölçek


3

PHP, 202 220 204 203 bayt

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 bayt

Yeni satırları ve girintileri kaldırmak, Perl5 kodunun 173 baytı olur. Utanmadan ilk regexp'i Leo'nun Retina cevabından çaldı. (Mine birkaç karakter daha uzun sürdü)

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

Perl5>> 5.14 sürümü için eval ve new / r regexp ikame değiştiricisi ile başka bir 5 byte tıraş edilebilir. 168 byte ile bitiyor:

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}

Çevrimiçi deneyin!


2

C, 367 bayt

Göründüğü kadar kısa sürmedi.

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 bayt

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'?'.':'!');}

@Zircon sayesinde -32 bayt .

Haritadan farklı bir şey kullanarak kesinlikle golf oynayabilirsin.

Açıklama:

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

Test kodu:

Burada dene. (ideone.com son zamanlarda tıkandı, bu yüzden şimdi TIO kullanıyorum ..)

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
İkili küme başlatma kullanarak ve putyerine bayt kaydedebilirsiniz düşünüyorum m.put.
Zirkon

2

C (gcc) , 311 bayt

Desenleri temizleyin, ancak birçok istisna var. Yine de, bundan daha iyi bir yol olmalı!

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.