Sinonim Format Turnamen

17

Saya menghabiskan semua hari ini di turnamen Super Smash Bros., dan saya mulai memikirkan beberapa terminologi yang kami gunakan ketika mendeskripsikan set. Ini adalah tiga jenis set yang saya lihat dimainkan di turnamen:

  • Terbaik dari 3 (Bo3)
    • Tiga game dimainkan. Pemenang set adalah pemain yang memenangkan sebagian besar game.
    • Jika seorang pemain tunggal memenangkan dua pertandingan set, mereka langsung dinyatakan sebagai pemenang, karena tidak mungkin bagi lawan untuk mengejar ketinggalan.
  • Best of 5 (Bo5)
    • Lima pertandingan dimainkan. Pemenang set adalah pemain yang memenangkan sebagian besar game.
    • Jika seorang pemain tunggal memenangkan tiga pertandingan set, mereka langsung dinyatakan sebagai pemenang, karena tidak mungkin bagi lawan untuk mengejar ketinggalan.
  • Pertama hingga 5 (Ft5)
    • Oke, saya sedikit curang dengan kata-kata saya tadi. Set semacam ini bukan bagian dari turnamen, tetapi Anda akan sering melihat mereka terjadi di venue. Ini secara tradisional merupakan jenis set yang akan Anda mainkan jika Anda telah menantang pemain lain dan uang ada di telepon.
    • Sesederhana kedengarannya: Para pemain berulang kali bermain game sampai salah satu dari mereka telah memenangkan lima, dan pemain itu dinyatakan sebagai pemenang.

Jelas, Bo3 dan Bo5 sangat mirip, hanya berbeda dalam jumlah game yang dimainkan. Tapi Ft5 jelas berbeda ... kan? Tidak juga! Tidak peduli bagaimana set Bo3 turun, pemenang akan memenangkan tepat dua pertandingan. Pemenang set Bo5 akan memenangkan tepat 3 game. Mengapa tidak memanggil mereka Ft2, atau Ft3? Logika yang sama, diterapkan secara terbalik, akan menunjukkan bahwa Ft5 persis sama dengan Bo9.

Tujuan dari tantangan ini adalah untuk menentukan sinonim dari format yang ditetapkan.

Spesifikasi

Program atau fungsi Anda akan mengambil satu string dari input . Dua karakter pertama akan Boatau Ft, dan mereka akan diikuti oleh angka. Program / fungsi akan menampilkan string dengan awalan yang berlawanan dan angka sehingga string input dan output berarti hal yang sama.

Setiap string yang dimulai dengan Boakan berakhir dalam angka ganjil.

Anda dapat berasumsi bahwa angka dalam string input tidak akan pernah lebih besar dari 200. Anda juga dapat mengasumsikan bahwa Anda tidak akan pernah menerima input yang outputnya benar akan mencakup angka lebih besar dari 200. Demikian juga, input dan nomor output yang benar akan selalu lebih besar dari 0.

Contohnya

Bo3 -> Ft2
Ft2 -> Bo3

Bo5 -> Ft3
Ft3 -> Bo5

Bo9 -> Ft5
Ft5 -> Bo9

Bo51 -> Ft26
Ft26 -> Bo51

Bo199 -> Ft100
Ft100 -> Bo199
monmon bawah tanah
sumber
2
Golf kode dan jarak dekat? Kita bisa jadi teman! Kecuali jika Anda berbicara tentang SSB
ak yang
2
@ ak. tentu saja melee;)
undergroundmonorail
frikin meleetists ...
Nacht - Reinstate Monica
1
@ ak. Tidak ada yang salah dengan proyek m; (
Cilan
1
@ Doorhandle kecuali secara hukum. RIP
undergroundmonorail

Jawaban:

10

Pyth, 23 byte

@,/hKsttz2tyKCp-"BoFt"z

Suite uji.

Bagaimana itu bekerja:

Pertama, untuk menemukan Boatau Ft, program menyaring karakter dalam input dari BoFt, dengan -"BoFt"z.

Ini segera dicetak dengan p. pjuga mengembalikan inputnya. String itu dikonversi ke angka yang menerjemahkan byte sebagai basis 256. Hasilnya adalah 17007 jika string itu Bo, dan 18036 jika string itu Ft.

Selanjutnya, itu menghitung hasil yang mungkin, num * 2 - 1dan (num + 1)/2dan menempatkan ini dalam daftar entri 2. Kemudian, program mengindeks ke dalam daftar itu dengan angka di atas, 17007 atau 18036. Karena pengindeksan modular Pyth, ini memilih nomor yang tepat. Hasilnya kemudian dicetak secara otomatis.

Karena pcetakan tanpa baris tambahan, tetapi pencetakan tersirat memiliki baris tambahan, dua cetakan berturut-turut keluar dalam format yang tepat.

isaacg
sumber
13

Python 2, 59

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

Dalam tantangan singkat di mana fungsi diizinkan, singkatnya lambdabiasanya menang bahkan ketika kode harus berulang karena ketidakmampuan untuk menetapkan variabel.

Kami memeriksa kasus mana yang kami gunakan dengan perbandingan string s>'C'. Kemudian, dapatkan awalan yang tepat dengan trik daftar slicing 'FBto'[s>'C'::2].

Untuk mendapatkan nomor, kita harus mengevaluasi karakter di luar yang kedua dan melakukan salah satu *2+1atau /2-1ke sana. Kami melakukan ini dengan menempelkan salah satu dari dua ekspresi itu sebagai string, sekali lagi dipilih dengan mengiris daftar, mengevaluasi hasilnya, dan mengubah angka itu menjadi string.

Sunting: Disimpan satu arang (59):

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

Bahkan tidak bertanya ...

Tidak
sumber
2
Anda dapat menetapkan variabel di dalam lambdas. Contoh: lambda a:(lambda b:b*b)(a+3). Namun tidak terlalu pendek.
orlp
8

C ++ 11 Templat Metaprogramming, 305 byte

Sunting: Dapatkan 100 byte lagi

Apakah saya mendapatkan cacat apa pun untuk pilihan bahasa saya? : 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'>{};

Contoh:

#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() {}
Chris Beck
sumber
6

CJam, 29 byte

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

Cobalah online

Tidak ada yang rumit di sini. Menghitung dua hasil yang mungkin, dan memilih satu dari dua berdasarkan huruf pertama dalam input. Akan diperbarui jika saya menemukan sesuatu yang lebih baik.

Penjelasan:

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.
Reto Koradi
sumber
6

CJam, 27 byte

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

Ini memanfaatkan fakta bahwa 'B' ^ 'F' == 4dan 'o' ^ 't' == 27.

Cobalah online di juru bahasa CJam .

Dennis
sumber
5

Javascript (ES6), 50 47 karakter

Solusi yang sangat sederhana: (Terima kasih kepada undergroundmonorail untuk menghapus satu byte!)

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

Tidak Disatukan:

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

Untuk sekali jawaban saya hanya ~ 2x panjang jawaban Pyth terbaik!

Produksi ETH
sumber
Saya menyebutkan hal ini dalam obrolan, tetapi Anda harus bisa mengganti y/2+.5dengan -~y/2untuk menyimpan byte.
undergroundmonorail
@undergroundmonorail Terima kasih atas tipnya! BTW, saya suka tantangan ini karena sederhana dibandingkan dengan kebanyakan tantangan, jadi jawaban saya ternyata jauh lebih pendek dari biasanya.
ETHproduksi
4

Haskell, 69 byte

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

Cukup lurus ke depan.

Lynn
sumber
3

Pyth - 31 byte

Cukup sederhana, menggunakan zip dan pengindeksan modular untuk beralih. Perhitungan sebenarnya sangat mudah.

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

Suite uji .

Maltysen
sumber
3

Julia, 63 byte

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

Tidak Disatukan:

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
Alex A.
sumber
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)]

Contoh:

>> f('Ft5')
ans =
Bo9
>> f('Bo51')
ans =
Ft26
Luis Mendo
sumber
3

Powershell, 111

Keunikan PowerShell dan tanda kurung yang diperlukan adalah kejatuhannya lagi. Bahkan bermain golf .Substring(0,2)untuk [0..1]-join''hanya menyimpan masing-masing 2 byte, dan beberapa byte lainnya disimpan dengan Elseterima kasih secara tersirat pada exitperintah. Baiklah. Penyegaran yang baik untuk memisahkan string.

Kode:

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

Pemakaian:

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

Penjelasan

$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
AdmBorkBork
sumber
3

Perl 5, 38 byte (37 +1 untuk -p )

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

Pemakaian : simpan sebagai 54768.pl dan jalankan sebagai:

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

atau secara interaktif:

perl -p 54768.pl
Bo199
# Ft100
Dom Hastings
sumber
-ptersirat -n. Anda tidak perlu keduanya.
Dennis
@ Dennis, memang saya tidak! Terima kasih!
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.)

Pembaruan

  1. Mengetuk beberapa byte dengan beralih dari pencocokan pola ke sederhana if ... then ...
Psytronic
sumber
3

Ruby, 82 Bytes

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

Dipanggil dengan argumen untuk menjatuhkan beberapa byte.
Posting pertama, saran diterima. :)

EDIT: Singkirkan 12 byte dengan mengubah matematika saya. Karena bilangan Bo ganjil, mereka akan selalu memiliki desimal setelah membaginya dengan 2, artinya saya bisa memotong dan menambahkan 1 alih-alih menggunakan ceiluntuk mengumpulkan.

HuggableSquare
sumber
Anda dapat menyimpan dua byte dengan menghapus spasi setelahnya puts.
ProgramFOX
@ProgramFOX tidak tahu bagaimana saya melewatkannya, terima kasih. juga, saya entah bagaimana berhasil mengacaukan suntingan tetapi saya pikir itu sudah diperbaiki sekarang, haha.
HuggableSquare
Kami mengedit pos pada saat yang sama, yang menyebabkan konflik edit. Karena Anda mengirimkannya nanti, hasil edit Anda menimpa milikku. Saya tahu, edit konflik agak rumit: P
ProgramFOX
3

PHP, 85 79 75 Bytes

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


Penggunaan:
Panggil skrip dengan argumen:php -d error_reporting=0 script.php Bo5

jrenk
sumber
3

Tidak terlalu pendek seperti yang lain, tapi itu posting pertama saya:

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

Versi Tidak Serigala:

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);
Nautilus
sumber
7
Selamat datang di Programming Puzzles dan Code golf! Ada beberapa cara untuk memperpendek kode Anda, jadi inilah beberapa. 1) Hampir semua spasi putih dalam JavaScript tidak diperlukan, 2) Anda tidak perlu varkata kunci, dan 3) pernyataan dapat dipisahkan dengan tanda titik koma atau baris baru, jadi Anda tidak perlu keduanya. Untuk tips yang lebih umum, lihat Tips untuk bermain golf di JavaScript .
NinjaBearMonkey
2

R, 144 byte

Baru mengenal kode golf, R, dan situs ini. Jadi begini:

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)}
bantal yang lembut
sumber
Saya tidak tahu R tapi saya yakin Anda bisa menyingkirkan spasi.
undergroundmonorail
@undergroundmonorail Anda benar, R tidak benar-benar menggunakan spasi putih. Saya baru saja menulis seperti itu untuk membuatnya lebih bagus untuk melihat = P ukuran file tanpa spasi adalah 144 byte, saya tidak yakin nomor mana yang harus dimasukkan, jadi saya meletakkan yang terendah yang bisa saya masukkan ke dalam kode itu.
bantal lembut
Oh, oke :) Sebagai catatan, umumnya lebih baik memposting kode persis yang Anda gunakan untuk skor Anda, hanya untuk membuatnya semudah mungkin untuk memverifikasi, meskipun orang sering menyertakan versi "ungolfed" untuk membuatnya lebih mudah dibaca. Luasnya kisaran unungolfing dari menambahkan lekukan dan baris baru, untuk mengubah nama variabel, untuk mengabstraksi potongan kode menjadi fungsi dan umumnya membuat kode lebih bersih. Tidak ada yang diperlukan, tetapi tidak apa-apa asalkan versi yang sepenuhnya golf ada.
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);}
Kols
sumber
Selamat datang di PPCG! Harap sertakan kode persis yang Anda hitung dalam jawaban Anda sehingga orang dapat dengan mudah memeriksa skor Anda (tampaknya Anda telah menghitung kode tanpa spasi kosong yang tidak perlu). Selain itu, Anda selalu dapat menyertakan versi tanpa tanda baca / dapat dibaca.
Martin Ender