Synonimy formatu turnieju

17

Cały dzisiejszy dzień spędziłem na turnieju Super Smash Bros. i zacząłem myśleć o niektórych terminologiach, których używamy przy opisywaniu zestawów. Są to trzy rodzaje zestawów, które widzę w turniejach:

  • Best of 3 (Bo3)
    • Rozgrywane są trzy gry. Zwycięzcą seta jest gracz, który wygrał większość gier.
    • Jeśli pojedynczy gracz wygra dwie gry z zestawu, natychmiast zostaje ogłoszony zwycięzcą, ponieważ przeciwnik nie byłby w stanie go dogonić.
  • Best of 5 (Bo5)
    • Gra się w pięć gier. Zwycięzcą seta jest gracz, który wygrał większość gier.
    • Jeśli pojedynczy gracz wygra trzy gry z zestawu, natychmiast zostaje ogłoszony zwycięzcą, ponieważ przeciwnik nie byłby w stanie go dogonić.
  • Pierwszy do 5 (Ft5)
    • Okej, wcześniej trochę oszukiwałem. Tego rodzaju zestaw nie jest częścią turnieju, ale często można zobaczyć, jak dzieje się na miejscu. Jest to tradycyjny zestaw, w który zagrasz, jeśli rzucisz wyzwanie innemu graczowi, a pieniądze są na linii.
    • To tak proste, jak się wydaje: gracze wielokrotnie grają w gry, dopóki jeden z nich nie wygra pięciu, a ten gracz zostanie ogłoszony zwycięzcą.

Oczywiście Bo3 i Bo5 są bardzo podobne, różnią się jedynie liczbą rozegranych gier. Ale Ft5 jest wyraźnie inny ... prawda? Nie całkiem! Bez względu na to, jak spadnie zestaw Bo3, zwycięzca wygra dokładnie dwie gry. Zwycięzca zestawu Bo5 wygra dokładnie 3 gry. Dlaczego nie nazwać ich Ft2 lub Ft3? Ta sama logika zastosowana w odwrotnej kolejności pokazuje, że Ft5 jest dokładnie taki sam jak Bo9.

Celem tego wyzwania jest określenie synonimu ustawionego formatu.

Specyfikacja

Twój program lub funkcja pobierze pojedynczy ciąg znaków z wejścia . Pierwsze dwa znaki to Bolub Ft, a po nich będzie liczba. Program / funkcja wyświetli ciąg z przeciwnym prefiksem i liczbą taką, że ciągi wejściowe i wyjściowe oznaczają to samo.

Każdy ciąg zaczynający się od Bokończy się nieparzystą liczbą.

Możesz założyć, że liczba w ciągu wejściowym nigdy nie będzie większa niż 200. Możesz również założyć, że nigdy nie otrzymasz danych wejściowych, dla których poprawne dane wyjściowe zawierałyby liczbę większą niż 200. Podobnie, liczby wejściowe i prawidłowe dane wyjściowe zawsze być większe niż 0.

Przykłady

Bo3 -> Ft2
Ft2 -> Bo3

Bo5 -> Ft3
Ft3 -> Bo5

Bo9 -> Ft5
Ft5 -> Bo9

Bo51 -> Ft26
Ft26 -> Bo51

Bo199 -> Ft100
Ft100 -> Bo199
podziemny monorail
źródło
2
Kod do golfa i walki w zwarciu? Mogliśmy być przyjaciółmi! Chyba że mówisz o gorszej SSB
aks.
2
@aks. oczywiście walka wręcz;)
metro
frikin meleetists ...
Nacht - Przywróć Monikę
1
@aks. Nie ma nic złego w projekcie m; (
Cilan
1
@doorhandle oprócz prawnie mówiącego. RIP
metro

Odpowiedzi:

10

Pyth, 23 bajty

@,/hKsttz2tyKCp-"BoFt"z

Zestaw testowy.

Jak to działa:

Po pierwsze, aby znaleźć Bolub Ft, program odfiltrowuje znaki na wejściu z BoFt, przy pomocy -"BoFt"z.

Jest to natychmiast drukowane za pomocą p. prównież zwraca swój wkład. Łańcuch ten jest konwertowany na liczbę interpretującą bajty jako podstawę 256. Wynik to 17007, jeśli łańcuch był Bo, i 18036, jeśli łańcuch był Ft.

Następnie oblicza oba możliwe wyniki, num * 2 - 1 a (num + 1)/2i kładzie to na liście 2 wejścia. Następnie program indeksuje się do tej listy o powyższym numerze, 17007 lub 18036. Z powodu modułowego indeksowania Pytha, wybiera odpowiedni numer. Wynik jest następnie drukowany automatycznie.

Ponieważ pwydruki nie mają końca nowej linii, ale druk niejawny ma końcową linię nowej linii, dwa kolejne wydruki mają dokładnie odpowiedni format.

isaacg
źródło
13

Python 2, 59

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

W krótkich wyzwaniach, w których funkcje są dozwolone, zwięzłość lambda zwykle wygrywa, nawet jeśli kod musi się powtarzać z powodu niemożności przypisania zmiennych.

Sprawdzamy, w jakim przypadku mamy porównanie ciągów s>'C'. Następnie uzyskaj odpowiedni prefiks za pomocą sztuczki wycinania listy'FBto'[s>'C'::2] .

Aby uzyskać liczbę, musimy ocenić znaki poza sekundą i zrobić jedną z nich *2+1lub /2-1do niej. Robimy to, przyjmując jedno z tych dwóch wyrażeń jako ciągi znaków, ponownie wybrane przez podział listy, ocenę wyniku i przekształcenie tej liczby w ciąg.

Edycja: Zapisano jeden znak (59):

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

Nawet nie pytaj ...

xnor
źródło
2
Ty można przypisać zmienne wewnątrz lambda. Przykład: lambda a:(lambda b:b*b)(a+3). Nie jest to jednak szczególnie krótkie.
orlp
8

Metaprogramowanie szablonów C ++ 11, 305 bajtów

Edycja: Wyłączyłem kolejne 100 bajtów

Czy dostaję jakieś upośledzenie za wybór języka? : 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'>{};

Przykłady:

#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
źródło
6

CJam, 29 bajtów

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

Wypróbuj online

Nie ma tu nic bardzo skomplikowanego. Obliczanie dwóch możliwych wyników i wybieranie jednego z dwóch na podstawie pierwszej litery w danych wejściowych. Zaktualizuje się, jeśli wymyślę coś lepszego.

Wyjaśnienie:

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
źródło
6

CJam, 27 bajtów

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

Wykorzystuje to fakt, że 'B' ^ 'F' == 4i 'o' ^ 't' == 27.

Wypróbuj online w interpretatorze CJam .

Dennis
źródło
5

JavaScript (ES6), 50 47 znaków

Bardzo proste rozwiązanie: (Dzięki podziemnej kolei jednotorowej za usunięcie jednego bajtu!)

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

Nie golfowany:

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

Tym razem moja odpowiedź była tylko ~ 2x dłuższa niż najlepsza odpowiedź Pyth!

ETHprodukcje
źródło
Wspomniałem o tym na czacie, ale powinieneś być w stanie wymienić y/2+.5z -~y/2zapisać bajt.
undergroundmonorail
@undergroundmonorail Dzięki za wskazówkę! BTW, podoba mi się to wyzwanie, ponieważ jest proste w porównaniu do większości wyzwań, więc moja odpowiedź okazuje się znacznie krótsza niż zwykle.
ETHprodukcje
4

Haskell, 69 bajtów

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

Racjonalnie proste.

Lynn
źródło
3

Pyth - 31 bajtów

Całkiem proste, wykorzystuje zip i modułowe indeksowanie, aby uzyskać przełącznik. Rzeczywiste obliczenia są naprawdę łatwe.

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

Zestaw testowy .

Maltysen
źródło
3

Julia, 63 bajty

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

Nie golfowany:

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.
źródło
3

Matlab, 95 bajtów

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

Przykłady:

>> f('Ft5')
ans =
Bo9
>> f('Bo51')
ans =
Ft26
Luis Mendo
źródło
3

PowerShell, 111

Słabość PowerShell i wymagane nawiasy są jego upadkiem. Nawet Gra w golfa The .Substring(0,2)aby [0..1]-join''tylko oszczędza 2 bajty każda, a inna para bajtów zapisywane z domniemanych Elsedzięki exitpoleceniu. No cóż. Dobre odświeżenie separujących łańcuchów.

Kod:

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

Stosowanie:

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

Wyjaśnienie

$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
źródło
3

Perl 5, 38 bajtów (37 + 1 dla -p)

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

Zastosowanie : zapisz jako 54768.pl i uruchom jako:

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

lub interaktywnie:

perl -p 54768.pl
Bo199
# Ft100
Dom Hastings
źródło
-pimplikuje -n. Nie potrzebujesz obu.
Dennis
@Dennis, rzeczywiście nie! Dziękuję Ci!
Dom Hastings,
3

FSharp - 153 143 bajty

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

Aktualizacje

  1. Powalił kilka bajtów, przełączając się z dopasowywania wzorca na prosty if ... then ...
Psytronic
źródło
3

Ruby, 82 bajtów

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

Wywoływany z argumentem, aby zrzucić kilka bajtów.
Pierwszy post, sugestie mile widziane. :)

EDYCJA: Pozbyłem się 12 bajtów, zmieniając moją matematykę. Ponieważ liczby Bo są nieparzyste, zawsze będą miały dziesiętną wartość po podzieleniu przez 2, co oznacza, że ​​mogę po prostu obciąć i dodać 1 zamiast używać ceildo zaokrąglania w górę.

HuggableSquare
źródło
Możesz zapisać dwa bajty, usuwając spację po puts.
ProgramFOX,
@ProgramFOX nie wiem, jak mi tego brakowało, dziękuję. Poza tym w jakiś sposób udało mi się zepsuć zmiany, ale myślę, że teraz jest to naprawione, haha.
HuggableSquare,
Edytowaliśmy post w tym samym czasie, co spowodowało konflikt edycji. Ponieważ przesłałeś później, Twoja edycja zastąpiła moją. Wiem, konflikty edycji są nieco trudne: P
ProgramFOX
3

PHP, 85 79 75 bajtów

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


Użycie:
Wywołaj skrypt z argumentem:php -d error_reporting=0 script.php Bo5

Jrenk
źródło
3

Nie absurdalnie krótki jak inni, ale to mój pierwszy post:

JS, 143 bajty

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

Wersja bez golfa:

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);
Łodzik
źródło
7
Witamy w Programowaniu łamigłówek i golfa Code! Istnieje kilka sposobów znacznego skrócenia kodu, więc oto kilka z nich. 1) Prawie wszystkie białe znaki w JavaScript są niepotrzebne, 2) nie potrzebujesz varsłowa kluczowego, oraz 3) instrukcje można rozdzielić średnikiem lub znakiem nowej linii, więc nie potrzebujesz obu. Aby uzyskać bardziej ogólne wskazówki, zobacz Wskazówki dotyczące gry w golfa w JavaScript .
NinjaBearMonkey
2

R, 144 bajty

Nowość w golfie kodowym, R i tej witrynie. Więc oto idzie:

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)}
miękka poduszka
źródło
Nie znam R, ale założę się, że możesz pozbyć się białych znaków.
undergroundmonorail
@undergroundmonorail masz rację, R tak naprawdę nie używa białych znaków. Właśnie napisałem to w ten sposób, aby ładniej było patrzeć = P rozmiar pliku bez białych znaków wynosi 144 bajty, nie byłem pewien, którą liczbę podać, więc umieściłem najniższą, w której mógłbym zmieścić ten kod.
miękka poduszka
Och, okej :) Dla przypomnienia, na ogół lepiej jest opublikować dokładny kod użyty do oceny, aby ułatwić jak najłatwiejszą weryfikację, chociaż ludzie często dołączają wersje „bez golfa”, aby ułatwić czytanie. Zakres nieugolfowania sięga od dodawania wcięć i znaków nowego wiersza, do zmiany nazw zmiennych, do wyodrębniania fragmentów kodu do funkcji i ogólnie czyszczenia kodu. Nie jest to wymagane, ale jest w porządku, o ile dostępna jest wersja z pełnym golfem.
undergroundmonorail
1

C #, 110 bajtów

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
źródło
Witamy w PPCG! Podaj dokładny kod, który policzyłeś w swojej odpowiedzi, aby inni mogli łatwo sprawdzić Twój wynik (wygląda na to, że policzyłeś kod bez niepotrzebnych białych znaków). Oprócz tego zawsze możesz dołączyć wersję nieoznaczoną / czytelną.
Martin Ender,