Como você sabe, a fase de grupos da Copa do Mundo terminou e a partir de amanhã as 16 melhores equipes começarão a fase eliminatória:
- Brasil (BRA)
- México (MEX)
- Holanda (NED)
- Chile (CHI)
- Colômbia (COL)
- Grécia (GRE)
- Costa Rica (CRC)
- Uruguai (URU)
- França (FRA)
- Suíça (SUI)
- Argentina (ARG)
- Nigéria (NGA)
- Alemanha (GER)
- Estados Unidos (EUA)
- Bélgica (BEL)
- Argélia (ALG)
Na fase eliminatória, após cada partida, o vencedor passa para a próxima rodada e o perdedor vai para casa (não há empates). Clique aqui para ver mais sobre a fase eliminatória.
Você foi contratado pelo golfbet.com, um novo site de apostas porque é conhecido por ser bom em programação e apostas esportivas. Sua tarefa é escrever um programa ou função que possa adivinhar o vencedor de uma partida. É claro que todo mundo faz suposições diferentes, não importa, desde que sejam consistentes.
Se você não quer adivinhar, pode usar as seguintes suposições:
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
- O programa deve apresentar o mesmo vencedor, independentemente da ordem das equipes (o vencedor da partida BRA-CHI deve ser o mesmo da partida CHI-BRA)
- Se um time perde, não pode jogar mais nenhuma partida. Isso significa que, para as partidas que não ocorrem, você deve indicar isso. Por exemplo, se seu programa adivinha o Brasil para vencer a partida BRA-CHI, então o CHI-GER precisa retornar "sem resultado", porque o Chile não joga contra a Alemanha. Veja o link acima para agendar.
Por uma questão de simplicidade, você não precisa lidar com a partida de bronze (mas é claro).
Seu programa ou função usa duas cadeias de caracteres como entrada: o código do país de três letras das duas equipes e retorna o código do país da equipe vencedora (você pode usar entrada / saída padrão ou dois parâmetros de função / valor de retorno). Se as duas equipes indicadas não jogarem de acordo com seus palpites, você deve retornar outra coisa (isso pode ser qualquer coisa, exceto os códigos do país, por exemplo, sequência vazia, nulo, mensagem de erro). Você pode assumir que a entrada está correta (dois códigos de países diferentes que estão na lista).
Este é basicamente um código de golfe, e o programa mais curto em bytes vence. No entanto, soluções agradáveis e complicadas também são valiosas.
Exemplo (é claro, você pode fazer suas próprias suposições):
entrada: BRA CHI saída: BRA
entrada: CHI BRA saída: BRA
entrada: saída CHI GER: sem resultado
BRA BRA
eHAZ CHEEZBURGER
deve ser tratada adequadamente?Respostas:
Python 2.x -
368283Desafio interessante. É claro que precisamos obter classificações atuais da FIFA . O Brasil tem o chamado "12º homem", pois eles têm vantagem em casa, portanto, o peso de 12/11.
Dicas para encurtar o exposto acima são bem-vindas :-).
Melhorias graças a @TheRare e @MrLemon
Isso leva aos seguintes resultados:
Chamadas de exemplo:
fonte
j
(é sempre zero). 2.for k
pode ser escrito em uma linha usando;
delimitador. 3. Você não precisa de espaço depois de palavras-chave comotry
ouexcept
4. Você pode remover espaços entre colchetes e palavras-chave (a[k]if d[k]>d[k+1]else a[k+1]
é válido) 5.for n in 16,8,4,2
6.def f(s):print s in m and m[s]or'no result'
j
, mas há um pequeno erro de formatação com oj+=1
. E você pode salvar muitos personagens recodificando os dados da FIFA[15,6,10,11,4,0,2,14,3,5,1,8,13,12,9,7]
, é claro.C,
182 178133 (ou 126)Não é o programa mais curto aqui, mas é o mais curto no qual a previsão pode ser alterada facilmente. Agora que todos os semifinalistas são conhecidos, estou atualizando.
Também há algumas alterações no código. Além das sugestões de Dennis nos comentários, o programa foi convertido em uma função (pois a leitura é permitida pelas regras) e o hash foi reduzido.
Code, 133
Como funciona
as entradas
a
eb
são divididas em hash pela expressão*a-a[1]%16
em um único caractere (*a
é um equivalente menora[0]
). Os resultados do hash para as equipesa
eb
são armazenadosh
. Por exemplo, BRA CHI se torna@;
. Os valores hash são os seguintes (os semifinalistas confirmados e meu campeão previsto estão marcados com*
.)t[]
armazena minhas previsões. Os resultados das rodadas de 16 e dos quartos de final são agora conhecidos. Cada grupo de 4 equipes é ordenado de forma que o 1º e o 4º foram eliminados, e o 3º é o semifinalista. Da mesma forma que os semifinalistas, estou prevendo que o 1º e o 4º serão eliminados e o 3º semifinalista será o vencedor geral. Se você não concordar com minhas previsões, basta reordenar a tabela.As previsões são armazenadas em blocos palíndricos para acomodar a possibilidade do usuário entrar nas equipes em qualquer ordem possível. A ordem coloca as equipes vencedoras de cada conjunto de 4 juntas para jogar uma terceira partida. Assim, no primeiro grupo, o GRE
E
perdeu para o CRC e o MEXH
perdeu para o NED. Isso configura o CRCA
para jogar NEDI
nas quartas de final sem precisar repetir a digitação. A corda é preenchida com um espaço entre cada grupo de 4 equipes / 7 caracteres para ajudar a garantir que não haja saída para as equipes que não se tocarão.O vencedor de cada correspondência possível em cada grupo de 8 caracteres é o seguinte:
invalid,b,a,a,b,b,a,invalid
. Assim, a escolha correta do vencedor pode ser feita assumindo a posiçãoh
emt
AND 2 . Infelizmente, astrstr
função não é a mais direta, pois retorna um ponteirop
; portanto, devemos subtrairp
det
para obter a posição atual emt.
Se a correspondência for inválida (não pode ser encontrada emt
),p
é zero e a fraseno result
é impressa.Algumas melhorias duvidosas, 126
2 caracteres salvos por uma expressão de hash aprimorada. Infelizmente, isso exige que o caso das equipes seja como mostrado no programa de teste abaixo da função (por exemplo, em
Bra
vez deBRA
ser usado no programa acima.) Fiquei satisfeito de que não há como fazer isso com um único operador, portanto, 2 operadores e uma constante de caractere único são os melhores possíveis. Observe também que oUru
mapeamento paraspace
um caractere alternativo|
é necessário para separar os grupos de códigos de equipe.5 caracteres salvos ao eliminar
t
e tratar a sequência de previsão como um literal. Isso significa que é impossível saber o endereço onde a string está armazenada. No entanto, desde que não seja armazenado em zero, estamos interessados apenas emp&2
que o código funcione se o endereço for divisível por 4. (Observe que não é permitido tratar o ponteirop
diretamente como um número inteiro, ele deve ser subtraído de outro ponteiro Eu uso o ponteiro,a
portanto,a
também deve ser divisível por 4.) Pode-se ter certeza de que as seqüências de compilador / arquitetura de 32 ou 64 bits serão armazenadas dessa maneira. Isso tem funcionado bem para mim no GCC / cygwin, embora se recuse a compilar no visual studio / windows.fonte
char
e*p
e substituiçãoa[0]
,b[0]
eh[0]
com*a
, B` e*h
. Além disso, a questão diz que * se as dadas duas equipes não vai jogar de acordo com suas suposições, você deve retornar algo mais (este pode ser qualquer coisa, mas os códigos de país, por exemplo string vazia, null, mensagem de erro) , de modo a imprimir sem resultado é não é necessário e você pode substituirputs(...)
por(p=strstr(t,h))&&puts(p-t&2?a:b)
.a[0]->*a
! Será atualizado em breve. Imaginando, existe alguma maneira de acessar uma matriz multidimensional com um único número? Eu escrevi esta versão da linha de comando de comprimento idêntico (pode salvar 1 byte com a#define
.) Seria bom evitar os subscritos duplos neste e em casos semelhantes: #: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
deve ser terminado por nulo, por isso deve serh[3]
. 2. Se você definirp=v[1]
, poderá acessarv[i][j]
comop[4*(i-1)+j]
. Funciona na minha máquina, mas não sei se é portátil ... 3. Você deve inicializarh
se a declarar dentromain
: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])
ecoa de volta todos os caracteres imprimíveis da linha de comando no VS, mas no GCC o nome do programa é 0, o primeiro argumento é 40 e o segundo argumento não é visto em nenhum lugar (subi para 1000). Curioso. Enfim, mudei para uma função que está dentro das regras, além de atualizar minhas previsões (estava esperando o resultado de hoje à noite para confirmá-las antes de postar.) Obrigado novamente e boa sorte contra o Brasil na terça-feira.JavaScript
215 206 120116Muito espaço para melhorias:
ES5 - 215
ES6 - 206
Abordagem Regex - 116
Graças a forıʇǝɥʇuʎs por postar este link , ele me ajudou a fazer a regex
fonte
split(' ')
parasplit``
ejoin('')
parajoin``
.Python (
179148139 cq tempo demais)Todo mundo sabe que o país com o nome que aparece primeiro no alfabeto vai ganhar. (Esta resposta existe apenas para começar)
Graças à caridade do (s) cara (s) por aqui , eu poderia encurtar minha resposta um pouco:
Isso pressupõe equipes válidas, mas não precisa de uma formação válida (
f('BRA','NED')
retornaria 0 (partida inválida), masf('XNE')
retornaria'XNE'
. Não recebo sua pergunta de que isso seja um problema. Sinta-se à vontade para reutilizar este regex como achar melhor.Obrigado @Ventero, não sei nada sobre regexes.
fonte
re.search
na versão de golfe, nãore.match
. Além disso, você deve poder soltar as âncoras^
e$
.Scala (150)
Aqui estão as partidas entre "foo" e "bar" possíveis, também as equipes que não jogarem real entre si nas primeiras rodadas terão resultado (por exemplo, começando com BRA, ARG)
É apenas gravar equipes perdedoras.
Chamado com:
fonte
PowerShell (
262222)Como um usuário relativamente novo do PowerShell, acho o pipeline absolutamente incrível. Acho que em seguida pode ser tentar mexer com a matriz para eliminar todas as chamadas de substring. (Eu tive que adicionar uma chamada no final, ou ela gerou as duas equipes)
Original
fonte
return
é desnecessário na maioria dos casos.foreach
e a maioria dos loops explícitos é superestimada e inútil. Métodos como.Substring
devem ser usados apenas em circunstâncias extremas (e, embora a utilidade do futebol possa ser debatida, não é um esporte radical). Geralmente você deseja usar o pipeline o máximo possível.for
loop comofor($c=0;$c-lt$x.length-1;$c+=2){$x+=$x[$c].Substring(3)+$x[$c+1].Substring(3)}
você pode apenas usar um gasoduto com um intervalo eForEach-Object
(alias%
):0..($x.Length/2)|%{$x+=$x[2*$_].Substring(3)+$x[2*$_+1].Substring(3)}
. Ao considerar cuidadosamente como seus dados são representados, é possível que você se livre dasSubstring
chamadas. Os parênteses em torno da matriz inicial são desnecessários. Para matrizes maiores, também pode fazer sentido usar um caractere separador e usar-split
(unário-split
no caso de o separador ser espaço ou tabulação).foreach
de loop, por exemplo, pode ser escrito como um oleoduto, bem como (?
éWhere-Object
):$x|?{$_-match$a-and$_-match$b}|%{$_;exit};0
o que essencialmente diz »Filtro de cada elemento$x
para saber se ele corresponde ambos$a
e$b
e saída do primeiro, sair depois. Se não foi possível encontrar nenhum, produza 0. «. Já que você conhece o formato de suas strings, também pode usar-match"$a$b|$b$a"
, eu acho. Porque eles apenas precisam aparecer em qualquer ordem na string. O que também significa que podemos usar um pequeno truque aqui:"$a$b","$b$a"-eq$_
jogar mais um byte em golfe.CJam,
6458 bytesO exemplo acima usa circunflexo e notação M., pois o código contém caracteres não imprimíveis.
Ao custo de seis bytes adicionais, esses caracteres podem ser evitados:
Experimente online.
Execução de teste
Como funciona
fonte
CJam,
4948 bytesO exemplo acima usa notação de intercalação, pois o código contém caracteres não imprimíveis.
Ao custo de dois bytes adicionais, esses caracteres podem ser evitados:
Experimente online.
Execução de teste
fundo
Começamos atribuindo um caractere ASCII a cada equipe, considerando seu nome como um número base 2, utilizando o módulo inteiro resultante 91, adicionando 12 (para evitar caracteres não imprimíveis) e selecionando o caractere correspondente ao código ASCII resultante. No código CJam, isso é alcançado por
2b91%c
.Por exemplo, os códigos de caracteres de
ALG
são65 76 71
. Desde(4 × 65 + 2 × 76 + 71) = 483
,483 % 91 + 12 = 40
e 40, se o código de caractere de(
.Isso fornece o seguinte mapeamento:
Agora, podemos codificar as partidas da rodada de 16 da seguinte maneira:
Se assumirmos que o primeiro time em ordem alfabética sempre vence, os jogos das quartas de final são os seguintes:
Observe que essa sequência pode ser obtida desde o primeiro, selecionando cada segundo caractere, começando com o primeiro. No código CJam, isso é alcançado por
2%
.Usando a mesma idéia, as partidas das meias-finais e da partida final são as seguintes:
O código
empurra a sequência que contém as correspondências da rodada de 16 e faz o seguinte três vezes: duplica a sequência, extrai cada segundo caractere da cópia, concatena. O resultado é a sequência
que contém todas as correspondências (algumas delas mais de uma vez).
Como funciona
fonte
"(=BL2*;74)#%8J[K"{_2%+}3*
tem o mesmo tamanho da forma não palíndrica da minha sequência de previsões,"rRgL j9Ab 35ph tYKO gApK"
mas é muito mais fácil de manusear.JavaScript 271
fonte