トーナメント形式の同義語


17

今日はすべてをスーパースマッシュブラザーズトーナメントで過ごし、セットを説明するときに使用する用語の一部について考え始めました。これらは、トーナメントでプレイされる3種類のセットです。

  • ベストオブ3(Bo3)
    • 3つのゲームがプレイされます。このセットの勝者は、ゲームの大半を獲得したプレーヤーです。
    • 1人のプレイヤーがセットの2ゲームに勝った場合、相手が追いつくことは不可能なので、すぐに勝者と宣言されます。
  • ベストオブ5(Bo5)
    • 5つのゲームがプレイされます。このセットの勝者は、ゲームの大半を獲得したプレーヤーです。
    • 1人のプレイヤーがセットの3ゲームに勝った場合、相手が追いつくことは不可能なので、すぐに勝者と宣言されます。
  • 最初の5(Ft5)
    • さて、以前の文言で少しごまかしました。この種のセットはトーナメントの一部ではありませんが、多くの場合、会場で開催されます。これは伝統的に、他のプレイヤーに挑戦してお金が出ている場合にプレイする種類のセットです。
    • 簡単なことです。プレーヤーは、ゲームの1つが5つ勝つまで繰り返しプレイし、そのプレーヤーが勝者と宣言されます。

明らかに、Bo3とBo5は非常に似ており、プレイされるゲームの数のみが異なります。しかし、Ft5は明らかに違います...そうですか?あんまり!Bo3セットがどのようにダウンしたとしても、勝者はちょうど2つのゲームに勝ったことになります。Bo5セットの勝者は、正確に3ゲーム勝ちました。なぜFt2またはFt3と呼ばないのですか?逆に適用された同じロジックは、Ft5がBo9とまったく同じであることを示します。

この課題の目的は、セット形式の同義語を判別することです。

仕様

プログラムまたは関数はinputから単一の文字列を取得します。最初の2文字は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。もちろん乱闘;)
地下

frikin meleetists ...
モニカを

1
@aks。プロジェクトmには何も問題はありません;(
Cilan

1
合法的に話すことを除いて@doorhandle。RIP-
地下

回答:


10

Pyth、23バイト

@,/hKsttz2tyKCp-"BoFt"z

テストスイート。

使い方:

まず、見つけるためにBoまたはFtプログラムがからの入力中の文字をフィルタリングし、BoFtで、-"BoFt"z

これはすぐに印刷されpます。p入力も返します。その文字列は、バイトをベース256と解釈する数値に変換されます。文字列がの場合、結果は17007 Boになり、文字列がの場合、18036になりますFt

次に、それは両方の可能な結果を計算し、num * 2 - 1そして(num + 1)/22エントリーリストでこれを置きます。次に、プログラムは、上記の番号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番目以降の文字を評価し、次のいずれ*2+1かを実行する必要があります/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バイトオフ

言語の選択に何らかのハンディキャップはありますか?: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*(+?

オンラインで試す

ここではあまり詳しく説明しません。2つの可能な結果を​​計算し、入力の最初の文字に基づいて2つのうちの1つを選択します。もっと良いものを思いついたら更新します。

説明:

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.


5

Javascript(ES6)、50 47文字

非常に簡単な解決策:(1バイトを削除してくれたundergroundmonorailに感謝!)

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ヒントをありがとう!ところで、私はこのチャレンジが好きです。なぜなら、それはほとんどのチャレンジに比べて簡単だからです。そのため、私の答えはいつもよりずっと短くなりました。
ETHproductions

4

Haskell、69バイト

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

合理的です。


3

Pyth-31バイト

非常にシンプルで、zipとモジュラーインデックスを使用してスイッチを取得します。実際の計算は本当に簡単です。

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

Powershell、111

PowerShellの言葉遣いと必要な括弧は、再びその没落です。でゴルフをしてい.Substring(0,2)ても、[0..1]-join''それぞれ2バイトしか節約できずElseexitコマンドのおかげで暗黙のうちに数バイト節約できます。しかたがない。文字列の分離に関する優れたリフレッシャー。

コード:

$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ます。両方は必要ありません。
デニス

@デニス、確かに私はしません!ありがとうございました!
ドムヘイスティングス

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バイトを取り除きました。Boの数値は奇数であるため、2で除算した後は常に小数になります。つまり、切り上げるために使用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、Rは本当に空白を使用していません。= Pを見やすくするためにそのように書いたところです。空白のないファイルのサイズは144バイトです。どの数字を入れるかわからなかったので、そのコードに合う最小の数字を入れました。
柔らかい枕

ああ、大丈夫です:)記録のために、スコアに使用した正確なコードを投稿するのが一般的に望ましいです。ただ、確認をできるだけ簡単にするためだけです。アンゴルフの範囲は、インデントと改行の追加、変数の名前の変更、コードチャンクの関数への抽象化、一般にコードのクリーン化までに及びます。いずれも必須ではありませんが、完全にゴルフされたバージョンがあれば問題ありません。
地下

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へようこそ!回答にカウントした正確なコードを含めてください。そうすれば、人々は簡単にスコアを確認できます(不要な空白なしでコードをカウントしたようです)。それに加えて、いつでも未使用/読み取り可能なバージョンを含めることができます。
マーティンエンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.