Несколько месяцев назад у меня был этот вопрос в качестве загадки перед собеседованием. Недавно, когда я размышлял о материалах блога, он показался мне хорошим примером для функционального решения проблемы. Я опубликую свое решение, как только я закончу писать в своем блоге.
ПРИМЕЧАНИЕ. Этот вопрос был задан в StackOverflow год назад и был отклонен после нескольких (неправильных) ответов. Я предполагаю, что это было понижено для того, чтобы быть очевидным интервью или домашним заданием. Наши ответы должны быть написаны достаточно глубоко, чтобы кто-то не задумывался об их использовании!
В гонке вы делаете ставки, используя следующую стратегию. Каждый раз, когда вы проигрываете ставку, вы удваиваете значение ставки для следующего раунда. Всякий раз, когда вы выигрываете, ставка на следующий раунд будет один доллар. Вы начинаете раунд, ставя один доллар.
Например, если вы начнете с 20 долларов и выиграете ставку в первом раунде, потеряете ставку в следующих двух раундах, а затем выиграете ставку в четвертом раунде, вы получите 20 + 1-1-2 +4 = 22 доллара.
Ожидается, что вы завершите функцию g
, которая принимает два аргумента:
- Первый аргумент - это целое число,
a
которое представляет собой начальные деньги, которые мы получаем, когда начинаем делать ставки. - Второй аргумент - это строка
r
. I-ый символ результата будет либо «W» (победа), либо «L» (проигрыш), обозначая результат i-го раунда.
Ваша функция должна возвращать сумму денег, которую вы будете иметь после всех раундов.
Если в какой-то момент на вашем счету недостаточно средств для покрытия стоимости ставки, вы должны остановиться и вернуть сумму, которая у вас есть на данный момент.
Пробный прогон
1st round - Loss: 15-1 = 14
2nd round - Loss: 14-2 = 12 (Bet doubles)
3rd round - Loss: 12-4 = 8
4th round - Win: 8 + 8 = 16
5th round - Loss:16-1 = 15 (Since the previous bet was a win, this bet has a value of 1 dollar)
6th round - Loss: 15-2 = 13
7th round - Loss: 13-4 = 9
8th round - Loss: 9-8 = 1
Функция возвращает 1
в этом случае
Победитель определяется по наименьшему количеству символов ВНУТРИ определения подразумеваемой функции. Сотрудничайте по языку, если хотите. Я знаю, что мой может быть улучшен!
Ответы:
GolfScript, 33 символа
Примеры ( онлайн ):
Аннотированный код:
источник
Python 2,
726862 байтаНазовем это так:
g(15,'LLLWLLLL')
.Это просто перебирает строку, изменяя ценность денег, которые мы основали на персонаже.
Вот пример программы, которая запускает тесты для этой функции:
Образец вывода:
С небольшими изменениями в тестере мы можем получить среднюю прибыль по многим прогонам:
Пример вывода (это заняло довольно много времени, так как мы вызываем функцию
5000000
раз):Редактировать: Спасибо Говарду и Дэнни за дальнейшую игру в гольф.
РЕДАКТИРОВАТЬ: теперь программа проверяет, достаточно ли денег, чтобы сделать ставку. Это на самом деле экономит байты.
источник
c=='L'
наc<'W'=
. Вы также можете написать,b,n=((n,1),(-n,2*n))[c<'W']
что сэкономит вам больше символов (if a<-b:break
,a+=b
).b,n=
хитрость (с[
s снаружи), но Python жаловался. Давай еще раз попробуем.if n<=a
сэкономит ли вам немного чар, потому что тогда вам не придетсяbreak
?R, 95 символов
Отступ:
Использование:
источник
J -
6355 символовТеперь с добавленным бонусом неточность! Это даже точно так же долго, как и раньше.
Принимает начальную сумму денег в качестве левого аргумента и полосу выигрышей / проигрышей справа.
Объяснение: Программа распадается равномерно на что-то вроде композиции из двух функций, обе из которых подробно описаны ниже. Первый превращает полосу выигрыша / проигрыша в значения ставок с соответствующим знаком, а затем второй фактически вычисляет ответ с учетом начальных денег и этой преобразованной полосы выигрыша / проигрыша.
Обратите внимание, что мы добавляем деньги к ставкам, прежде чем принимать частичные суммы, но добавляем бесконечную ставку в конец списка значений ставок. Это то, что смещает значение превышения счета следующей ставки, а использование бесконечности позволяет нам всегда использовать последний элемент в качестве универсального.
Использование:
источник
2 LW
. К сожалению, после первого проигрыша у вас недостаточно денег, чтобы делать ставки во втором заезде.14 f 'LLWLLLLWWLWWWLWLWW'
мы получаем следующую последовательность:14, 13, 11, 15, 14, 12, 8, 0,..
у0
нас недостаточно денег для участия в торгах, поэтому программа должна выводить0
.JavaScript (ECMAScript 6 Draft) -
625150 символов (в теле функции)Определяет рекурсивную функцию
g
с двумя аргументами:a
- текущая сумма денег у вас есть; иr
- череда побед / поражений.И два необязательных аргумента:
t
- индекс текущего раунда торговли (изначально0
)b
- сумма денег за текущую ставку (опять же изначально1
).Ungolfed:
JavaScript (ECMAScript 6) -
615854 символа (в теле функции)Объяснение:
тесты
источник
b=1,r.split('').map(
на[b=1].map.call(r,
(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)
a>=b&&(c=r[t])?g((c=c>'L')?a+b:a-b,r,t+1,c||2*b):a
Python, 74 байта
Я определил функцию g, которая принимает (сумму денег, которую вы имеете на старте) и r (которая является результатом ставок). Она инициализирует сумму первой ставки на 1. Затем для каждого результата ставок, если он выигрыш («W» в r) вы получаете деньги, а ставка возвращается к 1. В противном случае вы теряете сумму ставки, а сумма следующей ставки удваивается. Наконец он возвращает деньги, которые у вас есть. Вы можете использовать это так:
Я думаю, что это может быть в дальнейшем.
источник
C, 107 знаков
Я использую рекурсивную функцию здесь, потому что в большинстве случаев реализация короче. Но я не совсем уверен, так ли это, потому что мне нужно было создать дополнительную функцию-обертку, чтобы моя функция фактически принимала только 2 аргумента. Третий аргумент в функции
f
необходим для текущей ставки (аккумулятора).Без функции-обертки это решение было бы длиной всего 73 символа, но вам нужно было бы передать дополнительный параметр со значением 1 (начальная ставка), чтобы получить правильный результат.
ungolfed:
источник
С, 90
источник
Javascript, 63
Образцы прогонов:
JSFiddle с ведением журнала
Ungolfed:
источник
Javascript ( ES5 )
696460 байт внутри функцииВариация: ( одинаковая длина )
Контрольные примеры: ( взяты из решения планнапа )
источник
g(20,'WLLW')
возвращает 25 в моей консоли FireFox -for...in
цикл выбирает три дополнительных свойства в строке и перебирает их.22
в консоль. Думая, может быть, какой-то сайт, на котором вы работаете, когда у вас открыта консоль, изменилString
прототип. Я знаю, что stackexchange его модифицирует и добавляет три дополнительные функции.Хаскелл, 62
или с именами обоих аргументов (65 символов):
Обратите внимание, что
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):источник
Python 2 - 65 байт
Сейчас побежден лучшим на сегодняшний день решением Python, но я не могу не поделиться им:
Как и некоторые другие решения Python, я использую аргументы функции для объявления
b
вне определения функции, но так как функция рекурсивна, это на самом деле служит не только игре в гольф.Мне также нужно было изменить порядок аргументов функции, чтобы кортеж распаковывался в аргументы функции .
В случае, если вам интересно,
r>"">a>=b
это сокращение отr and a>=b
.источник
Ruby,
7664 (в теле функции) байтаРЕДАКТИРОВАТЬ: улучшить ответ, удалив 3 байта:
используя func (82 байта):
используя лямбду (76 байт):
бег :
источник
C #, 74 символа внутри метода
Моя самая первая попытка на этом сайте ...
Или, более читабельно:
Довольно наивно, не так уж много трюков ... в основном, используя преимущества порядковых чисел и числовых. Сохранение нескольких персонажей путем постороннего зацикливания, когда у игрока заканчиваются деньги.
источник
Golfscript,
51413635 байтВнутренняя функция
Это предполагает, что мы начинаем с положительной суммы денег и что строка выигрыша проигрыша будет непустой, чтобы можно было сделать хотя бы одну ставку.
пример
дает
Попробуйте онлайн.
источник
C #, 123
.NET Fiddle
Сообщение в блоге, объясняющее
источник
Java, 95 байт (внутренняя функция)
Попробуйте онлайн!
источник
Рубин, 84 персонажа
Тот же подход, что и в моем другом ответе на C, но я хотел попробовать ruby для Code-Golfing. Преимущество версии C в том, что мне не нужно создавать функцию-оболочку, я могу просто использовать значения по умолчанию для параметров.
источник
К, 76
,
источник
Питон, 86
Я знаю, что это далеко не самое короткое решение, но я хотел продемонстрировать другой подход, который повторяет серии потерь, а не отдельные ставки.
int(bin(a)[3:],2)
дает целое число с наиболее значимым битом в двоичном представленииa
удаленного, которое представляет собой сумму денег, которую человек будет иметь после потери увеличивающихся способностей 2, пока он или она не сможет больше не делать ставки, потому что a в настоящее время на 1 выше, чем его или ее фактическая сумма денег. Эта версия предполагает, что начальный капитал положительный.источник
С -
6459 (внутренняя функция)Еще один С ответ. Он использует тот факт, что значение переменной остается в стеке. Так что это моя ошибка с некоторыми компиляторами, но она работала правильно везде, где я тестировал. Кроме того, я взял
%2
из TIA, чтобы спасти персонажа. Сожалею!источник
Партия - 212
Пример -
источник
Japt , 38 байт
Попытайся
Наверное, нужно немного поиграть в гольф :) Но похоже, чтобы получить правильные результаты.
НОТА Это полная программа, которую легко превратить в функцию путем добавления
UV{
. Количество байтов внутри функции будет одинаковым.Transpiled JS объяснил:
источник
PowerShell ,
6881 байтПопробуйте онлайн!
Эта задача требует очень неловких заданий, а это означает, что я не смог собрать одно большое обновление. Он использует тот факт, что «W» равно 87 в ASCII, а «L» равно 76, так что изменение по 2 дает вам доступ к простым значениям true / false.
|% t*y
является стандартным ярлыком toCharArray, и обновление ставки с использованием деления оказалось самым дешевым способом, который я мог найти (делит его либо на половину при проигрыше (удваивая его), либо делит его сам на выигрыш (устанавливая его в 1) ).Плюс много байтов, потому что я пропустил ограничение. Будет работать над игрой в гольф
источник
05AB1E , 19 байтов
Port of @Howard 's GolfScript answer , так что не забудьте также поддержать его!
Обратите внимание, что 05AB1E не имеет функций, поэтому это полная программа.
Сначала берется строка ввода, а затем целочисленный (строка с новой строкой в STDIN).
Попробуйте онлайн или проверьте еще несколько тестов .
Объяснение:
источник