Mã golf cho những người bạn thực sự của tôi


35

... và golf thực sự cho bạn bè mã của tôi.

Đây là một thử thách dựa trên truyện tranh XKCD một năm tuổi , bao gồm chủ yếu là bánh mì nướng (nhại đầu tiên trong truyện tranh) theo một mô hình riêng biệt, nhưng có một chút thay đổi nhỏ.

Nhiệm vụ của bạn là viết một chương trình (hoặc chức năng) lấy nửa đầu của bất kỳ bánh mì nướng nào từ truyện tranh (mọi thứ lên đến và bao gồm friends) làm đầu vào (thông qua stdin hoặc đối số chức năng) và xuất ra (hoặc trả về) văn bản chính xác của cái nửa thứ nhì. Bạn không phải xử lý đầu vào không hợp lệ, áp dụng sơ hở tiêu chuẩn, mã ngắn nhất tính theo byte thắng.

Ví dụ

Để giúp những người không muốn sao chép bánh mì nướng từ bất kỳ nơi nào khác, đây là tất cả chúng, được phân tách thành đầu vào và đầu ra.

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!

Tôi nghĩ rằng bạn có một lỗi đánh máy tại Single-payer(thay vì Single-player).
Kevin Cruijssen

4
Kevin: Không. Nó thực sự là vậy Single-payer.
ivzem

@KevinCruijssen - Nó có thể là một lỗi đánh máy, nhưng nếu vậy thì đó là Randall @ XKCD, không phải ivzem. Có một cuộc thảo luận về nó trên Giải thích xkcd . Ngoài ra, ivzem - ngay khi tôi nhìn thấy tiêu đề trong danh sách HNQ, tôi chắc chắn rằng bạn đang tham khảo truyện tranh đó. Làm tốt!
Bobson

Câu trả lời:


18

Võng mạc , 119 byte

Phiên bản trước không quản lý chính xác không gian trong "khối rắn", phiên bản này hoạt động và ngắn hơn :)

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

Hãy thử trực tuyến!

Điều này biến đổi đầu vào thành đầu ra thông qua một loạt các thay thế.

Phần thú vị nhất là sự thay thế này (loại golf regex):

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

Mà hầu như tất cả các công việc, bằng cách tách từ đầu tiên, đặt các phần của nó vào đúng chỗ, loại bỏ khoảng trắng thừa và xây dựng cấu trúc của đầu ra. Để hoạt động chính xác trong trường hợp kiểm tra "Tumbleweed", điều này phụ thuộc vào sự thay thế trước đó "eds" -> "ed".

Phần còn lại chủ yếu được sáng tác bởi sự thay thế liên quan đến các trường hợp đặc biệt. Các phần thú vị khác là:

T`TL`Tl

Điều này biến mọi thứ trừ "T" (đối với Tumblr) thành chữ thường.

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

Điều này đặt một "." ở cuối mỗi câu có chứa một từ có "y" một số chữ cái sau một "p" ("petty" và "payer" trong thực tế). Sau đó đặt một dấu "!" ở cuối tất cả các câu kết thúc bằng một "s" (tất cả các câu khác).


Điều này in thêm một không gian sau platonic. Đề xuất sửa chữa: TIO (+5 byte)
nghiện toán học

1
@math_junkie Cảm ơn bạn, tôi đã tải lên một phiên bản mới khắc phục sự cố với khoảng trắng và thậm chí còn ngắn hơn :)
Leo

10

Python 2, 291 269 293 255 247 byte

Cảm ơn Erik the Outgolfervì đã tiết kiệm 22 byte!

+24 byte để giải thích cho một số đầu ra kết thúc .thay vì!

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]

Giải pháp đơn giản để bắt đầu mọi thứ. Kiểm tra chữ cái thứ tám của đầu vào, như được đề xuất trong các bình luận, và tìm kiếm đầu ra tương ứng trong một từ điển một mảng.

Hãy thử trực tuyến!


Bạn có thể đã quên Single-payer for my real friends...
Mathieu Rodic

@MathieuRodic Không, đó là khá cố ý. RealPlayerlà một trường hợp đặc biệt
nghiện toán học

Rất tiếc, xin lỗi, đọc quá nhanh.
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

Điều này sử dụng chuỗi này là phần chính. "|" là các bộ chia và "_" là các trình giữ chỗ không gian để phân chia sẽ hoạt động chính xác.

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

Ví dụ đầu vào: "Chất rắn Platonic cho những người bạn thực sự của tôi" Giải thích:

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

Trăn 3 , 788 , 403 , 359 396 byte

Phiên bản mới nhất

Đây là nỗ lực thứ năm của tôi. Tôi đã quản lý đến một nửa kích thước của chương trình ban đầu của tôi. Bây giờ nó bao gồm thiếu "-" và tôi tin là một giải pháp hoàn chỉnh. Vẫn là tôi nghi ngờ về phía cồng kềnh; nhưng gần hơn với mục tiêu Tôi đã có rất nhiều sự giúp đỡ . Cảm ơn tất cả các hướng dẫn hữu ích.

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)

Hãy thử trực tuyến!


Đăng bài gốc

Đây là bài viết đầu tiên của tôi về mã golf nên xin lỗi trước cho chương trình vụng về của tôi. Không thể thấy làm thế nào một chương trình có thể được thực hiện để chuyển đổi "Champagne" thành "đau đớn", "giả mạo" bằng cách phân tích các từ. Tuy nhiên tôi muốn thấy người khác giải quyết điều đó. Vì vậy, khi mức độ khả năng của tôi chỉ ra rằng chương trình của tôi cần biết trước rằng "Champagne" là "nỗi đau", "sự giả tạo", có vẻ như rất ít điểm trong việc thực sự mã hóa một yêu cầu đầu vào. Kết quả là tôi đã bỏ nó đi và có một chút nghĩa đen với đầu ra in của tôi. Hy vọng là 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
Từ Trung tâm trợ giúp : Tất cả các giải pháp cho các thách thức nên: [...] Hãy là một ứng cử viên nghiêm túc cho các tiêu chí chiến thắng được sử dụng. Ví dụ: một mục vào một cuộc thi golf mã cần phải được đánh gôn, và một mục tham gia một cuộc thi tốc độ sẽ khiến một số nỗ lực phải nhanh chóng.
Erik the Outgolfer

1
Xin Chào và Chào Mừng đến với trang. Đây là một câu hỏi về golf-code đòi hỏi bạn phải nỗ lực để giảm thiểu độ dài của mã. Bạn nên xóa khoảng trắng không cần thiết và đổi tên các biến thành dài 1 ký tự.
Phù thủy lúa mì

Bạn có thể đặt toàn bộ cụm từ trong một dòng, giảm sự chú ý vào một khoảng trắng, đặt các bản in cùng một dòng với if và khác và khoảng trắng trong bản in là không cần thiết. Dù sao, tôi không biết liệu bạn có được phép in tất cả các kết quả đầu ra hay không;)
Mega Man

1
Xin chào! Có vẻ như đây là câu trả lời golf mã đầu tiên của bạn. Thật không may, dường như bạn đã hiểu nhầm câu hỏi, đặc biệt là bảng "Ví dụ" ở phía dưới, bảng này chỉ hiển thị cách mỗi đầu vào sẽ ánh xạ tới một đầu ra tương ứng. Hiện tại, chương trình của bạn chỉ in bảng đó. giống như một cuộc thi hơn là một trang web hỏi đáp._ Wheat Wizard đã làm điều đó, vì vậy điều đó tốt hơn
ivzem

Xin chào và chào mừng đến với PPCG. Bạn có thể mất rất nhiều byte bằng cách xóa khoảng trắng và sử dụng các biến đơn. Tôi nhớ khi tôi mới bắt đầu ở đây, phải mất một thời gian để làm quen. Tôi đoán bạn giống như tôi. Bạn dành rất nhiều thời gian để viết mã có thể đọc được. Như tôi đã nói, chào mừng bạn đến với PPCG và một thế giới mới;)
ElPedro

6

Röda , 299 292 288 259 byte

4 byte được lưu nhờ @fergusq vì đã sử dụng ,thay vì ..trong các pushcâu lệnh

Byte được lưu nhờ @fergusq chỉ cho tôi cách 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]]}

Hãy thử trực tuyến!

Rất gần với Python ... rất gần .... Di chuyển của bạn, Python.

Giải trình

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

Bạn có thể lưu một byte bằng cách sử dụng phép nội suy chuỗi trong câu lệnh cuối không? Chỉnh sửa: thực sự cách ngắn nhất có lẽ là đẩy nhiều chuỗi vào luồng thay vì một, tức là. thay thế ..bằng ,.
fergusq

@fergusq Cảm ơn vì tiền boa!
Kritixi Lithos

Ngoài ra bạn chỉ có thể sử dụng r=indexOf(a[7:8],"noarspekc").
fergusq

@fergusq À, tôi không biết có tồn tại như vậy. Cảm ơn!
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)]

Kiểm tra


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

Loại bỏ các dòng mới và thụt lề, điều này trở thành 173 byte mã Perl5. Không biết xấu hổ đã đánh cắp regrec đầu tiên từ câu trả lời Retina của Leo. (Của tôi là một vài ký tự dài hơn)

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

Đối với phiên bản perl5> = 5.14, 5 byte khác có thể được loại bỏ bằng eval và công cụ sửa đổi thay thế regrec mới / r. Kết thúc với 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}

Hãy thử trực tuyến!


2

C, 367 byte

Không kết thúc ngắn như nó có vẻ.

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 nhờ @Zener .

Chắc chắn có thể chơi gôn bằng cách sử dụng thứ gì đó khác với Bản đồ ..

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây. (ideone.com bị lỗi gần đây, vì vậy tôi đang sử dụng TIO ngay bây giờ ..)

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
Tôi nghĩ rằng bạn có thể lưu byte bằng cách sử dụng khởi tạo cú đúp và putthay vì m.put.
Zircon

2

C (gcc) , 311 byte

Mẫu rõ ràng, nhưng rất nhiều ngoại lệ. Tuy nhiên, phải có một cách tốt hơn thế này!

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.