Định dạng giải đấu Từ đồng nghĩa


17

Tôi đã dành tất cả ngày hôm nay tại một giải đấu Super Smash Bros. và tôi bắt đầu nghĩ về một số thuật ngữ chúng ta sử dụng khi mô tả các bộ. Đây là ba loại bộ mà tôi thấy đã chơi tại các giải đấu:

  • Tốt nhất trong 3 (Bo3)
    • Ba trò chơi được chơi. Người chiến thắng của bộ này là người chơi đã giành được phần lớn các trò chơi.
    • Nếu một người chơi chiến thắng hai ván đấu, họ ngay lập tức được tuyên bố là người chiến thắng, bởi vì đối thủ sẽ không thể bắt kịp.
  • Tốt nhất trong 5 (Bo5)
    • Năm trò chơi được chơi. Người chiến thắng của bộ này là người chơi đã giành được phần lớn các trò chơi.
    • Nếu một người chơi chiến thắng ba ván đấu, họ ngay lập tức được tuyên bố là người chiến thắng, bởi vì đối thủ sẽ không thể bắt kịp.
  • Đầu tiên đến 5 (Ft5)
    • Được rồi, tôi đã gian lận một chút với từ ngữ của tôi trước đó. Loại tập hợp này không phải là một phần của giải đấu, nhưng bạn sẽ thường thấy chúng diễn ra trong địa điểm. Theo truyền thống, đây là loại tập hợp bạn sẽ chơi nếu bạn thách đấu một người chơi khác và tiền đang ở trên đường.
    • Nghe có vẻ đơn giản: Người chơi liên tục chơi trò chơi cho đến khi một trong số họ giành được năm và người chơi đó được tuyên bố là người chiến thắng.

Rõ ràng, Bo3 và Bo5 rất giống nhau, chỉ khác nhau về số lượng trò chơi được chơi. Nhưng Ft5 rõ ràng là khác nhau ... phải không? Không hẳn vậy! Cho dù bộ Bo3 đi xuống như thế nào, người chiến thắng sẽ giành chiến thắng chính xác hai trận. Người chiến thắng trong bộ Bo5 sẽ thắng đúng 3 trận. Tại sao không gọi chúng là Ft2, hay Ft3? Logic tương tự, được áp dụng ngược lại, sẽ cho thấy Ft5 hoàn toàn giống với Bo9.

Mục tiêu của thử thách này là xác định từ đồng nghĩa của định dạng đã đặt.

Sự chỉ rõ

Chương trình hoặc chức năng của bạn sẽ lấy một chuỗi từ đầu vào . Hai ký tự đầu tiên sẽ là Bohoặc Ft, và chúng sẽ được theo sau bởi một số. Chương trình / hàm sẽ xuất ra một chuỗi có tiền tố ngược lại và một số sao cho chuỗi đầu vào và đầu ra có nghĩa giống nhau.

Bất kỳ chuỗi bắt đầu bằng Bosẽ kết thúc bằng một số lẻ.

Bạn có thể cho rằng số trong chuỗi đầu vào sẽ không bao giờ lớn hơn 200. Bạn cũng có thể cho rằng bạn sẽ không bao giờ nhận được đầu vào mà đầu ra đúng sẽ bao gồm một số lớn hơn 200. Tương tự như vậy, số đầu ra và đầu ra đúng sẽ luôn luôn lớn hơn 0.

Ví dụ

Bo3 -> Ft2
Ft2 -> Bo3

Bo5 -> Ft3
Ft3 -> Bo5

Bo9 -> Ft5
Ft5 -> Bo9

Bo51 -> Ft26
Ft26 -> Bo51

Bo199 -> Ft100
Ft100 -> Bo199

2
Mã golf và cận chiến? Chúng ta có thể là bạn! Trừ khi bạn đang nói về một SSB kém hơn
aks.

2
@aks. tất nhiên melee;)
undergroundmonorail

frikin meleetists ...
Nacht - Tái lập Monica

1
@aks. Không có gì sai với dự án m; (
Cilan

1
@ cửa sổ ngoại trừ nói hợp pháp. RIP
undergroundmonorail

Câu trả lời:


10

Bình thường, 23 byte

@,/hKsttz2tyKCp-"BoFt"z

Bộ thử nghiệm.

Làm thế nào nó hoạt động:

Đầu tiên, để tìm Bohoặc Ft, chương trình lọc các ký tự trong đầu vào từ BoFt, với -"BoFt"z.

Điều này ngay lập tức được in với p. pcũng trả về đầu vào của nó. Chuỗi đó được chuyển đổi thành một số diễn giải các byte là cơ sở 256. Kết quả là 17007 nếu chuỗi là Bovà 18036 nếu chuỗi là Ft.

Tiếp theo, nó tính toán cả hai kết quả có thể, num * 2 - 1(num + 1)/2và đặt này trong danh sách 2 nhập cảnh. Sau đó, chương trình lập chỉ mục vào danh sách đó với số ở trên, 17007 hoặc 18036. Do lập chỉ mục mô-đun của Pyth, điều này chọn số thích hợp. Kết quả sau đó được in tự động.

pcác bản in không có dòng mới, nhưng in ngầm có dòng mới, hai bản in liên tiếp xuất hiện ở định dạng chính xác.


13

Con trăn 2, 59

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

Trong những thử thách ngắn nơi các chức năng được cho phép, sự ngắn gọn của lambda thường chiến thắng ngay cả khi mã phải lặp lại do không có khả năng gán biến.

Chúng tôi kiểm tra trường hợp nào chúng tôi tham gia với so sánh chuỗi s>'C'. Sau đó, lấy tiền tố đúng với thủ thuật cắt danh sách'FBto'[s>'C'::2] .

Để có được số, chúng ta phải đánh giá các ký tự ngoài số thứ hai và thực hiện *2+1hoặc/2-1 theo số đó. Chúng tôi thực hiện điều này bằng cách xử lý một trong hai biểu thức đó dưới dạng chuỗi, một lần nữa được chọn bằng cách cắt danh sách, đánh giá kết quả và biến số đó thành một chuỗi.

Chỉnh sửa: Đã lưu một char (59):

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

Đừng hỏi ...


2
Bạn có thể gán các biến bên trong lambdas. Ví dụ : lambda a:(lambda b:b*b)(a+3). Tuy nhiên, nó không đặc biệt ngắn.
orlp

8

Siêu lập trình mẫu C ++ 11, 305 byte

Chỉnh sửa: Giảm thêm 100 byte

Tôi có nhận được bất kỳ loại khuyết tật nào cho sự lựa chọn ngôn ngữ của mình không? : 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'>{};

Ví dụ:

#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 byte

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

Dùng thử trực tuyến

Không có gì rất công phu ở đây. Tính toán hai kết quả có thể và chọn một trong hai kết quả dựa trên chữ cái đầu tiên trong đầu vào. Sẽ cập nhật nếu tôi đưa ra một cái gì đó tốt hơn.

Giải trình:

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 byte

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

Điều này làm cho việc sử dụng thực tế rằng 'B' ^ 'F' == 4'o' ^ 't' == 27.

Hãy thử trực tuyến trong trình thông dịch CJam .


5

Javascript (ES6), 50 47 ký tự

Giải pháp rất đơn giản: (Nhờ vào công cụ ngầm để xóa một byte!)

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

Ung dung:

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

Lần đầu tiên câu trả lời của tôi chỉ bằng ~ gấp đôi chiều dài của câu trả lời Pyth hay nhất!


Tôi đã đề cập điều này trong trò chuyện nhưng bạn sẽ có thể thay thế y/2+.5bằng -~y/2để lưu một byte.
undergroundmonorail

@undergroundmonorail Cảm ơn vì tiền boa! BTW, tôi thích thử thách này vì nó đơn giản so với hầu hết các thử thách, vì vậy câu trả lời của tôi hóa ra ngắn hơn nhiều so với bình thường.
Sản phẩm ETH

4

Haskell, 69 byte

f('B':_:x)="Ft"++show(div(read x)2+1)
f(_:_:x)="Bo"++show(2*read x-1)

Hợp lý thẳng tiến.


3

Pyth - 31 byte

Khá đơn giản, sử dụng zip và lập chỉ mục mô-đun để có được chuyển đổi. Tính toán thực tế là thực sự dễ dàng.

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

Bộ thử nghiệm .


3

Julia, 63 byte

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

Ung dung:

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

Matlab, 95 byte

function f(s)
t='Bo';a=2;b=-1;if s(1)<70
t='Ft';a=.5;b=a;end
[t num2str(str2num(s(3:end))*a+b)]

Ví dụ:

>> f('Ft5')
ans =
Bo9
>> f('Bo51')
ans =
Ft26

3

Powershell, 111

Sự nhanh nhẹn của PowerShell và dấu ngoặc đơn được yêu cầu là sự sụp đổ của nó một lần nữa. Thậm chí chơi golf các .Substring(0,2)để [0..1]-join''chỉ tiết kiệm 2 byte mỗi, và cặp đôi khác byte lưu với một ngụ ý Elsenhờ vào exitlệnh. Ồ tốt Tốt bồi dưỡng về tách chuỗi.

Mã số:

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

Sử dụng:

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

Giải trình

$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 byte (37 + 1 cho -p)

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

Cách sử dụng : lưu dưới dạng 54768.pl và chạy dưới dạng:

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

hoặc tương tác:

perl -p 54768.pl
Bo199
# Ft100

-pngụ ý -n. Bạn không cần cả hai.
Dennis

@Dennis, thực sự tôi không! Cảm ơn bạn!
Dom Hastings

3

FSharp - 153 143 byte

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

Cập nhật

  1. Đã loại bỏ một vài byte bằng cách chuyển từ khớp mẫu sang đơn giản if ... then ...

3

Ruby, 82 byte

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

Được gọi với một đối số để loại bỏ một vài byte.
Bài đầu tiên, đề nghị chào mừng. :)

EDIT: Loại bỏ 12 byte bằng cách thay đổi toán học của tôi. Vì các số Bo là số lẻ nên chúng sẽ luôn có số thập phân sau khi chia cho 2, nghĩa là tôi chỉ có thể cắt bớt và thêm 1 thay vì sử dụng ceilđể làm tròn.


Bạn có thể lưu hai byte bằng cách loại bỏ khoảng trắng sau puts.
Chương trìnhFOX

@ProgramFOX không biết tôi đã bỏ lỡ những thứ đó như thế nào, cảm ơn bạn. Ngoài ra, bằng cách nào đó tôi đã xoay sở để chỉnh sửa các chỉnh sửa nhưng tôi nghĩ bây giờ nó đã được sửa, haha.
HuggableSapes 19/08/2015

Chúng tôi đã chỉnh sửa bài đăng cùng một lúc, điều này gây ra xung đột chỉnh sửa. Bởi vì bạn đã gửi sau đó, chỉnh sửa của bạn ghi đè lên của tôi. Tôi biết, chỉnh sửa xung đột là một chút khó khăn: P
Chương trìnhFOX

3

PHP, 85 79 75 byte

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


Cách sử dụng:
Gọi tập lệnh với một đối số:php -d error_reporting=0 script.php Bo5


3

Không ngắn một cách lố bịch như những người khác, nhưng đó là bài viết đầu tiên của tôi:

JS, 143 byte

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

Phiên bản Ungolfed:

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
Chào mừng bạn đến với Câu đố lập trình và Code golf! Có một số cách để rút ngắn đáng kể mã của bạn, vì vậy đây là một vài cách. 1) Hầu như tất cả các khoảng trắng trong JavaScript là không cần thiết, 2) bạn không cần vartừ khóa và 3) các câu lệnh có thể được phân tách bằng dấu chấm phẩy hoặc dòng mới, vì vậy bạn không cần cả hai. Để biết các mẹo tổng quát hơn, hãy xem Mẹo chơi gôn trong JavaScript .
NinjaBearMonkey 17/08/2015

2

R, 144 byte

Mới chơi golf, R, và trang này. Vì vậy, ở đây đi:

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

Tôi không biết R nhưng tôi cá là bạn có thể thoát khỏi khoảng trắng.
undergroundmonorail

@undergroundmonorail bạn nói đúng, R không thực sự sử dụng khoảng trắng. Tôi vừa mới viết nó như thế để làm cho nó đẹp hơn để xem = P kích thước của tệp không có khoảng trắng là 144 byte, tôi không chắc nên đặt số nào để đặt mã thấp nhất tôi có thể đặt mã đó vào.
một chiếc gối mềm

Ồ, được thôi :) Đối với hồ sơ, thông thường nên đăng mã chính xác mà bạn đã sử dụng cho điểm của mình, chỉ để dễ xác minh nhất có thể, mặc dù mọi người thường bao gồm các phiên bản "không được chỉnh sửa" để dễ đọc hơn. Phạm vi của phạm vi không xác định từ việc thêm thụt lề và dòng mới, đến đổi tên các biến, để trừu tượng hóa các đoạn mã thành các hàm và thường làm cho mã sạch hơn. Không có điều gì là bắt buộc, nhưng nó vẫn ổn miễn là có phiên bản chơi gôn hoàn chỉnh.
undergroundmonorail

1

C #, 110 byte

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

Chào mừng đến với PPCG! Vui lòng bao gồm mã chính xác mà bạn đã đếm trong câu trả lời của mình để mọi người có thể dễ dàng kiểm tra điểm của bạn (có vẻ như bạn đã đếm mã mà không có khoảng trắng không cần thiết). Bạn luôn có thể bao gồm một phiên bản không được đọc / có thể đọc được thêm vào đó.
Martin Ender
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.