Probabilidades do suporte XKCD

13

O XKCD de hoje é um suporte de estilo de torneio esportivo, onde os competidores são nomes bem conhecidos, colocados em grupos de nomes possivelmente confusos.

Dê a probabilidade de que um determinado competidor ganhe o torneio inteiro, com base em cada competidor em uma determinada rodada com a mesma chance de vencer essa rodada.

Entrada

O nome de um competidor.

  • O XKCD gosta de usar todas as letras maiúsculas, mas você pode usar qualquer que seja o caso que faça sentido para você ou tornar sua entrada insensível.
  • Você pode assumir que todos os nomes de entrada são válidos.
  • Jeff Gordanprovavelmente é um erro de ortografia Jeff Gordon. Você pode optar por aceitar um ou ambos.
  • Alguns nomes incluem pontuação, por exemplo, H. G. Wellse Joseph Gordon-Levitt. Você pode optar por aceitar nomes com ou sem pontuação (ou ambos). O acima exposto sem pontuação seria H G WellseJoseph Gordon Levitt
  • Da mesma forma, você pode optar por aceitar tanto Beyoncéou Beyonceou ambos
  • A Mister/Fred Astaire/Rogerslinha é um pouco estranha. Para este, você deve aceitar todos os seguintes: Fred Rogers, Mister RogerseFred Astaire

Resultado

A probabilidade de um determinado competidor ganhar o torneio inteiro, de forma racional (por exemplo 1/64)

Exemplos

  • Louis Armstrong potencialmente jogará em 6 rodadas, cada uma com dois competidores, então ele tem 1/64 de chance de ganhar.
  • Alan Rickman potencialmente jogará em 7 rodadas, a primeira com 3 participantes e o restante com 2 concorrentes, então ele tem 1/192 de chance de ganhar.

Para poupar o esforço de digitar todos os nomes da imagem, o explicXKCD já os tabula . Eu também os joguei nessa pasta .

Observe que as probabilidades de vitória no explanXKCD estão erradas - elas são duas vezes maiores do que deveriam porque provavelmente estão esquecendo a rodada final. Obrigado por apontar isso para @Geobits.

Trauma Digital
fonte
por isso temos de primeiro converter a imagem em texto e, em seguida, baldes de probabilidade codificar .. ughh
Optimizer
2
@Optimizer explainxkcd pode te ajudar com isso
Martin Ender
@ MartinBüttner That's dope
Optimizer
@Optimizer não requer conversão de imagem :)
Digital Trauma
4
explanxkcd é um wiki; por que corrigi-lo com uma nota na especificação quando você pode corrigi-lo para todos? : P
undergroundmonorail

Respostas:

6

CJam, 161 bytes

1'/l_"FRE"#\_'É#)\2b626%536%"òazíF­.?§·»ùßóÿ÷ýÿÿ»×ï_ÿÿ¿ß÷ä¿ûïÿÏÅÿ¿ÿÿ~ÿþÿýó½ïÿþþ/ïþÿ®þü¾ùÿ®÷/"256b2b2*<1-,"ãÍÕý*ÔÞ)ð^sV? Ìöî²\ÅlÕáS{Á"260b5b=5,Z6t=2+1\?4?32*

Este é um programa completo que espera entrada em maiúsculas, com pontuação e acentos exatamente como mostrado na pasta paste.

Experimente on-line no intérprete CJam .

Como funciona

1'/      e# Push a 1 and a slash.
l        e# Read a line of input from STDIN.
_"FRE"#  e# Push 0 if the input starts with "FRE" and a truthy value otherwise.
\_'É#)   e# Push 1 if the input doesn't contain "É" and a falsy value otherwise.

         e# Now we hash the input:
\2b      e#     Apply base 2 conversion to turn the input into an integer.
626%536% e#     Take that integer modulo 626, then modulo 536.

"òazíF­.?§·»ùßóÿ÷ýÿÿ»×ï_ÿÿ¿ß÷ä¿ûïÿÏÅÿ¿ÿÿ~ÿþÿýó½ïÿþþ/ïþÿ®þü¾ùÿ®÷/"256b2b2*

         e# Convert the string from base 256 to base 2 and repeat it.
         e# The resulting array, [1 1 1 1 0 0 1 0 0 ...], contains a 0 at index X
         e# if and only if there is a possible input with hash X.

<        e# Keep the binary values before the index of the input hash.
<1-,     e# Count the number of zeroes.

"ãÍÕý*ÔÞ)ð^sV?  Ìöî²\ÅlÕáS{Á"260b5b

         e# Convert the string from base 260 to base 5.
         e# The resulting array, [2 2 2 2 2 0 4 4 0 0 ...], contains a diffrent
         e# integer for every different probability. The input with the lowest hash
         e# corresponds to the first index, the one with the highest to the last.

=        e# Retrieve the integer corresponding to the input.
5,Z6t=   e# Retrieve the corresponding element from [0 1 2 6 4].
2+       e# Add two.
1\?      e# Select the result from above or 1 for BEYONCÉ.
4?       e# Select the result from above or 4 for and FRED.
32*      e# Multiply by 32.
Dennis
fonte
Peguei as probabilidades de explanxkcd (multiplicado por 2) e preenchi as lacunas. Felizmente, está tudo correto. A correção de qualquer probabilidade não deve afetar a contagem de bytes.
Dennis