토너먼트 형식 동의어


17

나는 오늘 슈퍼 스매쉬 브라더스 토너먼트에서 보냈고, 세트를 설명 할 때 사용하는 몇 가지 용어에 대해 생각하기 시작했습니다. 토너먼트에서 볼 수있는 3 가지 세트는 다음과 같습니다.

  • 3 중 최고 (Bo3)
    • 세 게임이 재생됩니다. 세트의 승자는 대부분의 게임에서이긴 플레이어입니다.
    • 한 명의 플레이어가 두 세트의 게임에서 이기면 상대방이 따라 잡기가 불가능하므로 즉시 승자로 선언됩니다.
  • 5 개 중 최고 (Bo5)
    • 다섯 게임이 재생됩니다. 세트의 승자는 대부분의 게임에서이긴 플레이어입니다.
    • 한 명의 플레이어가 세트에서 3 번의 게임에서 이기면 상대방이 따라 잡기가 불가능하므로 즉시 승자로 선언됩니다.
  • 처음부터 5 (Ft5)
    • 좋아, 나는 내 말로 조금 속임수를 썼다. 이런 종류의 세트는 토너먼트의 일부 가 아니지만 행사장에서 종종 일어나는 것을 볼 수 있습니다. 전통적으로 다른 플레이어에게 도전하고 돈을 지불하면 플레이 할 것입니다.
    • 들리는 것처럼 간단합니다. 플레이어 중 한 명이 5 개를 이길 때까지 플레이어가 반복해서 게임을하고 그 플레이어가 승자로 선언됩니다.

분명히 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. 물론 melee;)
undergroundmonorail

frikin meleetists ...
복원 모니카

1
@aks. 프로젝트 m에는 아무런 문제가 없습니다.;
Cilan

1
합법적으로 말하기를 제외하고 @doorhandle. 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

파이썬 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
람다 안에 변수 할당 있습니다 . 예 : lambda a:(lambda b:b*b)(a+3). 그러나 특히 짧지는 않습니다.
orlp

8

C ++ 11 템플릿 메타 프로그래밍, 305 바이트

편집 : 다른 100 바이트를 벗어났습니다.

내가 선택한 언어에 대해 어떤 종류의 장애가 있습니까? :피

#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

자바 스크립트 (ES6), 50 47 자

매우 간단한 해결책 : (1 바이트를 제거 한 것은 지하 모노레일 덕분입니다!)

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

언 골프 드 :

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

한 번은 내 대답은 최고의 Pyth 답변 길이의 ~ 2 배에 불과했습니다!


나는 채팅이 언급하지만 당신은 대체 할 수있을 것 y/2+.5으로 -~y/2바이트 저장합니다.
undergroundmonorail

@undergroundmonorail 팁 주셔서 감사합니다! BTW, 나는이 도전이 대부분의 도전과 비교하여 간단하기 때문에 좋아하므로 내 대답은 평소보다 훨씬 짧습니다.
ETHproductions

4

하스켈, 69 바이트

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

합리적으로 간단합니다.


3

Pyth-31 바이트

매우 간단합니다. 지퍼 및 모듈 식 인덱싱을 사용하여 스위치를 가져옵니다. 실제 계산은 정말 쉽습니다.

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

테스트 스위트 .


3

줄리아, 63 바이트

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

언 골프 드 :

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 바이트

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

예 :

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

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

@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

루비, 82 바이트

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

몇 바이트를 두드리기 위해 인수와 함께 호출됩니다.
첫 번째 게시물, 제안을 환영합니다. :)

편집 : 내 수학을 변경하여 12 바이트를 제거했습니다. Bo 수는 홀수이므로 항상 2로 나눈 후 10 진수를 사용 ceil합니다. 즉, 반올림하는 대신을 잘라서 1을 더할 수 있습니다 .


뒤에 공백을 제거하여 2 바이트를 절약 할 수 있습니다 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은 실제로 공백을 사용하지 않습니다. 공백없이 파일의 크기가 144 바이트 인 = P를 더 잘 보이게하기 위해 방금 작성했습니다. 어떤 숫자를 넣을지 확실하지 않으므로 해당 코드에 가장 적합한 것을 넣을 수 있습니다.
부드러운 베개

오, 알았어 :) 레코드의 경우, 사람들이 쉽게 읽을 수 있도록 종종 "ungolfed"버전을 포함하기는하지만, 가능한 한 쉽게 확인하기 위해 점수에 사용한 정확한 코드를 게시하는 것이 좋습니다. ungolfing의 범위는 들여 쓰기 및 줄 바꿈 추가, 변수 이름 바꾸기, 코드 덩어리를 함수로 추상화하고 일반적으로 코드를 깨끗하게 만드는 것까지 다양합니다. 그 중 어느 것도 필요하지 않지만, 완전 골프 버전이있는 한 괜찮습니다.
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.