คำพ้องรูปแบบการแข่งขัน


17

ฉันใช้เวลาทั้งหมดวันนี้ในการแข่งขัน Super Smash Bros. และฉันเริ่มคิดถึงคำศัพท์บางคำที่เราใช้เมื่ออธิบายชุด เหล่านี้เป็นชุดสามประเภทที่ฉันเห็นเล่นในทัวร์นาเมนต์:

  • ดีที่สุดของ 3 (Bo3)
    • มีการเล่นสามเกม ผู้ชนะของเซตคือผู้เล่นที่ชนะในเกมส่วนใหญ่
    • หากผู้เล่นคนเดียวชนะสองเกมของเซตพวกเขาจะประกาศผู้ชนะทันทีเพราะจะเป็นไปไม่ได้ที่คู่ต่อสู้จะตามทัน
  • ดีที่สุดจาก 5 (Bo5)
    • มีการเล่นห้าเกม ผู้ชนะของเซตคือผู้เล่นที่ชนะในเกมส่วนใหญ่
    • หากผู้เล่นคนเดียวชนะสามเกมในเซตพวกเขาจะประกาศผู้ชนะทันทีเพราะจะเป็นไปไม่ได้ที่คู่ต่อสู้จะทัน
  • แรกถึง 5 (Ft5)
    • โอเคฉันโกงข้อความของฉันก่อนหน้านี้เล็กน้อย ชุดนี้ไม่ได้เป็นส่วนหนึ่งของการแข่งขัน แต่คุณมักจะเห็นพวกเขาเกิดขึ้นในสถานที่จัดงาน นี่เป็นชุดแบบดั้งเดิมที่คุณจะเล่นหากคุณได้ท้าทายผู้เล่นอื่นและเงินอยู่ในสาย
    • มันง่ายอย่างที่คิด: ผู้เล่นเล่นเกมซ้ำ ๆ จนกระทั่งหนึ่งในนั้นชนะห้าเกมและผู้เล่นนั้นได้รับการประกาศให้เป็นผู้ชนะ

เห็นได้ชัดว่า Bo3 และ Bo5 คล้ายกันมากแตกต่างกันตามจำนวนเกมที่เล่น แต่ Ft5 แตกต่างอย่างชัดเจน ... ใช่มั้ย ไม่จริง! ไม่ว่าชุดของ Bo3 จะลงไปอย่างไรผู้ชนะจะได้รับรางวัลสองเกม ผู้ชนะของ Bo5 เซตจะชนะ 3 เกมอย่างแน่นอน ทำไมไม่เรียกพวกเขาว่า Ft2 หรือ Ft3 ตรรกะเดียวกันที่นำมาใช้ในการย้อนกลับจะแสดงให้เห็นว่า Ft5 เหมือนกับ Bo9

วัตถุประสงค์ของการท้าทายนี้คือการหาคำพ้องความหมายของรูปแบบที่กำหนด

สเปค

โปรแกรมหรือฟังก์ชั่นของคุณจะใช้สายเดียวจากการป้อนข้อมูล อักขระสองตัวแรกจะเป็นBoหรือFtและจะตามด้วยตัวเลข โปรแกรม / ฟังก์ชั่นจะส่งออกสตริงที่มีคำนำหน้าตรงข้ามและจำนวนเช่นนั้นอินพุตและเอาต์พุตสตริงหมายถึงสิ่งเดียวกัน

สตริงใด ๆ ที่ขึ้นต้นด้วยBoจะลงท้ายด้วยเลขคี่

คุณอาจคิดว่าตัวเลขในสตริงอินพุตจะไม่มากกว่า 200 นอกจากนี้คุณอาจสมมติว่าคุณจะไม่ได้รับอินพุตซึ่งเอาต์พุตที่ถูกต้องจะมีตัวเลขมากกว่า 200 เช่นเดียวกันอินพุตและหมายเลขเอาต์พุตที่ถูกต้องจะเป็นเช่นนั้นเสมอ มากกว่า 0

ตัวอย่าง

Bo3 -> Ft2
Ft2 -> Bo3

Bo5 -> Ft3
Ft3 -> Bo5

Bo9 -> Ft5
Ft5 -> Bo9

Bo51 -> Ft26
Ft26 -> Bo51

Bo199 -> Ft100
Ft100 -> Bo199

2
รหัสกอล์ฟและระยะประชิด? เราอาจเป็นเพื่อนกัน! ถ้าคุณกำลังพูดถึง SSB ด้อย
AKS

2
@aks แน่นอนระยะประชิด;)
undergroundmonorail

meleetists frikin ...
Nacht - Reinstate Monica

1
@aks ไม่มีอะไรผิดปกติกับโครงการ m; (
Cilan

1
@handhandle ยกเว้นพูดตามกฎหมาย RIP
undergroundmonorail

คำตอบ:


10

Pyth, 23 ไบต์

@,/hKsttz2tyKCp-"BoFt"z

ชุดทดสอบ

มันทำงานอย่างไร:

ครั้งแรกที่จะหาBoหรือFtโปรแกรมกรองเอาตัวละครในการป้อนข้อมูลจากที่มีBoFt-"BoFt"z

pนี้จะมีการพิมพ์ทันที pส่งคืนอินพุตของมันด้วย สตริงที่ถูกแปลงเป็นจำนวนไบต์ตีความเป็นฐาน 256 ผลที่ได้คือ 17007 ถ้าสตริงเป็นBoและเป็น 18036 Ftถ้าสตริงเป็น

ถัดไปจะคำนวณทั้งผลลัพธ์ที่เป็นไปได้num * 2 - 1และ(num + 1)/2และใส่ไว้ในรายการ 2 รายการ จากนั้นโปรแกรมจะจัดทำดัชนีในรายการนั้นด้วยหมายเลขด้านบน 17007 หรือ 18036 เนื่องจากการทำดัชนีแบบแยกส่วนของ Pyth จะเป็นการเลือกหมายเลขที่เหมาะสม ผลลัพธ์จะถูกพิมพ์โดยอัตโนมัติ

ตั้งแต่การpพิมพ์ที่ไม่มีบรรทัดใหม่ต่อท้าย แต่การพิมพ์โดยนัยจะมีการขึ้นบรรทัดใหม่การพิมพ์สองชุดที่ต่อเนื่องออกมาในรูปแบบที่ถูกต้อง


13

Python 2, 59

lambda s:'FBto'[s>'C'::2]+`eval(s[2:]+'/*22+-11'[s>'C'::2])`

ในความท้าทายระยะสั้นที่อนุญาตให้ใช้งานได้ความกะทัดรัดของการlambdaชนะมักจะเกิดขึ้นแม้ว่ารหัสจะต้องทำซ้ำตัวเองเนื่องจากไม่สามารถกำหนดตัวแปรได้

s>'C'เราตรวจสอบกรณีที่เราอยู่ในที่มีการเปรียบเทียบสตริง 'FBto'[s>'C'::2]จากนั้นได้รับคำนำหน้าขวากับเคล็ดลับรายการหั่น

เพื่อให้ได้ตัวเลขเราจะต้องประเมินตัวละครเกินกว่าตัวที่สองและทำอย่างใดอย่างหนึ่ง*2+1หรือ/2-1เพื่อมัน เราทำสิ่งนี้โดยการตรึงสองนิพจน์เหล่านั้นเป็นสตริงเลือกอีกครั้งโดยการแบ่งส่วนรายการประเมินผลและเปลี่ยนตัวเลขนั้นเป็นสตริง

แก้ไข:บันทึกหนึ่งตัวอักษร (59):

lambda s:eval("''FBto''++``%%ss/*22+-11``"[s>'C'::2]%s[2:])

อย่าถามแม้แต่ ...


2
คุณสามารถกำหนดตัวแปรภายใน lambdas ตัวอย่าง: lambda a:(lambda b:b*b)(a+3). มันไม่สั้นโดยเฉพาะอย่างยิ่ง
orlp

8

เทมเพลตการเขียนโปรแกรม C ++ 11, 305 ไบต์

แก้ไข: ได้รับอีก 100 ไบต์

ฉันจะได้รับแต้มต่อสำหรับการเลือกภาษาของฉันหรือไม่? : p

#define C wchar_t
#define T };template<C p
#define L C...l>struct
#define X l...>
C a{T,L I{T,C c,L I<p,c,X:I<10*p+c-'0',X{T>struct I<p>{enum E{v=p};T,L S{T,C c,C d,L G:G<p/10,c,d,p%10+'0',X{T,L G<0,p,X{typedef S<p,X t;T,L F{T,L F<p,'o',X:G<(I<0,X::v+1)/2,'F','t'>{T,L F<p,'t',X:G<I<0,X::v*2-1,'B','o'>{};

ตัวอย่าง:

#include <type_traits>
static_assert(I<0,'5'>::v == 5, "fail");
static_assert(I<0,'1','0','5'>::v == 105, "fail");
static_assert(I<0,'5','1'>::v == 51, "fail");
static_assert(std::is_same<typename G<5,'B','o'>::t, S<'B','o','5'>>::value, "fail");
static_assert(std::is_same<typename G<51,'F','t'>::t, S<'F','t','5','1'>>::value, "fail");
static_assert(std::is_same<typename F<'B','o','3'>::t, S<'F','t','2'>>::value, "fail");
static_assert(std::is_same<typename F<'F','t','2'>::t, S<'B','o','3'>>::value, "fail");
static_assert(std::is_same<typename F<'B','o','5'>::t, S<'F','t','3'>>::value, "fail");
static_assert(std::is_same<typename F<'F','t','3'>::t, S<'B','o','5'>>::value, "fail");
static_assert(std::is_same<typename F<'B','o','7'>::t, S<'F','t','4'>>::value, "fail");
static_assert(std::is_same<typename F<'F','t','4'>::t, S<'B','o','7'>>::value, "fail");
static_assert(std::is_same<typename F<'B','o','1','1'>::t, S<'F','t','6'>>::value, "fail");
static_assert(std::is_same<typename F<'F','t','6'>::t, S<'B','o','1','1'>>::value, "fail");
static_assert(std::is_same<typename F<'B','o','1','0','5'>::t, S<'F','t','5','3'>>::value, "fail");
static_assert(std::is_same<typename F<'F','t','5','3'>::t, S<'B','o','1','0','5'>>::value, "fail");
static_assert(std::is_same<typename F<'B','o','1','9','5'>::t, S<'F','t','9','8'>>::value, "fail");
static_assert(std::is_same<typename F<'F','t','9','8'>::t, S<'B','o','1','9','5'>>::value, "fail");
int main() {}

6

CJam, 29 ไบต์

l('B=\1>i"Ft"1$)2/+"Bo"@2*(+?

ลองออนไลน์

ไม่มีอะไรซับซ้อนมากที่นี่ การคำนวณผลลัพธ์ที่เป็นไปได้สองแบบและเลือกหนึ่งในสองผลลัพธ์ตามตัวอักษรตัวแรกในอินพุต จะอัปเดตถ้าฉันคิดสิ่งที่ดีกว่า

คำอธิบาย:

l     Get input.
(     Pop off first character.
'B=   Compare with 'B.
\1>   Get rest of input to top of stack, and slice off first character.
i     Convert to integer.
"Ft"  String part of first possible output.
1$    Copy input value to top.
)2/   Increment, and divide by 2.
+     Concatenate with string part.
"Bo"  String part of second possible output.
@     Move input value to top.
2*(   Multiply by 2, and decrement.
+     Concatenate with string part.
?     Ternary to pick one of the two constructed outputs, based on comparison
      of first input character with 'B.

6

CJam, 27 ไบต์

4 27]r.^(_o'B=\(oi_2*(\)2/?

นี้จะทำให้ใช้ความจริงที่ว่าและ'B' ^ 'F' == 4'o' ^ 't' == 27

ลองใช้ออนไลน์ในล่าม CJam


5

Javascript (ES6), 50 47 ตัวอักษร

วิธีแก้ปัญหาที่ง่ายมาก: (ขอบคุณ undergroundmonorail สำหรับการลบหนึ่งไบต์!)

x=>(y=x.slice(2),x<'C'?'Ft'+-~y/2:'Bo'+(y*2-1))

Ungolfed:

function(x){
  y = x.slice(2); // everything after the 'Ft' or 'Bo'
  return x<'C' ? 'Ft'+Math.ceil(y/2) : 'Bo'+(y*2-1)
}

สำหรับครั้งหนึ่งคำตอบของฉันมีเพียง ~ 2x ความยาวของคำตอบ Pyth ที่ดีที่สุด!


ฉันพูดถึงเรื่องนี้ในการแชท แต่คุณควรจะสามารถแทนที่y/2+.5ด้วย-~y/2เพื่อบันทึกไบต์
undergroundmonorail

@undergroundmonorail ขอบคุณสำหรับคำแนะนำ! BTW ฉันชอบความท้าทายนี้เพราะมันง่ายเมื่อเทียบกับความท้าทายส่วนใหญ่ดังนั้นคำตอบของฉันจึงสั้นกว่าปกติมาก
ETHproductions


3

Pyth - 31 ไบต์

ค่อนข้างง่ายใช้การสร้างดัชนี zip และโมดูลาร์เพื่อรับสวิตช์ การคำนวณจริงนั้นง่ายมาก

s@C,Jc"FtBo"2,h/Ksttz2tyKhxJ<z2

ชุดทดสอบ


3

Julia, 63 ไบต์

x->(y=int(x[3:end]);join([x<"C"?"Ft":"Bo",x<"C"?(y+12:2y-1]))

Ungolfed:

function f(x::String)
    # Extract the number at the end
    y = int(x[3:end])

    # If x is lexographically less than "C", we have
    # "best of," so we need "first to." Otherwise we
    # need "best of."
    if x < "C"
        join(["Ft", (y+12])
    else
        join(["Bo", 2y-1])
    end
end


3

พาวเวอร์เซลล์, 111

ความว่องไวของ PowerShell และวงเล็บที่ต้องการคือความพินาศ แม้แต่การเล่นกอล์ฟ.Substring(0,2)ถึง[0..1]-join''บันทึกเพียง 2 ไบต์ต่อครั้งและอีกสองไบต์บันทึกด้วยความElseขอบคุณโดยนัยexitคำสั่ง โอ้ดี ทบทวนที่ดีเกี่ยวกับการแยกสตริง

รหัส:

$b=($a=$args[0])[0..1]-join'';$c=+($a[2..($a.Length-1)]-join'');if($b-eq"Bo"){"Ft"+($c+1)/2;exit};"Bo"+(2*$c-1)

การใช้งาน:

PS C:\Scripts\Golfing> .\ssb_tourney.ps1 Bo199
Ft100

คำอธิบาย

$b=($a=$args[0])[0..1]-join''      # Take in the command-line argument as $a, recast as
                                   # array, suck out the first two characters, save as $b
$c=+($a[2..($a.Length-1)]-join'')  # Do a similar trick with the right-hand side of $a,
                                   # re-cast it as an integer with the +
if($b-eq"Bo"){                     # If the first letters are "Bo"
    "Ft"+($c+1)/2                  # Implied write of the answer
    exit
}
"Bo"+(2*$c-1)                      # Implied write of the other answer, only reached if
                                   # the input is "Ft", else we would have hit the exit

3

Perl 5, 38 ไบต์ (37 + 1 สำหรับ-p)

$_=/Bo/?Ft.(.5+$'/2):Bo.(2*s/Ft//r-1)

การใช้งาน : บันทึกเป็น 54768.pl และเรียกใช้เป็น:

perl -p 54768.pl <<< 'Bo3'
# Ft2

หรือโต้ตอบ:

perl -p 54768.pl
Bo199
# Ft100

-p-nหมายถึง คุณไม่ต้องการทั้งคู่
เดนนิส

@Dennis แน่นอนฉันทำไม่ได้! ขอขอบคุณ!
Dom Hastings

3

FSharp - 153 143 ไบต์

let t(s:string)=
 let c=s.[2..]|>Seq.map string|>Seq.reduce(+)|>float
 if s.[0]='B'then sprintf"Ft%.0f"(ceil(c/2.)) else sprintf"Bo%.0f"(c*2.-1.)

อัพเดท

  1. เคาะออกไปสองสามไบต์โดยสลับจากการจับคู่รูปแบบเป็นแบบง่าย if ... then ...

3

Ruby, 82 ไบต์

x=$*[0]
y=x.match(/..(\d*)/)[1].to_i
x=~/Bo/?(puts"Ft#{y/2+1}"):(puts"Bo#{y*2-1}")

เรียกว่ามีการโต้แย้งที่จะปิดไม่กี่ไบต์
โพสต์แรกยินดีต้อนรับข้อเสนอแนะ :)

แก้ไข:กำจัด 12 bytes โดยเปลี่ยนคณิตศาสตร์ของฉัน เนื่องจากตัวเลขโบเป็นเลขคี่พวกเขาจะมีทศนิยมเสมอหลังจากหารด้วย 2 หมายความว่าฉันสามารถตัดทอนและเพิ่ม 1 แทนการใช้ceilเพื่อปัดเศษ


คุณสามารถบันทึกสองไบต์ได้โดยลบพื้นที่ออกหลังจากputsนั้น
ProgramFOX

@ProgramFOX ไม่ทราบว่าฉันคิดถึงสิ่งเหล่านั้นอย่างไรขอบคุณ นอกจากนี้ฉันก็สามารถแก้ไขการแก้ไขได้ แต่ฉันคิดว่าตอนนี้ได้รับการแก้ไขแล้วฮ่าฮ่า
HuggableSquare

เรากำลังแก้ไขโพสต์ในเวลาเดียวกันซึ่งทำให้เกิดความขัดแย้งในการแก้ไข เนื่องจากคุณส่งในภายหลังการแก้ไขจะเขียนทับเหมือง ฉันรู้ว่าการแก้ไขข้อขัดแย้งนั้นค่อนข้างยุ่งยาก: P
ProgramFOX

3

PHP, 85 79 75 ไบต์

<?php
$f=$argv[1];$s=substr($f,2);echo strpos($f,Bo)===0?Ft.($s+1)/2:Bo.($s*2-1);


การใช้งาน:
โทรสคริปต์ด้วยอาร์กิวเมนต์:php -d error_reporting=0 script.php Bo5


3

ไม่สั้นอย่างน่าขันเหมือนคนอื่น ๆ แต่นั่นเป็นโพสต์แรกของฉัน:

JS, 143 ไบต์

f=prompt("","");n=parseInt(f.match(/\d{1,}/));s=0;r=0;if(f.match(/B/)){r=(n+1)/2;s="Ft"+r;}if(f.match(/F/)){r=n*2-1;s="Bo"+r;}alert(f+" : "+s);

เวอร์ชันที่ไม่ถูกปรับแต่ง:

var f = prompt("", "");
var n = parseInt(f.match(/\d{1,}/));
var s = 0;
var r = 0;

if (f.match(/B/)) {
  r = (n + 1)/ 2;
  s = "Ft"+r;
 }
if (f.match(/F/)) {
  r = n * 2 - 1;
  s = "Bo"+r;
 }
alert(f+" : "+s);

7
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! มีสองวิธีในการย่อรหัสของคุณให้สั้นลงดังนั้นนี่คือบางส่วน 1) ช่องว่างเกือบทั้งหมดใน JavaScript นั้นไม่จำเป็น 2) คุณไม่ต้องการvarคำหลักและ 3) คำสั่งสามารถคั่นด้วยเครื่องหมายอัฒภาคหรือขึ้นบรรทัดใหม่ดังนั้นคุณจึงไม่จำเป็นต้องใช้ทั้งสองอย่าง สำหรับเคล็ดลับทั่วไปมากขึ้นมีลักษณะที่เคล็ดลับสำหรับการเล่นกอล์ฟใน JavaScript
NinjaBearMonkey

2

R, 144 ไบต์

ใหม่สำหรับการเขียนโค้ดกอล์ฟ, R และเว็บไซต์นี้ ดังนั้นที่นี่ไป:

a=function(){n=readline();z="Bo";p=(as.numeric(gsub("[^0-9]","",n)));if(grepl(z,n)==TRUE){x="Ft";b=(p+1)/2}else{x="Bo";b=p*2-1};cat(x);cat(b)}

ฉันไม่รู้ R แต่ฉันพนันได้เลยว่าคุณสามารถกำจัดช่องว่างออกได้
undergroundmonorail

@undergroundmonorail คุณพูดถูก R ไม่ได้ใช้ช่องว่างจริงๆ ฉันเพิ่งเขียนแบบนี้เพื่อให้มันดูดีกว่า = P ขนาดของไฟล์ที่ไม่มีช่องว่างคือ 144 ไบต์ฉันไม่แน่ใจว่าจะใส่หมายเลขใดดังนั้นฉันจึงใส่รหัสที่ต่ำที่สุดที่ฉันสามารถใส่ลงไปได้
หมอนนุ่ม ๆ

โอ้ไม่เป็นไร :) สำหรับบันทึกแล้วโดยทั่วไปแล้วคุณควรโพสต์รหัสที่แน่นอนที่คุณใช้สำหรับคะแนนของคุณเพียงเพื่อให้ง่ายที่สุดในการตรวจสอบแม้ว่าคนมักจะมีเวอร์ชัน "ungolfed" เพื่อให้อ่านง่ายขึ้น ขอบเขตของช่วงที่ไม่เอื้ออำนวยตั้งแต่การเพิ่มการเยื้องและการขึ้นบรรทัดใหม่ไปจนถึงการเปลี่ยนชื่อตัวแปรการย่อส่วนของโค้ดให้เป็นฟังก์ชั่นและโดยทั่วไปแล้วการทำให้โค้ดสะอาดขึ้น ไม่จำเป็นต้องมีเลย แต่ก็ใช้ได้ตราบใดที่มีเวอร์ชั่นของกอล์ฟอย่างครบถ้วน
undergroundmonorail

1

C #, 110 ไบต์

string f(string s){var b=s[0]=='B';var o=s.Remove(0,2);int i=int.Parse(o)/2;return b?"Ft"+(i+1):"Bo"+(4*i-1);}

ยินดีต้อนรับสู่ PPCG! โปรดใส่รหัสที่แน่นอนที่คุณนับไว้ในคำตอบของคุณเพื่อให้ผู้คนสามารถตรวจสอบคะแนนของคุณได้อย่างง่ายดาย (ดูเหมือนว่าคุณได้นับรหัสโดยไม่มีช่องว่างที่ไม่จำเป็น) คุณสามารถรวมรุ่นที่ไม่ได้อ่าน / อ่านได้นอกเหนือจากนั้น
Martin Ender
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.