Macacos em uma máquina de escrever

8

Às vezes, quando você pressiona uma tecla do teclado, a letra nem sempre é exibida na tela. Seja por causa de uma conexão desonesta ou não, você decidiu escrever um script para controlar a probabilidade de uma letra ser exibida na tela quando a tecla correspondente for pressionada.

Um dia, você decide comprar um macaco e sentar em um teclado. Sendo curioso, você decide descobrir quais são as principais probabilidades de ajudar o macaco a escrever Hamlet na sua totalidade.

Seu desafio é calcular as probabilidades de cada caractere para que a passagem seja digitada com o menor número de caracteres.

Aqui está uma lista de todos os caracteres que você deve consolidar:

qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!"':;.()?,

Novas linhas e espaços estão incluídos na lista acima. Você deve usar apenas os caracteres da lista, descontando todos os outros caracteres (remova-os da passagem).

O programa deve ser um programa com a passagem fornecida via STDIN. A saída deve ser para STDOUT.

Como esse é um desafio da Rosetta Stone, você deve escrever o maior número possível de programas em idiomas diferentes.

Para ganhar, você precisa ter o código mais curto no maior número de idiomas.

Caso de teste 1

Devo comparar-te com um dia de verão?
Tu és mais amável e mais temperada:
ventos fortes agitam os botões queridos de maio
E o arrendamento do verão tem um encontro muito curto

Responda:

{
'\n': 0.017543859649122806,
' ': 0.16959064327485379,
'!': 0.0,
'"': 0.0,
"'": 0.011695906432748537,
'(': 0.0,
')': 0.0,
',': 0.0058479532163742687,
'.': 0.0,
'0': 0.0,
'1': 0.0,
'2': 0.0,
'3': 0.0,
'4': 0.0,
'5': 0.0,
'6': 0.0,
'7': 0.0,
'8': 0.0,
'9': 0.0,
':': 0.0058479532163742687,
';': 0.0,
'?': 0.0058479532163742687,
'A': 0.0058479532163742687,
'B': 0.0,
'C': 0.0,
'D': 0.0,
'E': 0.0,
'F': 0.0,
'G': 0.0,
'H': 0.0,
'I': 0.0058479532163742687,
'J': 0.0,
'K': 0.0,
'L': 0.0,
'M': 0.0058479532163742687,
'N': 0.0,
'O': 0.0,
'P': 0.0,
'Q': 0.0,
'R': 0.0058479532163742687,
'S': 0.0058479532163742687,
'T': 0.0058479532163742687,
'U': 0.0,
'V': 0.0,
'W': 0.0,
'X': 0.0,
'Y': 0.0,
'Z': 0.0,
'a': 0.08771929824561403,
'b': 0.0058479532163742687,
'c': 0.0058479532163742687,
'd': 0.046783625730994149,
'e': 0.093567251461988299,
'f': 0.0058479532163742687,
'g': 0.011695906432748537,
'h': 0.052631578947368418,
'i': 0.011695906432748537,
'j': 0.0,
'k': 0.0058479532163742687,
'l': 0.046783625730994149,
'm': 0.046783625730994149,
'n': 0.023391812865497075,
'o': 0.070175438596491224,
'p': 0.011695906432748537,
'q': 0.0,
'r': 0.052631578947368418,
's': 0.052631578947368418,
't': 0.058479532163742687,
'u': 0.029239766081871343,
'v': 0.0058479532163742687,
'w': 0.0058479532163742687,
'x': 0.0,
'y': 0.017543859649122806,
'z': 0.0
}

Caso de teste 2

Há quatro anos e sete anos atrás, nossos pais trouxeram neste continente uma nova nação, concebida em liberdade, e dedicada à proposição de que todos os homens são criados iguais.

Agora estamos envolvidos em uma grande guerra civil, testando se essa nação, ou qualquer nação tão concebida e tão dedicada, pode durar muito tempo. Nós somos encontrados em um grande campo de batalha daquela guerra. Viemos para dedicar uma parte desse campo, como um local de descanso final para aqueles que aqui deram suas vidas para que aquela nação pudesse viver. É totalmente apropriado e apropriado que façamos isso.

Responda:

{
'\n': 0.0036036036036036037,
' ': 0.18018018018018017,
'!': 0.0,
'"': 0.0,
"'": 0.0,
'(': 0.0,
')': 0.0,
',': 0.010810810810810811,
'.': 0.0090090090090090089,
'0': 0.0,
'1': 0.0,
'2': 0.0,
'3': 0.0,
'4': 0.0,
'5': 0.0,
'6': 0.0,
'7': 0.0,
'8': 0.0,
'9': 0.0,
':': 0.0,
';': 0.0,
'?': 0.0,
'A': 0.0,
'B': 0.0,
'C': 0.0,
'D': 0.0,
'E': 0.0,
'F': 0.0018018018018018018,
'G': 0.0,
'H': 0.0,
'I': 0.0018018018018018018,
'J': 0.0,
'K': 0.0,
'L': 0.0,
'M': 0.0,
'N': 0.0018018018018018018,
'O': 0.0,
'P': 0.0,
'Q': 0.0,
'R': 0.0,
'S': 0.0,
'T': 0.0,
'U': 0.0,
'V': 0.0,
'W': 0.0036036036036036037,
'X': 0.0,
'Y': 0.0,
'Z': 0.0,
'a': 0.082882882882882883,
'b': 0.0054054054054054057,
'c': 0.025225225225225224,
'd': 0.03783783783783784,
'e': 0.10270270270270271,
'f': 0.016216216216216217,
'g': 0.023423423423423424,
'h': 0.041441441441441441,
'i': 0.057657657657657659,
'j': 0.0,
'k': 0.0,
'l': 0.027027027027027029,
'm': 0.0072072072072072073,
'n': 0.063063063063063057,
'o': 0.066666666666666666,
'p': 0.010810810810810811,
'q': 0.0018018018018018018,
'r': 0.050450450450450449,
's': 0.028828828828828829,
't': 0.093693693693693694,
'u': 0.010810810810810811,
'v': 0.014414414414414415,
'w': 0.014414414414414415,
'x': 0.0,
'y': 0.0054054054054054057,
'z': 0.0
}

Veja a teoria aqui .

Entre os melhores

C - 371 - Gerwin Dox
Java - 788 - Luminous
Beta Decay
fonte
18
O inglês não é minha língua materna, então talvez eu não tenha habilidades de compreensão, mas depois de ler o desafio duas vezes, ainda não entendo o que você está perguntando.
Michael M.
1
Pelo que entendi, devemos mapear cada caractere imprimível para uma probabilidade desse caractere não ser exibido quando a tecla correspondente for pressionada. As probabilidades precisam ser ajustadas para que, ao pressionar as teclas aleatoriamente (macaco no teclado), o texto (completo?) De Hamlet apareça o mais rápido possível. Eu entendi direito?
karhell
2
Você está nos pedindo para contar o número de vezes que cada caractere ocorre e dividir pelo número total de caracteres, fornecendo efetivamente a distribuição de caracteres no texto? Obviamente, se o macaco digitasse com essas probabilidades, ele teria maiores chances de sucesso. Caso contrário, não faço ideia do que você está pedindo.
Level River St
3
Programa ou função? Formato de entrada: argumento, stdin ou arquivo? Formato de saída: array ou stdout? E o mais importante, precisamos incluir apenas os símbolos exigidos ou podemos incluir tudo, de !(33) a z(122) ou ~(126)? Quando dividimos pelo número total de caracteres, não há problema em simplesmente dividir pelo comprimento da entrada ou temos que excluir os caracteres que não estão na lista (espaço etc.)?
Level River St
2
Qual é exatamente o critério de vencimento? Houve alguns mecanismos de pontuação diferentes para [rosetta-stone] no passado, e não há um padrão, até onde eu saiba.
Geobits

Respostas:

1

Java 788 743

Editar

Encontrou tanto que eu poderia jogar golfe. Substituiu palavras inteiras com letras, criou o método para inserir chaves no HashMape moveu todas as variáveis ​​inteiras para uma declaração.


Não esperava que isso batesse nenhum recorde, mas tudo bem. Esta versão exige que você digite quantas linhas de entrada você está dando, já que o java gosta de bloquear qualquer método que receba entrada.

Então, o exemplo seria:

4
Devo comparar-te com um dia de verão?
Tu és mais amável e mais temperada:
ventos fortes agitam os botões queridos de maio
E o arrendamento do verão tem um encontro muito curto

import java.util.*;class A{static HashMap<Character,Double>m=new HashMap<Character,Double>();public static void main(String[]g){Scanner s=new Scanner(System.in);int n,k,e,i='@';for(;i++<'[';)g((char)i);for(i='`';i++<'{';)g((char)i);for(i='/';i++<':';)g((char)i);char[]r={' ','!','"','\'',':',';','.','(',')','?',','};p(r);e=s.nextInt();s.nextLine();String l="";n=0;k=0;while(k<e){l=s.nextLine();for(i=0;i<l.length();i++){char c=l.charAt(i);m.put(c,m.get(c)+1);n++;}k++;n++;}m.put('\n',(double)(e-1));for(Iterator b=m.entrySet().iterator();b.hasNext();){Map.Entry p=(Map.Entry)b.next();System.out.println(p.getKey()+" = "+((double)p.getValue())/(n-1));b.remove();}}static void p(char[]a){for(char b:a)g(b);}static void g(char a){m.put(a,0.0);}}

UnGolfed

import java.util.*;
class A{
static HashMap<Character,Double>m=new HashMap<Character,Double>();
public static void main(String[]g){
    Scanner s=new Scanner(System.in);
    int n,k,e,i='@';
    for(;i++<'[';)g((char)i);
    for(i='`';i++<'{';)g((char)i);
    for(i='/';i++<':';)g((char)i);
    char[]r={' ','!','"','\'',':',';','.','(',')','?',','};
    p(r);
    e=s.nextInt();
    s.nextLine();
    String l="";
    n=0;
    k=0;
    while(k<e){
        l=s.nextLine();
        for(i=0;i<l.length();i++){
            char c=l.charAt(i);
            m.put(c,m.get(c)+1);
            n++;
        }
        k++;
        n++;
    }
    m.put('\n',(double)(e-1));
    for(Iterator b=m.entrySet().iterator();b.hasNext();){
        Map.Entry p=(Map.Entry)b.next();
        System.out.println(p.getKey()+" = "+((double)p.getValue())/(n-1));
        b.remove();
    }
}
static void p(char[]a){
    for(char b:a)g(b);
}
static void g(char a){
    m.put(a,0.0);
}

}

Luminoso
fonte
0

C, 324 bytes (alguém pode verificar isso por mim?)

Talvez eu precise afiar meu método, é um pouco longo.

main(){char*d="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!\"':;.()?,\n ",*p,*s,*c=calloc(1,1000),*r=c;int n=-1;do{scanf("%c",++r);for(p=d;*p;p++)n+=*p==*r?1:0;}while(*((short*)(r-1))!=2570);p=d;for(;*p;p++){int q=0;for(s=c;*(s+1);s++)q+=(*s==*p?1:0);printf("'%c':%f\n",*p-10?*p:244,(float)q/n);}free(c);}

Além disso, posso provar que funciona.

Gerwin
fonte
Conto 371 bytes
Decay Beta
Palavra Microsoft diz 321 (sem espaços, é claro)
Gerwin
Bem, você precisa de alguns espaços: intn=-1não funciona.
urzeit
Eu só preciso de 3 deles :)
Gerwin