Синонимы формата турнира


17

Я провел весь сегодняшний день на турнире Super Smash Bros. и начал задумываться о терминологии, которую мы используем при описании сетов. Вот три вида сетов, которые я вижу на турнирах:

  • Лучший из 3 (Bo3)
    • Три игры играют. Победителем сета является игрок, выигравший большинство игр.
    • Если одиночный игрок выигрывает две партии сета, он сразу же объявляется победителем, потому что противник не сможет его догнать.
  • Лучший из 5 (Bo5)
    • Пять игр сыграно. Победителем сета является игрок, выигравший большинство игр.
    • Если один игрок выигрывает три партии сета, он сразу же объявляется победителем, потому что противник не сможет его догнать.
  • С первого по 5 (Ft5)
    • Хорошо, я немного изменил своей формулировкой ранее. Подобные сеты не являются частью турнира, но вы часто будете видеть их на месте. Это традиционно тот тип сета, в который вы будете играть, если вы бросили вызов другому игроку, и на кону деньги.
    • Это так просто, как кажется: игроки постоянно играют в игры, пока один из них не выиграет пять, и этот игрок будет объявлен победителем.

Очевидно, 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
Акс.

2
@aks. конечно же рукопашный бой;)
подземный

фрикинс мелеисты ...
Nacht - Восстановить Монику

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)/2и помещает это в списке 2 входа. Затем программа индексирует в этот список с указанным выше номером, 17007 или 18036. Из-за модульной индексации Пита это выбирает правильный номер. Результат затем распечатывается автоматически.

Поскольку при 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+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.


5

Javascript (ES6), 50 47 символов

Очень простое решение: (Спасибо подземному монорельсу за удаление одного байта!)

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

Ungolfed:

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

На этот раз мой ответ был всего ~ 2 раза длиннее лучшего ответа Pyth!


Я упомянул об этом в чате , но вы должны быть в состоянии заменить y/2+.5с , -~y/2чтобы сохранить байты.
подземная

@undergroundmonorail Спасибо за совет! Кстати, мне нравится эта задача, потому что она проста по сравнению с большинством задач, поэтому мой ответ оказывается намного короче, чем обычно.
ETHпродукция

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

Ungolfed:

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 байта каждый, и еще пару байт сохранен с подразумеваемой 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. Вам не нужны оба.
Деннис

@ Денис, действительно нет! Спасибо!
Дом Гастингс

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 байтов, изменив мою математику. Так как числа Бо нечетные, они всегда будут иметь десятичную дробь после деления на 2, что означает, что я могу просто усечь и добавить 1 вместо использования ceilдля округления.


Вы можете сохранить два байта, удалив пробел после 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 байта

Новичок в Code-Golfing, 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! Пожалуйста, включите точный код, который вы подсчитали в своем ответе, чтобы люди могли легко проверить ваш счет (кажется, вы подсчитали код без лишних пробелов). В дополнение к этому вы всегда можете добавить версию для чтения / чтения.
Мартин Эндер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.