Создать программу угадывания Кубка мира

13

Как вы знаете, групповой этап Кубка мира завершен, и с завтрашнего дня лучшие 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
  1. Программа должна выводить одного и того же победителя независимо от порядка команд (победитель матча BRA-CHI должен быть таким же, как и в матче CHI-BRA)
  2. Если команда проигрывает, она не может играть больше матчей. Это означает, что для матчей, которые не проводятся, вы должны указать это. Например, если ваша программа предполагает, что Бразилия выиграет матч BRA-CHI, CHI-GER должен вернуть «нет результата», потому что Чили не будет играть против Германии. Смотрите ссылку выше для расписания.

Ради простоты вам не нужно иметь дело с бронзовым матчем (но вы, конечно, можете).

Ваша программа или функция принимает в качестве входных данных две строки: трехбуквенный код страны двух команд и возвращает код страны команды-победителя (вы можете использовать стандартный ввод / вывод или два параметра функции / возвращаемое значение). Если указанные две команды не будут играть в соответствии с вашими догадками, вы должны вернуть что-то еще (это может быть что угодно, кроме кодов стран, например, пустая строка, ноль, сообщение об ошибке). Вы можете предположить, что ввод правильный (два разных кода страны, которые есть в списке).

Это в первую очередь код-гольф, поэтому выигрывает самая короткая в байтах программа. Тем не менее, хорошие и хитрые решения также ценны.

Пример (конечно, вы можете сделать свои собственные догадки):

вход: BRA CHI выход: BRA

вход: CHI BRA выход: BRA

вход: CHI GER выход: нет результата

Дэвид Франк
источник
Должно быть, это был [закулисный], который выводит случайные догадки, но всегда давайте вашей любимой команде победить;) (Как в: выводит случайное дерево
догадок
@ ɐɔıʇǝɥʇuʎs codegolf.stackexchange.com/questions/32092/… Это очень похоже на это
Дэвид Франк
4
@ ɐɔıʇǝɥʇuʎs, это гораздо интереснее, как есть. Нам дано пространство возможных программ, примерно соответствующих хеш-функциям для трехэлементного набора, и мы должны найти самую маленькую программу, эквивалентную любой программе в этом пространстве.
Питер Тейлор
1
Можно предположить, что ввод будет действительным или будет BRA BRAи HAZ CHEEZBURGERдолжен быть обработан должным образом?
Деннис
@Dennis см. Мое редактирование - ввод всегда действителен
David Frank

Ответы:

6

Python 2.x - 368 283

Интересный вызов. Конечно, нам нужно получить текущий рейтинг от ФИФА . У Бразилии есть так называемый "12-й человек", поскольку у них есть домашнее преимущество, поэтому вес 12/11.

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=[1242*12/11,1026,1137,1147,913,640,858,1300,882,981,762,1064,1175,1149,1074,1035]
m={}
for n in[16,8,4,2]:
 j=0
 for k in range(0,n,2):
  s=a[k] if d[k]>d[k+1] else a[k+1]
  m[a[k]+' '+a[k+1]]=s
  a[j]=s    
  j+=1
def f(s): 
 try: print m[s] 
 except: print 'no result'   

Советы по сокращению вышеупомянутого приветствуются :-).

Улучшения благодаря @TheRare и @MrLemon

a='BRA CHI COL URU FRA NGA ALG GER MEX NED CRC GRE ARG SUI BEL USA'.split()
d=15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7
m={}
for n in 16,8,4,2:
 j=0
 for k in range(0,n,2):s=a[k]if d[k]>d[k+1]else a[k+1];m[a[k]+' '+a[k+1]]=s;a[j]=s;j+=1     
def f(s):print s in m and m[s]or'no result'

Это приводит к следующим результатам:

BRA CHI: BRA
COL URU: URU
FRA NGA: FRA
ALG GER: GER
MEX NED: NED
CRC GRE: GRE
ARG SUI: ARG
BEL USA: BEL
------------
BRA URU: BRA
FRA GER: GER
NED GRE: GRE
ARG BEL: ARG
------------
BRA GER: BRA
GRE ARG: ARG
------------
BRA ARG: BRA

Пример звонков:

f('BRA MEX')
no result
f('BRA CHI')
BRA
Willem
источник
1. Вы не используете j(это всегда ноль). 2. for kможно записать в одну строку с помощью ;разделителя. 3. Вам не нужен пробел после ключевых слов, таких как tryили except4. Вы можете удалить пробелы между скобками и ключевыми словами ( a[k]if d[k]>d[k+1]else a[k+1]действует) 5. for n in 16,8,4,26.def f(s):print s in m and m[s]or'no result'
seequ
@TheRare Он использует j, но есть небольшая ошибка форматирования с j+=1. И вы можете сохранить много символов, перекодировав данные FIFA [15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7], конечно.
MrLemon
@MrLemon Ах, я сам не пробовал код, просто посмотрел на него.
seequ
5

С 182 178 133 (или 126)

Здесь не самая короткая программа, но самая короткая, в которой прогноз может быть легко изменен. Теперь, когда все полуфиналисты известны, я обновляюсь.

Там также есть некоторые изменения в коде. Помимо предложений Денниса в комментариях, программа была преобразована в функцию (так как при повторном чтении это разрешено правилами), и хеширование было сокращено.

Код, 133

f(char*a,char*b){
  char*p,*t=" HIAEAIH N?=R=?N ;@4S4@; 5BDGDB5 B@?I?@B",h[3]={*a-a[1]%16,*b-b[1]%16};
  (p=strstr(t,h))&&puts(p-t&2?a:b);
}

Как это устроено

входы aи bхэшируются выражением *a-a[1]%16до одного символа ( *aэто более короткий эквивалент a[0]). Хеш-результаты для команд aи bхранятся в h. Например БРА ЧИ становится @;. Значения хэширования следующие (подтвержденные полуфиналисты и мой предсказанный чемпион отмечены *.)

GRE E   CRC A   *NED I   MEX H
USA R   BEL =   *ARG ?   SUI N
URU S   COL 4  **BRA @   CHI ;
NGA G   FRA D   *GER B   ALG 5

t[]хранит мои прогнозы. Результаты раунда 16 и четвертьфинала теперь известны. Каждая группа из 4 команд упорядочена таким образом, что 1-я и 4-я были выбраны, а 3-я - полуфиналист. Аналогично полуфиналистам, я предсказываю, что 1-й и 4-й будут выбиты, а 3-й полуфиналист будет абсолютным победителем. Если вы не согласны с моими прогнозами, просто измените порядок таблицы.

Прогнозы хранятся в палиндромных блоках, чтобы учесть возможность входа пользователя в команды в любом возможном порядке. Порядок ставит команды-победители из каждого набора по 4 в третий матч. Таким образом, в первой группе GRE Eпроиграл CRC, а MEX Hпроиграл NED. Это настраивает CRC Aдля игры в NED Iв четвертьфинале без необходимости повторять набор текста. Строка дополняется пробелом между каждой группой из 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.

g(char*a,char*b){
  char*p,h[3]={*a^a[1]+3,*b^b[1]+3};
  (p=strstr("|%&626&%|+4*#*4+|(71 17(|./3$3/.|/74&47/",h))&&puts(p-a&2?a:b);
}

main(){
  char team[16][4]={"Gre","Crc","Ned","Mex", "Usa","Bel","Arg","Sui", "Uru","Col","Bra","Chi", "Nga","Fra","Ger","Alg"}; 
  int i;
  for(i=1;i<16;i++){printf("%s %s \n",team[i-1],team[i]);g(team[i],team[i-1]);g(team[i-1],team[i]);}  
}
Уровень реки St
источник
Интересный подход! Вы можете сэкономить несколько байтов, удалив пробел между 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");}
Level River St
1. Я нашел небольшую ошибку. 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)]);}
Деннис
@ Денис, ваш код отлично работает как на GCC / cygwin, так и на VS / Windows на моей машине. Также for(int i=0;i<1000;i++)printf("%d %c ",i,i[*argv])повторяет evey печатный символ командной строки в VS, но в GCC имя программы в 0, первый аргумент в 40, а второй аргумент нигде не видно (я поднялся до 1000.) Любопытно. В любом случае, я изменил функцию, которая находится в рамках правил, в дополнение к обновлению моих прогнозов (я просто ждал результатов сегодняшнего вечера, чтобы подтвердить их, прежде чем публиковать их). Еще раз спасибо и удачи Бразилии против во вторник.
Уровень Река St
3

JavaScript 215 206 120 116

Много возможностей для улучшения:

ES5 - 215

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter(function(x){return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)


ES6 - 206

a=prompt().split(' ');("BRACHI0COLURU0FRANGA0GERALG0NEDMEX0CRCGRE0ARGSUI0BELUSA0BRACOL0FRAGER0NEDCRC0ARGBEL0BRAGER0NEDARG0BRANED".split(0).filter((x)=>{return x.match(a[0])&&x.match(a[1])})[0]||"").substr(0,3)

Подход Regex - 116

Спасибо ɐɔıʇǝɥʇuʎs за размещение этой ссылки , это помогло мне сделать регулярное выражение

a=prompt().split(' ').sort();a.join('').match(/LG(.R(A|G)|GE)|RG(S|BE|CR)|ELUS|AC(H|O)|OLUR|CGR|CM|FRANG|XNE/)&&a[0]
Уильям Барбоза
источник
1
Вы можете сократить свои решения путем преобразования split(' ')в split``и join('')в join``.
Арджун
2

Python ( 179 148 139 cq слишком длинный)

f=lambda *l:sorted(l)[0]if"".join(sorted(l))in"BRACHI COLURU FRANGA ALGGER MEXNED CRCGRE ARGSUI BELUSA BRACOL ALGFRA CRCMEX ARGBEL BRAFRA CRCMEX ARGBEL BRAFRA ARGCRC ARGBRA"else 0

Все знают, что страна с именем, которое стоит на первом месте в алфавите, победит. (Этот ответ существует только для начала)

Благодаря милосердию парня (ов) , здесь , я мог бы сократить мой ответ на бите:

import re;f=lambda *l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|^BRACHI$|^FRANGA$|^BRACOL$',"".join(sorted(l)))else 0

Это предполагает наличие действительных команд, но не нуждается в действительном составе ( f('BRA','NED')вернет 0 (недопустимое совпадение), но f('XNE')вернется 'XNE'. Я не понимаю из вашего вопроса, что это проблема. Не стесняйтесь повторно злоупотреблять) это регулярное выражение, как вы считаете нужным.

Спасибо @Ventero, я ничего не знаю о регулярных выражениях.

import re;f=lambda*l:sorted(l)[0]if re.match('RGB|CM|RGS|CGR|L.F|XNE|EL.S|O.UR|RGCR|B.AF|L.GE|BRACHI|FRANGA|BRACOL',"".join(sorted(l)))else 0
ɐɔıʇǝɥʇuʎs
источник
Вы вероятно хотите re.searchв версии для гольфа, не re.match. Кроме того, вы должны быть в состоянии бросить ^и $якоря.
Вентеро
2

Скала (150)

type s=String;var m=Map[s,s]();def f(x:(s,s))={var a=x._1;var b=x._2;if(b<a){b=a;a=x._1};if(m.getOrElse(a,a)=="")m.getOrElse(b,b)else{m=m+(b->"");a}}

Здесь возможны совпадения между "foo" и "bar", а также команды, которые не будут играть в реальном времени друг против друга в первых раундах, будут иметь результат (например, начиная с BRA, ARG)

Это просто запись проигранных команд.

type s=String //just aliasing for saving characters
var m=Map[s,s]() //map for storing loosing teams, a set would do too
def f(x:(s,s))={
  var a=x._1 var b=x._2
  if(b<a){b=a;a=x._1};//swap if b<a lexographically
  if(m.getOrElse(a,a)=="")//if a has loosed previously
     m.getOrElse(b,b)// return b if b was not in the map else return ""
  else{
    m=m+(b->"") //add b to the map, because a will definitly win this amazing match
    a //and return a
  }
}

Вызывается с:

f(("GER","BRA"))
это ж
источник
2

PowerShell ( 261 221)

$a=Read-Host;$b=Read-Host;$x="CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA";0..($x.Length-2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)};$x|?{"$a$b","$b$a"-eq$_}|%{$_.Substring(3);exit};0

Как относительно новый пользователь PowerShell, я нахожу конвейер совершенно удивительным. Я думаю, что следующим может быть попытаться поиграть с массивом, чтобы, надеюсь, устранить все эти вызовы подстроки. (Я должен был добавить вызов в конце, иначе он вывел обе команды)

Новый участник, первая попытка кода гольф!

Могли бы жестко запрограммировать четвертьфинал, полуфинал и финал, чтобы спасти несколько персонажей, но> это было бы не так весело.

Должен быть достаточно простым для расшифровки, но он удовлетворяет обоим условиям: дает одинакового победителя> независимо от введенного ордера и возвращает победителя только для матчей, которые фактически имеют место>!

Любой совет по улучшению будет принята с благодарностью, спасибо!

оригинал

$a=Read-Host;$b=Read-Host;$x=("CHIBRA","URUCOL","FRANGA","ALGGER","MEXNED","CRCGRE","SUIARG","BELUSA");for($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}foreach($i in $x){if($i-match$a-and$i-match$b){return $i.Substring(3)}}return 0
fuandon
источник
1
Несколько вещей (полное исправление заняло бы намного больше времени): Не пишите PowerShell, как если бы это был C или C #. Это означает, returnчто в большинстве случаев нет необходимости. foreachи большинство явных циклов переоценены и бесполезны. Подобные методы .Substringследует использовать только в экстремальных обстоятельствах (и хотя вопрос о полезности футбола может обсуждаться, это не экстремальный вид спорта). Как правило, вы хотите максимально использовать конвейер.
Джои
1
Вместо того , чтобы писать скучный 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в случае, когда разделителем является пробел или табуляция).
Джои
1
Окончательный 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$_сыграть в гольф еще один байт.
Джои
2

CJam, 64 58 байт

lS/$_0=\:+4b256b1>:ca"oM-YtM-mM-^@}gM-^VM-^U8tM-=nM-^MfM-]oM-xgM-)tM-|m@gim{g_"2/&,*

Выше используются символы каретки и M, так как код содержит непечатаемые символы.

Этими символами можно избежать за счет шести дополнительных байтов:

lS/$_0=\:+4b95b1>32f+:c"I8Vyv)2~N{VIEh1$IW32W)B82QBs2G"2/N*\#W>*

Попробуйте онлайн.

Тестовый забег

$ base64 -d > worldcup.cjam <<< \
> bFMvJF8wPVw6KzRiMjU2YjE+OmNhIm/ZdO2AfWeWlTh0vW6NZt1v+GepdPxtQGdpbXtnXyIyLyYsKg==
$ wc -c worldcup.cjam
58 worldcup.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(LANG=en_US cjam worldcup.cjam <<< "$A $B")
> done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Как это устроено

lS/$    " Read one line from STDIN, split at spaces and sort the resulting array.         ";
_0=\    " Extract the first element of a copy of the array and swap it with the array.    ";
:+      " Concatenate the strings.                                                        ";
4b      " Convert the resulting string into an integer by considering it a base 4 number. ";
256b    " Convert the integer into an array by considering it a base 256 number.          ";
1>:ca   " Drop the first element, convert into a string and create a singleton array.     ";
"…"     " Push a string of all matches encoded as explained above.                        ";
2/      " Split the string into an array of two-character strings.                        ";
&       " Intersect the two arrays. If the array is non-empty, the teams play.            ";
,*      " Multiply the string on the stack by the length of the array.                    ";
Деннис
источник
Вы должны добавить размер вашего bash-скрипта к размеру программы CJam, чтобы быть справедливым.
Дэвид Франк
1
@DavidFrank: я включил сценарий Bash, чтобы показать, что моя программа обеспечивает вывод только для 15 проходящих матчей. Работает сам по себе и не требует внешних программ.
Деннис
2

CJam, 49 48 байтов

lS/$_0="^\16@&^^/+(^]^W^Y,>O?"{_2%+}3*@{2b91%c}%#1&!*

Выше используется символ каретки, так как код содержит непечатаемые символы.

Этими символами можно избежать за счет двух дополнительных байтов:

lS/$_0="(=BL2*;74)#%8J[K"{_2%+}3*@{2b91%C+c}%#1&!*

Попробуйте онлайн.

Тестовый забег

$ base64 -d > wc.cjam <<< bFMvJF8wPSIcMTZAJh4vKygdFxksPk8/IntfMiUrfTMqQHsyYjkxJWN9JSMxJiEq
$ wc -c wc.cjam
48 wc.cjam
$ for A in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> for B in ALG ARG BEL BRA CHI COL CRC FRA GER GRE MEX NED NGA SUI URU USA; do
> [[ $A < $B ]] && echo $A - $B : $(cjam wc.cjam <<< "$A $B"); done; done | grep ': .'
ALG - ARG : ALG
ALG - BRA : ALG
ALG - FRA : ALG
ALG - GER : ALG
ARG - BEL : ARG
ARG - CRC : ARG
ARG - SUI : ARG
BEL - USA : BEL
BRA - CHI : BRA
BRA - COL : BRA
COL - URU : COL
CRC - GRE : CRC
CRC - MEX : CRC
FRA - NGA : FRA
MEX - NED : MEX

Фон

Мы начинаем с присвоения каждой команде символа ASCII, считая ее имя числом 2, получая полученное целое число по модулю 91, добавляя 12 (чтобы избежать непечатных символов) и выбирая символ, соответствующий полученному коду ASCII. В коде CJam это достигается с помощью 2b91%c.

Например, коды символов ALGявляются 65 76 71. С (4 × 65 + 2 × 76 + 71) = 483, 483 % 91 + 12 = 40и 40, если код символа (.

Это дает следующее отображение:

ALG (    ARG 4    BEL #    BRA 2    CHI *    COL ;    CRC 8    FRA B
GER =    GRE J    MEX [    NED K    NGA L    SUI )    URU 7    USA %

Теперь мы можем закодировать матчи раунда 16 следующим образом:

(=BL2*;74)#%8J[K

Если предположить, что первая команда в алфавитном порядке всегда побеждает, матчи четвертьфинала выглядят следующим образом:

(B2;4#8[

Обратите внимание, что эту строку можно получить из первого, выбрав каждый второй символ, начиная с первого. В коде CJam это достигается2% .

Используя ту же идею, совпадения полуфинала и финального матча заключаются в следующем:

(248
(4

Код

"(=BL2*;74)#%8J[K"{_2%+}3*

толкает строку, содержащую совпадения раунда 16, затем выполняет трижды: дублирует строку, извлекает каждый второй символ копии, объединяет. Результатом является строка

(=BL2*;74)#%8J[K(B2;4#8[(B2;4#8[(248(B2;4#8[(248(248(4

который содержит все совпадения (некоторые из них более одного раза).

Как это устроено

lS/$        " Read one line from STDIN, split at spaces and sort the resulting array.     ";
_0=         " Extract the first element of a copy of the array.                           ";
"…"         " Push the string containing the matches of the round of 16.                  ";
{_2%+}3*    " Push the remaining matches.                                                 ";
@           " Rotate the input array on top of the stack.                                 ";
{2b91%C+c}% " Perform the mapping for each team in the input array.                       ";
#           " Push the index of the match in the array of all matches (-1 for not found). ";
1&!         " Push 1 if the index is even (valid match) and 0 if it is odd.               ";
,*          " Repeat the string on the stack that many times.                             ";
Деннис
источник
Удивительно, что вы делаете с Cjam. Всякий раз, когда я думаю, что вы можете позаимствовать одну из моих идей, вы предлагаете что-то лучшее! Ваш код предсказания "(=BL2*;74)#%8J[K"{_2%+}3*имеет ту же длину, что и непалиндромная форма моей строки предсказания, "rRgL j9Ab 35ph tYKO gApK"но намного проще в обращении.
Уровень Река St
0

JavaScript 271

t=prompt('Match?').split('-')
x=t[0],y=t[1],T='BRACHICOLURUFRANGAGERALGNEDMEXCRCGREARGSUIBELUSA'
v='\n',R='',W='No Game'
for(z=1;T!='USA';++z,T=n){R+=v+z+v,n='',r=/(...)(...)/g
while(m=r.exec(T))a=m[1],n+=b=m[2],R+=a+'-'+b+v,W=a==x&&b==y||a==y&&b==x?b:W
}
alert(W+'\n'+R)
wolfhammer
источник