Как вы знаете, групповой этап Кубка мира завершен, и с завтрашнего дня лучшие 16 команд начнут нокаут-этап:
- Бразилия (BRA)
- Мексика (MEX)
- Нидерланды (NED)
- Чили (CHI)
- Колумбия (COL)
- Греция (GRE)
- Коста-Рика (CRC)
- Уругвай (URU)
- Франция (FRA)
- Швейцария (SUI)
- Аргентина (ARG)
- Нигерия (NGA)
- Германия (GER)
- Соединенные Штаты (США)
- Бельгия (BEL)
- Алжир (ALG)
На этапе нокаута после каждого матча победитель выходит в следующий раунд, а проигравший идет домой (ничьих нет). Нажмите здесь, чтобы узнать больше о стадии нокаута.
Вы были наняты Golfbet.com, новым веб-сайтом для ставок, потому что вы, как известно, хорошо умеете программировать и делать ставки на спорт. Ваша задача - написать программу или функцию, которая может угадать победителя матча. Конечно, все делают разные догадки, это не имеет значения, если ваши догадки последовательны.
Если вы не хотите угадывать, вы можете использовать следующие догадки:
BRA
BRA
CHI
BRA
COL
COL
URU
GER
FRA
FRA
NGA
GER
GER
GER
ALG
GER
NED
NED
MEX
NED
CRC
CRC
GRE
ARG
ARG
ARG
SUI
ARG
BEL
BEL
USA
- Программа должна выводить одного и того же победителя независимо от порядка команд (победитель матча BRA-CHI должен быть таким же, как и в матче CHI-BRA)
- Если команда проигрывает, она не может играть больше матчей. Это означает, что для матчей, которые не проводятся, вы должны указать это. Например, если ваша программа предполагает, что Бразилия выиграет матч BRA-CHI, CHI-GER должен вернуть «нет результата», потому что Чили не будет играть против Германии. Смотрите ссылку выше для расписания.
Ради простоты вам не нужно иметь дело с бронзовым матчем (но вы, конечно, можете).
Ваша программа или функция принимает в качестве входных данных две строки: трехбуквенный код страны двух команд и возвращает код страны команды-победителя (вы можете использовать стандартный ввод / вывод или два параметра функции / возвращаемое значение). Если указанные две команды не будут играть в соответствии с вашими догадками, вы должны вернуть что-то еще (это может быть что угодно, кроме кодов стран, например, пустая строка, ноль, сообщение об ошибке). Вы можете предположить, что ввод правильный (два разных кода страны, которые есть в списке).
Это в первую очередь код-гольф, поэтому выигрывает самая короткая в байтах программа. Тем не менее, хорошие и хитрые решения также ценны.
Пример (конечно, вы можете сделать свои собственные догадки):
вход: BRA CHI выход: BRA
вход: CHI BRA выход: BRA
вход: CHI GER выход: нет результата
BRA BRA
иHAZ CHEEZBURGER
должен быть обработан должным образом?Ответы:
Python 2.x -
368283Интересный вызов. Конечно, нам нужно получить текущий рейтинг от ФИФА . У Бразилии есть так называемый "12-й человек", поскольку у них есть домашнее преимущество, поэтому вес 12/11.
Советы по сокращению вышеупомянутого приветствуются :-).
Улучшения благодаря @TheRare и @MrLemon
Это приводит к следующим результатам:
Пример звонков:
источник
j
(это всегда ноль). 2.for k
можно записать в одну строку с помощью;
разделителя. 3. Вам не нужен пробел после ключевых слов, таких какtry
илиexcept
4. Вы можете удалить пробелы между скобками и ключевыми словами (a[k]if d[k]>d[k+1]else a[k+1]
действует) 5.for n in 16,8,4,2
6.def f(s):print s in m and m[s]or'no result'
j
, но есть небольшая ошибка форматирования сj+=1
. И вы можете сохранить много символов, перекодировав данные FIFA[15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]
, конечно.С
182 178133 (или 126)Здесь не самая короткая программа, но самая короткая, в которой прогноз может быть легко изменен. Теперь, когда все полуфиналисты известны, я обновляюсь.
Там также есть некоторые изменения в коде. Помимо предложений Денниса в комментариях, программа была преобразована в функцию (так как при повторном чтении это разрешено правилами), и хеширование было сокращено.
Код, 133
Как это устроено
входы
a
иb
хэшируются выражением*a-a[1]%16
до одного символа (*a
это более короткий эквивалентa[0]
). Хеш-результаты для командa
иb
хранятся вh
. Например БРА ЧИ становится@;
. Значения хэширования следующие (подтвержденные полуфиналисты и мой предсказанный чемпион отмечены*
.)t[]
хранит мои прогнозы. Результаты раунда 16 и четвертьфинала теперь известны. Каждая группа из 4 команд упорядочена таким образом, что 1-я и 4-я были выбраны, а 3-я - полуфиналист. Аналогично полуфиналистам, я предсказываю, что 1-й и 4-й будут выбиты, а 3-й полуфиналист будет абсолютным победителем. Если вы не согласны с моими прогнозами, просто измените порядок таблицы.Прогнозы хранятся в палиндромных блоках, чтобы учесть возможность входа пользователя в команды в любом возможном порядке. Порядок ставит команды-победители из каждого набора по 4 в третий матч. Таким образом, в первой группе GRE
E
проиграл CRC, а MEXH
проиграл NED. Это настраивает CRCA
для игры в NEDI
в четвертьфинале без необходимости повторять набор текста. Строка дополняется пробелом между каждой группой из 4 команд / 7 символов, чтобы гарантировать отсутствие вывода для команд, которые не будут играть друг с другом.Победитель каждого возможного матча в каждой группе из 8 символов выглядит следующим образом :
invalid,b,a,a,b,b,a,invalid
. Таким образом, правильный выбор победителя можно сделать, заняв позициюh
вt
AND 2 . К сожалению,strstr
функция не самая простая, так как она возвращает указательp
, поэтому мы должны вычестьp
из нее , чтобыt
получить фактическую позицию.t.
Если совпадение недопустимо (не может быть найденоt
),p
равно нулю, и фразаno result
печатается.Некоторые сомнительные улучшения, 126
2 символа, сохраненные в улучшенном хэш-выражении. К сожалению, для этого требуется, чтобы команды были такими, как показано в тестовой программе под функцией (например,
Bra
вместо того,BRA
что используется в программе выше). Я убедился, что нет способа сделать это с одним оператором, так что 2 оператора и односимвольная константа так же хороши, как и получают. Также обратите внимание, чтоUru
сопоставление сspace
таким альтернативным символом|
необходимо для разделения групп командных кодов.5 символов сохраняются путем исключения
t
и обработки строки предсказания как литерала. Это означает, что невозможно узнать адрес, где хранится строка. Однако, если он не хранится в нуле, нас интересует только то,p&2
что код будет работать, если адрес делится на 4. (Обратите внимание, чтоp
нельзя указывать указатель напрямую как целое число, он должен быть вычтен из другого указателя Я использую указатель,a
поэтомуa
также должен делиться на 4.) Можно быть уверенным, что 32- или 64-битные строки компилятора / архитектуры будут сохранены таким образом. Это работает нормально для меня на GCC / Cygwin, хотя он отказывается компилировать на Visual Studio / Windows.источник
char
и*p
и заменивa[0]
,b[0]
аh[0]
с*a
, b` и*h
. Кроме того, в вопросе говорится, что * если указанные две команды не будут играть в соответствии с вашими догадками, вы должны вернуть что-то еще (это может быть что угодно, кроме кодов стран, например, пустая строка, ноль, сообщение об ошибке) , поэтому вывод результата не будет не требуется, и вы можете заменитьputs(...)
на(p=strstr(t,h))&&puts(p-t&2?a:b)
.a[0]->*a
! Скоро обновлю. Просто интересно, есть ли способ получить доступ к многомерному массиву с одним числом? Я написал эту версию командной строки одинаковой длины (можно сохранить 1 байт с помощью#define
.) Было бы неплохо избежать двойных индексов в этом и подобных случаях:char *p,h[2],*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK";main(int c,char**v){h[0]=v[1][1]*3-v[1][0]*2;h[1]=v[2][1]*3-v[2][0]*2;puts((p=strstr(t,h))?v[1+!(p-t&2)]:"no result");}
h
должен быть завершен нулем, так и должно бытьh[3]
. 2. Если вы установитеp=v[1]
, вы можете получить доступv[i][j]
какp[4*(i-1)+j]
. Он работает на моей машине, но я не знаю, переносим ли он ... 3. Вы должны иметь возможность инициализировать,h
если объявите его внутриmain
:main(int c,char**v){char*t="-LgRrRgL bA9j9Ab hp535ph OKYtYKO KpAgApK",*p=v[1],h[3]={p[1]*3-*p*2,p[5]*3-p[4]*2};(p=strstr(t,h))&&puts(v[1+!(p-t&2)]);}
for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])
повторяет evey печатный символ командной строки в VS, но в GCC имя программы в 0, первый аргумент в 40, а второй аргумент нигде не видно (я поднялся до 1000.) Любопытно. В любом случае, я изменил функцию, которая находится в рамках правил, в дополнение к обновлению моих прогнозов (я просто ждал результатов сегодняшнего вечера, чтобы подтвердить их, прежде чем публиковать их). Еще раз спасибо и удачи Бразилии против во вторник.JavaScript
215 206 120116Много возможностей для улучшения:
ES5 - 215
ES6 - 206
Подход Regex - 116
Спасибо ɐɔıʇǝɥʇuʎs за размещение этой ссылки , это помогло мне сделать регулярное выражение
источник
split(' ')
вsplit``
иjoin('')
вjoin``
.Python (
179148139 cq слишком длинный)Все знают, что страна с именем, которое стоит на первом месте в алфавите, победит. (Этот ответ существует только для начала)
Благодаря милосердию парня (ов) , здесь , я мог бы сократить мой ответ на бите:
Это предполагает наличие действительных команд, но не нуждается в действительном составе (
f('BRA','NED')
вернет 0 (недопустимое совпадение), ноf('XNE')
вернется'XNE'
. Я не понимаю из вашего вопроса, что это проблема. Не стесняйтесь повторно злоупотреблять) это регулярное выражение, как вы считаете нужным.Спасибо @Ventero, я ничего не знаю о регулярных выражениях.
источник
re.search
в версии для гольфа, неre.match
. Кроме того, вы должны быть в состоянии бросить^
и$
якоря.Скала (150)
Здесь возможны совпадения между "foo" и "bar", а также команды, которые не будут играть в реальном времени друг против друга в первых раундах, будут иметь результат (например, начиная с BRA, ARG)
Это просто запись проигранных команд.
Вызывается с:
источник
PowerShell (
261221)Как относительно новый пользователь PowerShell, я нахожу конвейер совершенно удивительным. Я думаю, что следующим может быть попытаться поиграть с массивом, чтобы, надеюсь, устранить все эти вызовы подстроки. (Я должен был добавить вызов в конце, иначе он вывел обе команды)
оригинал
источник
return
что в большинстве случаев нет необходимости.foreach
и большинство явных циклов переоценены и бесполезны. Подобные методы.Substring
следует использовать только в экстремальных обстоятельствах (и хотя вопрос о полезности футбола может обсуждаться, это не экстремальный вид спорта). Как правило, вы хотите максимально использовать конвейер.for
цикл , какfor($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}
вы можете просто использовать трубопровод с диапазоном иForEach-Object
(псевдонимы%
)0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}
. Тщательно продумав, как представлены ваши данные, вы, скорее всего, сможете избавиться отSubstring
вызовов. Скобки вокруг исходного массива не нужны. Для больших массивов также может иметь смысл использовать символ разделителя и использовать его-split
(одинарный-split
в случае, когда разделителем является пробел или табуляция).foreach
цикл, например , может быть записан в виде трубопровода , а также (?
естьWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
который по существу говорит »Фильтр каждый элемента$x
для соответствует ли это так ,$a
и$b
и выходу первой, выход после этого. Если ничего не найдено, выведите 0. «. Так как вы знаете формат своих строк, вы также можете просто использовать их-match"$a$b|$b$a"
, я думаю. Потому что они просто должны появляться в любом порядке в строке. Что также означает, что мы можем использовать небольшую хитрость:"$a$b","$b$a"-eq$_
сыграть в гольф еще один байт.CJam,
6458 байтВыше используются символы каретки и M, так как код содержит непечатаемые символы.
Этими символами можно избежать за счет шести дополнительных байтов:
Попробуйте онлайн.
Тестовый забег
Как это устроено
источник
CJam,
4948 байтовВыше используется символ каретки, так как код содержит непечатаемые символы.
Этими символами можно избежать за счет двух дополнительных байтов:
Попробуйте онлайн.
Тестовый забег
Фон
Мы начинаем с присвоения каждой команде символа ASCII, считая ее имя числом 2, получая полученное целое число по модулю 91, добавляя 12 (чтобы избежать непечатных символов) и выбирая символ, соответствующий полученному коду ASCII. В коде CJam это достигается с помощью
2b91%c
.Например, коды символов
ALG
являются65 76 71
. С(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
и 40, если код символа(
.Это дает следующее отображение:
Теперь мы можем закодировать матчи раунда 16 следующим образом:
Если предположить, что первая команда в алфавитном порядке всегда побеждает, матчи четвертьфинала выглядят следующим образом:
Обратите внимание, что эту строку можно получить из первого, выбрав каждый второй символ, начиная с первого. В коде CJam это достигается
2%
.Используя ту же идею, совпадения полуфинала и финального матча заключаются в следующем:
Код
толкает строку, содержащую совпадения раунда 16, затем выполняет трижды: дублирует строку, извлекает каждый второй символ копии, объединяет. Результатом является строка
который содержит все совпадения (некоторые из них более одного раза).
Как это устроено
источник
"(=BL2*;74)#%8J[K"{_2%+}3*
имеет ту же длину, что и непалиндромная форма моей строки предсказания,"rRgL j9Ab 35ph tYKO gApK"
но намного проще в обращении.JavaScript 271
источник