내 진짜 친구들을위한 코드 골프


35

... 그리고 내 코드 친구를위한 실제 골프.

이것은 1 년 된 XKCD 만화 를 기반으로 한 도전이며, 주로 독특한 패턴을 따르는 토스트 (만화의 첫 패러디)로 구성되지만 약간의 변형이 있습니다.

당신의 임무는 friends입력 (stdin 또는 함수 인수를 통해)으로 만화에서 토스트의 상반기를 가져 와서 (stdin 또는 function argument를 통해) 모든 것의 정확한 텍스트를 출력 (또는 반환)하는 프로그램 (또는 함수)을 작성하는 것입니다. 후반. 유효하지 않은 입력을 처리 할 필요는 없습니다. 표준 허점을 적용하고 가장 짧은 코드를 바이트 단위로 사용하십시오.

토스트를 다른 곳에서 복사하지 않으려는 사람들을 돕기 위해 여기에 모두 입력과 ​​출력으로 분리되어 있습니다.

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!

Single-payer대신 오타가있는 것 같습니다 Single-player.
케빈 크루이 센

4
케빈 : 아니요 Single-payer. 정말 그렇습니다 .
ivzem

@KevinCruijssen-오타 일 수 있지만 그렇다면 ivzem이 아닌 Randall @ XKCD입니다. Explain xkcd 에 대한 토론이 있습니다 . 또한, ivzem-HNQ 목록에서 제목을 보자 마자 그 만화를 참조하고 있다고 확신했습니다. 잘 했어!
Bobson

답변:


18

레티 나 119 바이트

이전 버전은 "플라톤 고체"의 공간을 올바르게 관리하지 못했습니다.이 버전은 작동하며 더 짧습니다 :)

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

온라인으로 사용해보십시오!

이것은 일련의 대체를 통해 입력을 출력으로 변환합니다.

가장 흥미로운 부분은이 대체 (정규 골프 종류)입니다.

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

첫 번째 단어를 나누고 조각을 올바른 장소에 배치하고 여분의 공백을 제거하고 출력 구조를 구축하여 거의 모든 작업을 수행합니다. "Tumbleweeds"테스트 사례에서 올바르게 작동하려면 이전 대체 "eds"-> "ed"에 따라 다릅니다.

나머지는 대부분 특별한 경우를 다루는 대체로 구성됩니다. 다른 흥미로운 부분은 다음과 같습니다.

T`TL`Tl

"T"(텀블러 용)를 제외한 모든 것이 소문자로 바뀝니다.

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

이것은 "." 각 문장의 끝에 "p"뒤에 "y"가 붙은 단어가 들어있는 단어 (실제로는 "petty"와 "payer")가 있습니다. 그런 다음 "!" "s"(다른 모든 문장)로 끝나는 모든 문장의 끝에.


이 뒤에 추가 공간이 인쇄 platonic됩니다. 제안 된 수정 사항 : TIO (+5 바이트)
수학 중독자

1
@math_junkie 감사합니다, 공백 문제를 해결하고 더 짧은 새로운 버전을 업로드했습니다 :)
Leo

10

파이썬 2 291 269 293 255 247 바이트

Erik the Outgolfer22 바이트를 절약 해 주셔서 감사 합니다!

.대신에 끝나는 일부 출력을 설명하기 위해 +24 바이트!

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]

일을 시작하는 간단한 솔루션. 주석에서 제안한대로 입력의 여덟 번째 문자를 확인하고 사전 에서 해당 출력을 배열로 찾습니다 .

온라인으로 사용해보십시오!


당신은 잊었을 수도 있습니다 Single-payer for my real friends.
Mathieu Rodic

@MathieuRodic 아니오, 그건 아주 의도적 인 것입니다. RealPlayer특별한 경우입니다
math junkie

죄송합니다, 너무 빨리 읽으십시오.
Mathieu Rodic

6

SOGL , 143 바이트

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

이 문자열을 주요 부분으로 사용합니다. "|" 스플리터이고 "_"는 공간 자리 표시 자이므로 split이 올바르게 작동합니다.

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

입력 예 : "실제 친구를위한 플라톤 솔리드"설명 :

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

파이썬 3 , 788 , 403 , 359 396 바이트

최신 버전

이것은 지금 나의 다섯 번째 시도입니다. 원래 프로그램의 절반 크기로 관리했습니다. 이제 누락 된 "-"가 포함되어 있으며 완전한 솔루션이라고 생각합니다. 아직도 나는 부피가 큰 쪽을 의심한다. 그러나 목표에 훨씬 더 가깝습니다. 나는 많은 도움을 받았다 . 도움을 주신 모든 분들께 감사드립니다.

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)

온라인으로 사용해보십시오!


원본 게시

이것은 코드 골프에 대한 첫 번째 게시물이므로 서투른 프로그램에 대해 사과드립니다. 단어를 파싱하여 "Champagne"을 "pain", "sham"로 변환하는 프로그램이 어떻게 작성되는지 알 수 없습니다. 그러나 다른 누군가가 그 문제를 해결하고 싶습니다. 따라서 내 능력 수준에 따라 "Champagne"이 "pain", "sham"이라는 것을 미리 알 필요가 있음에 따라 실제로 입력 요청을 코딩하는 데 별다른 의미가 없었습니다. 결과적으로 나는 그것을 생략하고 인쇄 출력에 약간 리터럴이되었습니다. 괜찮아 희망 :)

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
도움말 센터에서 : 모든 해결 과제에 대한 솔루션 은 다음과 같아야합니다. 예를 들어, 코드 골프 대회에 참가하려면 골프를 해야하고, 스피드 대회에 참가하려면 빨리 시도해야합니다.
아웃 골퍼 에릭

1
안녕하세요. 사이트에 오신 것을 환영합니다. 코드 길이를 최소화하기 위해 노력해야 하는 코드 골프 질문입니다. 불필요한 공백을 제거하고 변수 이름을 1 자로 설정해야합니다.
위트 마법사

전체 phraseList를 한 줄에 넣고, 들여 쓰기를 한 칸으로 줄이거 나, 인쇄물을 if와 else와 함께 한 줄로 묶을 수 있으며, 인쇄물에 공백이 필요하지 않습니다. 어쨌든, 나는 당신이 단지 모든 출력을 인쇄 할 수 있는지 모르겠다.;)
Mega Man

1
안녕하세요! 이것이 첫 번째 코드 골프 답변 인 것 같습니다. 불행히도, 질문, 특히 맨 아래의 "예제"테이블을 오해 한 것 같습니다. 각 테이블은 각 입력이 각각의 출력에 어떻게 매핑되어야하는지 보여줍니다. 현재 귀하의 프로그램은 해당 테이블을 인쇄합니다 ._ 또한 더 나은 가독성을 위해 코드 블록에 코드를 배치하고 (선택하고 {}을 클릭)이 사이트가 있으므로 선택 언어 및 바이트 수를 언급하는 것이 일반적입니다 Q & A 사이트보다 경쟁 업체와 유사합니다 ._ 밀 마법사는 이미 그렇게 했으므로 더 좋습니다
ivzem

PPCG에 오신 것을 환영합니다. 공백을 제거하고 단일 문자 변수를 사용하면 많은 바이트를 잃을 수 있습니다. 처음 시작했을 때 익숙해지는 데 시간이 걸렸다는 것을 기억합니다. 당신이 나 같아요 읽을 수있는 코드를 작성하는 데 많은 시간을 소비합니다. 내가 말했듯이, PPCG와 새로운 세계에 오신 것을 환영합니다;)
ElPedro

6

로다 , 299 292 288 259 바이트

명령문 ,대신 사용하기 위해 @fergusq 덕분에 4 바이트가 절약 ..되었습니다 push.

@fergusq 덕분에 바이트가 절약되었습니다. 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 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*/
}

마지막 명령문에서 문자열 보간을 사용하여 1 바이트를 저장할 수 있습니까? 편집 : 실제로 가장 짧은 방법은 아마도 많은 문자열을 하나 대신 스트림으로 푸시하는 것입니다. 교체 ..와 함께 ,.
fergusq

@fergusq 팁 주셔서 감사합니다!
Kritixi Lithos

또한 당신은 사용할 수 있습니다 r=indexOf(a[7:8],"noarspekc").
fergusq

@ fergusq 아, 나는 그런 내장이 존재하는지 몰랐습니다. 감사!
Kritixi Lithos

5

자바 스크립트 (ES6) 230 228 221 216 바이트

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

테스트


3

PHP, 202 220 204 203 바이트

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

펄, 173 168 바이트

줄 바꿈과 들여 쓰기를 제거하면 173 바이트의 Perl5 코드가됩니다. Leo의 Retina 답변에서 첫 정규 표현식을 뻔뻔스럽게 훔쳤습니다. (내 문자는 몇 자 더 길었다)

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의 경우 eval 및 새로운 / r regexp 대체 수정자를 사용하여 5 바이트를 더 줄일 수 있습니다. 168 바이트로 끝납니다.

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}

온라인으로 사용해보십시오!


2

C, 367 바이트

생각보다 짧지 않았습니다.

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

자바 7,585 553 바이트

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 덕분에 -32 바이트 .

지도와 다른 것을 사용하여 확실히 골프를 칠 수 있습니다 ..

설명:

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

테스트 코드 :

여기에서 시도하십시오. (ideone.com은 최근에 버그가 발생하여 지금 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"));
  }
}

1
더블 괄호 초기화를 사용하여 put대신 바이트를 절약 할 수 있다고 생각합니다 m.put.
지르콘

2

C (gcc) , 311 바이트

명확한 패턴이지만 많은 예외가 있습니다. 그래도 이보다 더 좋은 방법이 있어야합니다!

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.