Inserir erros de digitação no texto


63

Eu escrevi um texto, mas parece muito profissional. Quero fazer parecer que eu estava realmente cansado quando escrevi. Preciso que você insira alguns erros de digitação.

Seu desafio é pegar uma única linha de texto arbitrária e adicionar erros de digitação. Isso significa que, para cada personagem, haverá 10% de chance de ser digitado.

A definição de "tipificado" é que você deve escolher (aleatoriamente) um dos seguintes:

  • Duplique o personagem.
  • Exclua o caractere.
  • Mude o espaço do teclado para um caractere. O "teclado" é definido como:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    Para a mudança de personagem, você deve ir um espaço para cima, baixo, esquerda ou direita. Isso deve ser escolhido aleatoriamente. A opção turno se aplica apenas a caracteres alfabéticos. O caso deve ser preservado. Tenha cuidado com casos extremos, como m!

A definição de "aleatório" é que o resultado não deve ser previsível (observando resultados anteriores). Por exemplo, você não pode digitar cada décimo caractere. Além disso, a aleatoriedade deve ter uma distribuição uniforme. Por exemplo, você não pode duplicar 30%, excluir 30% e mudar 40%; deve haver uma chance de 1/3 para cada (1/2 para cada, se for um personagem não alfabético).

Exemplo de entrada:

This is some correct text. It is too correct. Please un-correctify it.

Exemplo de saída:

This iissome xorreect tex..  It is too coteect. Please jn-corretify it.

Isso é , então o código mais curto em bytes vencerá.


4
Que tal bater acidentalmente na tecla Capslock? Quando alguém digita um "A" ou "Z", deve haver uma chance aleatória de que eles atinjam o capslock, ND END ACIMA DESTE.
AJMansfield

2
@AJMansfield Lol, isso provavelmente seria muito complicado. Já é complicado o suficiente: P
Maçaneta da porta

11
@ user2509848 Ei, pare, peço, minério co, plicado do que já é! :-P
Maçaneta da porta

11
@Doorknob Seu exemplo de saída não parece estar cansado , parece que você é iniciante em digitação e não sabe como corrigir erros de digitação. (Ou você não olhar sobre o que você tinha digitado em todos. )
Blacklight Brilhante

11
"edge-cases" <- vejo o que você fez lá. * slow clap *
Adam Maras

Respostas:


15

GolfScript, 120 caracteres

{10{rand}:R~!{[{.}{;}{Z\?[.(.10-@).10+]{Z=}%' '-.,R=}]'QWERTYUIOP ASDFGHJKL  ZXCVBNM'' '22*11/*.{32|}%+:Z 2$?0>2+R=~}*}%

O código pode ser testado aqui .

{                      # loop over all characters
  10{rand}:R~!         # take random number [0..9] and negate (i.e. 10% chance of true)
  {                    # {...}* is the if-block
    [                  # Three possible operations (code blocks) in the arry
      {.}              # a) duplicate
      {;}              # b) delete
      {                # c) shift
        Z              #      Z is the keyboard layout (see below)
        \?             #      Find the index of the current letter
        [.(.10-@).10+] #      Calculate index of letter left, right, above, below
        {Z=}%          #      Extract the corresponding letters for indices
        ' '-           #      Remove any spaces
        .,R=           #      Take random item
      }
    ]
                       # Z is the keyboard layout (upper and lower case)
                       # with enough spaces around
    'QWERTYUIOP ASDFGHJKL  ZXCVBNM'' '22*11/*.{32|}%+:Z
    2$?0>              # Is the current letter contained in Z and not a space?
    2+                 # Add 2 (i.e. 3 for letters, 2 for any other char)
    R=                 # Take a random code block from above
    ~                  # Execute the block
  }*
}%

19

C, 358 bytes

(Existem apenas três linhas de código, mas quebrei a linha 3 para legibilidade)

#define x putchar
#define y random()
c,n;main(){char*s[26]={"QS","HNV","FVX","EFSX","DRW","CDGR","FHTV","BGJY","KOU","HKNU",
"IJLM","KO","KN","BJM","ILP","OO","AW","EFT","ADWZ","GRY","IJY","BCG","ESQ","CDZ","HTU",
"SX"};while((c=getchar())>0){if(y%10>0&&x(c))continue;if(isalpha(c)&&y%3<1){n=(c&31)-1;
x(s[n][y%strlen(s[n])]|(c&32));continue;}if (y&1)x(x(c));}}

A matriz de strings no início lista as possíveis teclas adjacentes para cada letra do alfabeto. Eu tive que dobrar o "O" (ao lado de "P") para evitar o cálculo random()%1ao selecionar um caractere deslocado.

Execução de teste:

$ echo "This is some correct text. It is too correct. Please un-correctify it." |./a.out
This is some  cofrect teext. It is too correct.. Plleaase un-correctify it..

Atualizar:

Aqui está uma versão expandida e comentada do mesmo código fonte:

#include <stdio.h>
#include <string.h>
/* ^^ These should be included, but the code compiles without them */

int c,n;

void main() {

  /* Adjacent keys for each letter of the alphabet (A, B, C, ..., Z): */
  char *s[26] = { "QS","HNV","FVX","EFSX","DRW","CDGR","FHTV","BGJY","KOU","HKNU",
                  "IJLM","KO","KN","BJM","ILP","OO","AW","EFT","ADWZ","GRY","IJY",
                  "BCG","ESQ","CDZ","HTU","SX" };

  /* Fetch input until null character or EOF reached */
  while ((c=getchar())>0) {

    /* For 90% of the time, just echo the character unchanged */
    if (random()%10>0 && putchar(c)) continue;

    /* If it's a letter of the alphabet, shift with 33% probability */
    if (isalpha(c) && random()%3<1) {
      /* Calculate offset to adjacent keys data */
      n=(c&31)-1;
      /* Choose a random adjacent key, and change to lower case if needed */
      putchar(s[n][random()%strlen(s[n])]|(c&32));
      continue;
    }

    /* If we reach this point, either we didn't fetch an alphabet character, or   */
    /* we did but chose not to shift it. Either way, we now need to either repeat */
    /* the character or delete it, with 50% probability for each. */

    /* This repeats the character by printing the return value from putchar() */
    if (random()&1) putchar(putchar(c));

    /* To delete the character, we don't have to do anything. */
  }
}

2
Tenho certeza de que você não precisa colocar o 26 char*s[26]. O compilador deve ser capaz de descobrir isso sozinho.
FDinoff

@FDinoff Ah, é claro. Agora não há muito ponto em edição; o navio já afundou :-D
ossifrage melindroso 10/02

você também pode substituir os dois continuepor elses. (deixe o local ;onde estava o primeiro).
AShelly

11
Qual é o problema com o random ()% 1? Qualquer int% 1 deve ser 0. #
user253751

18

Ruby, 168

Um pouco mais curto usando uma estratégia de indexação de matriz:

z='qwertyuiop.asdfghjkl...zxcvbnm'+?.*11
gets.chars{|c|$_=z[c]?z:z.upcase
h=[1,-1,11,-11].map{|d|$_[d+~/#{c}/]}-[?.]rescue[]
$><<(rand<0.9?c:[c*2,'',*h.sample].sample)}

Versão original da expressão regular (184):

s='.qwertyuiop.asdfghjkl...zxcvbnm.'
gets.chars{|c|c=~/\w/&&(s[c]?s: s.upcase)=~/((\w).{9})?((\w)|.)#{c}((\w)|.)(.{9}(\w))?/
$><<(rand<0.9?c:[c*2,'',*[*$2,*$4,*$6,*$8].sample].sample)}

3
Desculpe, não consigo ler Ruby. Aqui eu executei este programa 10 vezes com STDIN '0123456789'x10, ou seja, 100 dígitos (ou seja, 1000 dígitos no total em 10 execuções), e nunca houve um dígito duplicado na saída. Existe um problema com esse site ou meu entendimento de como tudo funciona?
precisa saber é o seguinte

@VadimR boa captura, obrigado! Eu comecei a usar Kernel#putcpara imprimir a saída, pois isso não exigia parênteses, poupando-me um caractere. Obviamente, putcapenas imprime o primeiro caractere, e a sequência de saída às vezes pode ter dois caracteres. Erro estúpido. Experimente esta versão!
Paul Prestidge

Perfeito agora. Obrigado.
user2846289

9

Python, 251

from random import*
w=choice
o=ord
print"".join(w([z]*9+[w(["",z*2]+[chr(o(w("DGRC FHTV GJYB UOK HKUN JLIM KO NK BMJ IPL O WA ETF ADWZ RYG YIJ CBG QES ZCD TUH XS SQ VNH XVF SFEX WRD".split()[(o(z)&31)-6]))|o(z)&32)]*z.isalpha())])for z in raw_input())

Técnica de pesquisa muito simples, por um momento achei que seria mais barato codificar o teclado como um gráfico não direcionado, mas a sobrecarga para criar esse tipo em Python se mostrou proibitiva. Como as funções aleatórias do Python têm nomes muito descritivos que eu uso choice()exclusivamente, renomeio-o para w. A chance de 10% de erro é tratada pelo w([z]*9+[...])local em que as nove cópias de um caractere não digitado estão em uma lista com um erro de digitação.

-16 caracteres - obrigado grc, +2 caracteres (e correção, valem muito mais que 2 caracteres) - obrigado Dhara


2
Algumas pequenas melhorias: use espaços como delimitador d="SQ VNH XVF...".split(), remova o espaço depois printe substitua o if/ elsepor ([...]+[...])*z.isalpha(). Além disso, você não precisa de uma variável, dpois você a usa apenas uma vez.
grc

11
Você pode fazer w=__import__('random').choice(pelo menos no Python 3 afaik).
SimonT

11
Esse código é interrompido por vários caracteres de texto:?;: <Etc #
Dhara

11
Além disso, há um erro de um por um na indexação: 'b' em 'bbbbbbbb' é substituído por 'x', 'zzzzzzzzzz' fornece um índice fora dos limites
Dhara

11
Use Python 3 input()e print()salve 2 caracteres.
Cees Timmerman

8

C #, 320 bytes (360 bytes com quebra de programa)

Inclui suporte para letras maiúsculas "deslocadas".

Como uma função (320 bytes):

string T(string s){
    string t="",z="      ",k=z+z+"qwertyuiop asdfghjkl   zxcvbnm";
    k+=k.ToUpper()+z+z;
    int[]m={-11,-1,1,11};
    var r=new System.Random();
    foreach(var c in s){
        if(r.Next(10)>0)
            t+=c;
        else{
            int i=r.Next(k.IndexOf(c)>0?3:2);
            if(i>1){
                while(' '==k[i=k.IndexOf(c)+m[r.Next(4)]]);
                t+=k[i];
            }
            else if(i>0)
                t=(t+c)+c;
        }
    }
    return t;
}

Como um programa que lê uma linha de texto (360 bytes):

using System;
class P{
    static void Main(){
        string t="",z="      ",k=z+z+"qwertyuiop asdfghjkl   zxcvbnm";
        k+=k.ToUpper()+z+z;
        int[]m={-11,-1,1,11};
        var r=new Random();
        foreach(var c in Console.ReadLine()){
            if(r.Next(10)>0)
                t+=c;
            else{
                int i=r.Next(k.IndexOf(c)>0?3:2);
                if(i>1){
                    while(' '==k[i=k.IndexOf(c)+m[r.Next(4)]]);
                    t+=k[i];
                }
                else if(i>0)
                    t=(t+c)+c;
            }
        }
        Console.Write(t);
    }
}

Amostra de saída de entrada:

This is some correct text. It is too correct. Please un-correctify it.
This  is some corrrect texy. Ut is too correct. Pease un-coorrectify it.

TYPO RAGE CAPS TEXT!
TYPPORAGE CAOS TEX!

Os programas C # legais precisam ter pelo menos "classe pública A {static void Main () {}}" para serem válidos. Você precisará ler a partir do console. Mas parece que sua solução ainda será mais curta que a minha, muito bem feita.
Xantix

@ Xantix, eu sei, mas eles nunca disseram que tinha que ser um programa. De qualquer maneira, minha resposta agora inclui pacotes de programas.
Hand-E-Food

Acabei de perceber que minha função aceitará caracteres CR e LF na entrada que podem ser duplicados ou descartados. Isso faria para a saída interessante ...
Mão-E-Food

2
Hmm, chamadas aleatórias insuficientes para dar Func<int,int> n=x=>r.Next(x);uma boa ideia. Se ao menos o compilador pudesse inferir o tipo de delegados ...
Magus

8

JS, 303 , 288 , 275 , 273 , 274 (correção de bug)

function z(s){return s.split('').map(function(d){if((r=Math.random)(b='qwertyuiop0asdfghjkl000zxcvbnm')>.1)return d
if((c=r(x=(d>'`'?b:(b=b.toUpperCase())).indexOf(d))*(/[a-z]/i.test(d)+2))<2)return c>1?d+d:''
for(a=0;!a;)a=b[x+[11,-11,1,-1][~~(r()*4)]]
return a}).join('')}

Algoritmo para o teclado:

  • encontre char na string (ou maiúscula)
  • adicione 11, -11, 1 ou -1 ao índice.
  • se for inválido (0 ou nulo), role novamente

Versão sem golfe por solicitação:

function z (s) {
  return s.split('') // split input string into characters.
          .map( // and then for each character...
    function (d) {
      r = Math.random; // set up a shortened form of Math.random
      // declare keyboard here because we have parens and we can save a delimeter.
      b = 'qwertyuiop0asdfghjkl000zxcvbnm';  
      if (r() > .1) {  // normal case
        return d;
      }
      numOptions = /[a-z]/i.test(d) + 2; // if it's a character, 1+2, else 0+2 options

      // test here because we have parens. x might be -1
      if (d > '`') { 
        x = b.search(d);  // x marks the spot
      } else {
        b = b.toUpperCase();
        x = b.search(d);
      }

      c = r() * numOptions; // chars can be 0-3, non-chars: 0-2
      if (c < 2) {                // this case is simple, so it comes first
        return c>1 ? d + d : ''; // double or omit.
      }

      // we must be in keyslip mode.

      // in the golfed code, this while loop become for loops, 
      // but it's really a while.
      a = 0;
      while (!a) { // that is, a != null && a != 0
        v = ~~(r() * 4); // 0, 1, 2, or 3
        newX = x + [11, -11, 1, -1][v]; // choose one
        a = b[newX];  // slip the key
      }
      return a;
    }
  ) // end the map function
  .join('') // and then reassemble the string
}

Bravo! JS ninja premiado!
Sunny R Gupta

11
@SunnyRGupta Thanks! Gostaria de poder baixar mais. Eu acho que o enorme parênteses do inferno pode torná-lo mais longo do que o necessário.
Não que Charles

Tente também exibir a versão não minificada para iniciantes!
Sunny R Gupta

Bem, tecnicamente, seu código possui 277 bytes no Windows. Você DEVE substituir todas as novas linhas com ;. Essa é a única maneira de dizer que ele realmente tem 274 bytes. Além disso, ele funciona apenas nas versões mais recentes de Javascript e JScript.
Ismael Miguel

6

Perl, 278 239 197 169 162 156 151 149

s#((\pL)|.)#rand>.1?$&:($&x2,'',do{1until/^.{@{[(2,-10,12)[rand 4]-1+index$_=QWERTYUIOP0ASDFGHJKL000ZXCVBNM,uc($,=$&)]}}(\D)/;$,&' '|$1})[rand@-]#ge

Execute com -p, em seguida, 148 + 1 = 149 bytes. Por exemplo:

perl -p typos.pl
Your challenge is to take an arbitrary single line of text, and add typos.
You challenge is to tale an  arbitrary singe lind of text, and add yposs.
This is some correct text. It is too correct. Please un-correctify it.
This iis some correct text. It s too coorrect.Pleqse un-correctify it.

Sem golfe, mais ou menos:

s#((\pL)|.)#rand>.1
    ? $&
    : ($&x2,'',
        do{
            1until/^.{@{[(2,-10,12)[rand 4]-1
                +index$_=QWERTYUIOP0ASDFGHJKL000ZXCVBNM,uc($,=$&)]}}(\D)/;
            $,&' '|$1
        }
    )[rand@-]
#ge

No começo, pensei que escolher o elemento aleatoriamente em uma matriz (de 26 deles de comprimentos diferentes) é mais estatisticamente "limpo" (ou seja, aleatório), mas talvez estivesse errado. (Veja a versão anterior.) Essa última tentativa é, seguindo os líderes :-), percorrer uma sequência com -1,1, -11,11 (aleatoriamente) e repetir até a etapa válida.

Edit: Graças à ajuda do bybyink e outras otimizações, conseguimos reduzir consideravelmente o tamanho do código.

A última abordagem usa alguns truques com a pesquisa regexp para encontrar etapas válidas ao longo da cadeia de substituição, eliminando verificações manuais.

Outra edição: 5 bytes de desconto, porque não precisamos de números inteiros para índices de matriz + pequeno truque com índice de matriz ilegal. Eu tentei o mesmo truque com [-4+rand@-](ou seja, índices negativos) e me livre de um elemento da lista, '',mas ele não salvou nada.

Edit: Voltar à simplicidade - substituir a condição ~~rand 10por rand>.1salva 2 bytes ...


11
Não há necessidade de ponto e vírgula após a definição de sub i. Você não está usando estrito, portanto 'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'pode ser dado como uma palavra de barra (salva dois caracteres de aspas). Da mesma forma, também pode 'Z'(embora isso signifique que você precise adicionar um espaço entre ele e gt, portanto, ele salva apenas um caractere). Economia total: 4 caracteres.
tobyink

11
A construção ($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''pode ser reescrita como ($&x2,'',do{...})[i$&=~/\pL/?3:2]. Isso significa que a avaliação não é preguiçosa (calcula as três maneiras pelas quais o personagem poderia ser substituído antes de decidir sobre uma técnica de substituição), mas funciona e salva outros sete caracteres pelos meus cálculos.
tobyink

11
Ah, acabei de perceber que você também tem espaço em branco antes gt'Z'- isso pode ser descartado. Com todas essas alterações, você poderá reduzi-lo para 184 caracteres.
114414 tobyink

@ tobyink, muito obrigado, especialmente pelo seu segundo comentário - como eu não vi essa construção lá, eu não sei :-(. Sub se foi (economiza alguns bytes). O truque das palavras de barras é bom também, e na verdade eu já estava fazendo isso quando li seu comentário. :-) Obrigado novamente.
user2846289

11
Eu tenho mais um personagem para você. Se você renomear $spara $,(essa variável interna é o separador de campos para print, mas você não está imprimindo vários campos em nenhum lugar, o uso interno é irrelevante, tornando a variável adequada para reutilização), então você pode eliminar o espaço em branco em $s x3fazer apenas $,x3.
tobyink

4

PHP, função com 368 bytes

Aqui está a minha tentativa.

É algum "código de frank", mas meio que funciona.

function _($m){$q=array(array('qwertyuiop','asdfghjkl',' zxcvbnm'),'!.-,;?+/');$r='mt_rand';foreach(str_split($m)as$k=>$c)if(!$r(0,9)&&$c!=' ')foreach($q[0]as$x=>$y)if(($z=strpos($y,$c))!==!1){switch($t=$r(-3,2-($z>>3)-($x>>1))){case 2:++$z;break;case 1:++$x;break;case -1:--$x;break;case -2:--$z;break;case -3:$z=8;break;}$m[$k]=$t?$q[0][$x][$z]:$q[1][$z];}return$m;}

Um código mais "legível":

function _($m)
{
    $q=array(array('qwertyuiop','asdfghjkl',' zxcvbnm'),'!.-,;?+/');
    $r='mt_rand';
    foreach(str_split($m)as$k=>$c)
        if(!$r(0,9)&&$c!=' ')
            foreach($q[0]as$x=>$y)
                if(($z=strpos($y,$c))!==!1)
                {
                    switch($t=$r(-3,2-($z>>3)-($x>>1)))
                    {
                        case 2:
                            ++$z;break;
                        case 1:
                            ++$x;break;
                        case -1:
                            --$x;break;
                        case -2:
                            --$z;break;
                        case -3:
                            $z=8;break;
                    }
                    $m[$k]=$t?$q[0][$x][$z]:$q[1][$z];
                }
    return$m;
}

A única diferença entre os dois códigos é que se tem toneladas de guias e novas linhas.

Não produz o mesmo tipo exato de "incorreto", mas exclui ou substitui um caractere usando as condições mencionadas.

Você pode experimentá-lo em http://writecodeonline.com/php/ .

Copie e cole este código:

function _($m){$q=array(array('qwertyuiop','asdfghjkl',' zxcvbnm'),'!.-,;?+/');$r='mt_rand';foreach(str_split($m)as$k=>$c)if(!$r(0,9)&&$c!=' ')foreach($q[0]as$x=>$y)if(($z=strpos($y,$c))!==!1){switch($t=$r(-3,2-($z>>3)-($x>>1))){case 2:++$z;break;case 1:++$x;break;case -1:--$x;break;case -2:--$z;break;case -3:$z=8;break;}$m[$k]=$t?$q[0][$x][$z]:$q[1][$z];}return$m;}
echo _('This is some correct text. It is too correct. Please un-correctify it.');

Após o teste, diga-me se é uma resposta válida.


Parece não afetar letras maiúsculas.
Ossifrage melindroso

11
As letras maiúsculas não são afetadas no exemplo. Mas sim, não. Mas observe também que eu disse que o KINDA funciona.
Ismael Miguel

3

C #, 581 bytes

using System;class B{static void Main(){var z=Console.ReadLine();var r=new Random();foreach(char C in z){String o;if(r.Next(10)==0){int w=r.Next(3);o=w==0?C+""+C:w==1?"":f(C,r);}else{o=C+"";}Console.Write(o);}Console.ReadLine();}static string f(char C,Random r){string[]k={"00000000000","0qwertyuiop0","0asdfghjkl0","00zxcvbnm0","000000000"};char L=char.ToLower(C);char h='0';for(int i=1;i<4;i++){var d=k[i].IndexOf(L);if(d!=-1){while(h=='0'){int n=r.Next(4);h=n==0?k[i][d-1]:n==1?k[i][d+1]:n==2?k[i-1][d]:k[i+1][d];}h=char.IsUpper(C)?char.ToUpper(h):h;return h+"";}}return C+"";}}

e em um formato mais legível:

using System;

class A
{
    static void Main()
    {
        var z = Console.ReadLine();
        var r = new Random();

        foreach (char C in z)
        {
            String o;

            if (r.Next(10) == 0)
            {
                int w = r.Next(3);
                o = w == 0 ? C + "" + C :
                    w == 1 ? "" :
                             f(C, r);
            }
            else
            {
                o = C + "";
            }

            Console.Write(o);
        }
    }

    static string f(char C, Random r)
    {
        string[] k = {
                            "00000000000", 
                            "0qwertyuiop0", 
                            "0asdfghjkl0", 
                            "00zxcvbnm0", 
                            "000000000"};  
        char L = char.ToLower(C);
        char h = '0';

        for (int i = 1; i < 4; i++)
        {
            var d = k[i].IndexOf(L);

            if (d != -1)
            {
                while (h == '0')
                {
                    int n = r.Next(4);

                    h = n == 0 ? k[i][d - 1] :
                        n == 1 ? k[i][d + 1] :
                        n == 2 ? k[i - 1][d] :
                                 k[i + 1][d];
                }
                h = char.IsUpper(C) ? char.ToUpper(h) : h;
                return h + "";
            }
        }
        return C + "";
    }
}

3

PHP, 326 320 318 315 caracteres

$h=array(qs,vhn,vxf,sefx,wrd,drgc,fthv,gyjb,uko,hukn,jilm,ok,nk,bjm,ilp,o,aw,etf,awdz,rgy,yji,cgb,qse,zdc,thu,sx);$a=x.$argv[1];for(;$d=$a[++$b];)echo!rand(0,9)&&($c=ord($d)-65)?(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?$d.$d:($g<2?"":(($j=$i[rand(0,strlen($i=$h[$c-!$e*32]))])&&$e?strtoupper($j):$j))):$d;

E uma versão mais legível e comentada:

// $a   input
// $b   char iterator
// $c   current char ascii value
// $d   current char
// $e   is uppercase
// $g   rand() output
// $h   char displacement
// $i   current character in $h
// $j   temporary var for uppercasing

// the neighbouring characters of a-z, in alphabetical (and ASCII) order
$h=array(qs,vhn,vxf,sefx,wrd,
    drgc,fthv,gyjb,uko,hukn,
    jilm,ok,nk,bjm,ilp,
    o,aw,etf,awdz,rgy,
    yji,cgb,qse,zdc,thu,
    sx);
// input from argument
$a=x.$argv[1];

for(;$d=$a[++$b];)
    echo!rand(0,9)&&($c=ord($d)-65)? /* 10% chance, read char ASCII value - 65 into $c */
        (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?
          /* random number from 0 to 2 (if alphabetic) or 0 to 1 stored in $g */
            $d.$d: /* double char if $g = 0 */
            ($g<2?
                "": /* omit char if $g = 1*/
                (($j=$i[rand(0,strlen($i=$h[$c-!$e*32]))])&&$e?
                  /* $j = random neighbour of the current char */
                    strtoupper($j): /* uppercase $j */
                    $j)))
        :$d; /* keep char */

Ainda poderia ser melhorado, suponho.

-2, -3 graças a Ismael Miguel


11
Onde você (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)?2:1))alterou (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?e salvará 2 bytes.
Ismael Miguel

11
Onde você tem ($e?0:32), substituindo por 32*!!$e(observe a falta de parênteses), economize 2 bytes. Se $eSEMPRE for booleano, você pode fazer 32*!$ee salvar 3 bytes. Isso funcionará porque o php tem precedência aritmética. Isso significa que multiplicações e divisões são feitas antes de qualquer adição e subtração.
Ismael Miguel

2

Java (475 bytes)

Esta é a minha tentativa na linguagem detalhada que é Java. Obter números aleatórios é bastante longo em Java, e o mapeamento não é realmente eficiente. Provavelmente pode ser melhorado.

import static java.lang.Math.*;public class T{public static void main(String[]a){String z="",v;for(char c:a[0].toCharArray()){double g=random()*60;if(g>=6)z+=c;else{boolean u='A'<=c&c<='Z',l='a'<=c&c<='z';if(g<(l|u?2:3))z+=""+c+c;else if((l|u)&g<4){v="qs,hnv,fvx,efsx,drw,cdgr,fhtv,kou,bgjy,hknu,ijlm,ko,kn,bjm,ilp,o,aw,eft,adwz,gry,ijy,bcg,eqs,cdz,htu,sx".split(",")[u?c-'A':c-'a'];c=v.charAt((int)(random()*v.length()));z+=u?(char)(c-'a'+'A'):c;}}}System.out.println(z);}}

Uso:

java T "This is some correct text. It is too correct. Please un-correctify it."

Não compactado, elogios adicionados:

import static java.lang.Math.*; // Need random()

public class T {
    public static void main(String[] a) {
        String z = "", v;
        for (char c : a[0].toCharArray()) {
            double g = random() * 60; // Compute random only once for two cases.
            if (g >= 6) {
                // 90% must be correct (accolades are stripped)
                // so we just copy the character.
                z += c;
            } else {
                // These tests come often.
                boolean u = 'A' <= c & c <= 'Z', l = 'a' <= c & c <= 'z';

                // reuse the random. g is [0,6[.
                if (g < (l | u ? 2 : 3)) { 
                    // If c is an ascii letter (l|u) then g must be [0,2[ ; if not, then g must be [0,3[.
                    // If those conditions are met, we duplicate the character
                    z += "" + c + c;
                } else if ((l | u) & g < 4) {
                    // if c is letter and g [2,4[ then we perform the wrong key event.
                    // I could not compress it using the keyboard mapping shorter in Java than expanding it like it is now.
                    v = "qs,hnv,fvx,efsx,drw,cdgr,fhtv,kou,bgjy,hknu,ijlm,ko,kn,bjm,ilp,o,aw,eft,adwz,gry,ijy,bcg,eqs,cdz,htu,sx".split(",")[u ? c - 'A' : c - 'a'];
                    // get a random character from the string.
                    c = v.charAt((int) (random() * v.length()));

                    // Keep the case of the character.
                    z += u ? (char) (c - 'a' + 'A') : c;
                } else { // if c is not an ascii letter or if g is [4,6[
                    // Do nothing. This else is stripped.
                }
            }
        }
        System.out.println(z);
    }
}

2

AutoHotkey 441 bytes

A entrada deve ser fornecida como um parâmetro de linha de comando, a saída é fornecida como uma mensagem de erro.

Versão Golfed

loop, analisar, 1
{
k: = {1: "q", 2: "w", 3: "e", 4: "r", 5: "t", 6: "y", 7: "u", 8: "i ", 9:" o ", 10:" p ", 21:" a ", 22:" s ", 23:" d ", 24:" f ", 25:" g ", 26:" h ", 27: "j", 28: "k", 29: "l", 42: "z", 43: "x", 44: "c", 45: "v", 46: "b", 47: "n", 48: "m"}, a: = A_LoopField, q: = r (z? 3: 2), z =
se r (10)! = 10 {
h. = a
continuar
}
para x, y em k
z: = y = a? x: z
se q = 1
h. = aa
se q = 3
{
Ciclo{
t: = r (4), w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
} até k.HasKey (w)
h. = k [w]
}
}
jogue% h
r (n) {
Aleatório, w, 1, n
retorno w
}

Versão sem golfe e anotada (a diferença é que esta versão possui mais espaço em branco e as atribuições de variáveis ​​estão em linhas separadas para facilitar a leitura.)

k: = {1: "q", 2: "w", 3: "e", 4: "r", 5: "t", 6: "y", 7: "u", 8: "i ", 9:" o ", 10:" p ", 21:" a ", 22:" s ", 23:" d ", 24:" f ", 25:" g ", 26:" h ", 27: "j", 28: "k", 29: "l", 42: "z", 43: "x", 44: "c", 45: "v", 46: "b", 47: "n", 48: "m"}
loop, analisar, 1
{
    a: = A_LoopField
    ; obtenha um número aleatório de 1 a 10 e verifique se é 10
    ; se não estiver, pule o restante desta iteração
    se r (10)! = 10
    {
        h. = a
        continuar
    }

    ; verifique se o caractere atual está no k
    z =
    para x, y em k
        z: = y = a? x: z

    ; escolha um número aleatório para decidir qual erro de digitação deve ser feito
    q: = r (z? 3: 2)
    se q = 1
        h. = aa; duplicar a chave
    se q = 3
    {
        ; a matriz do teclado é configurada para que, adicionando ou subtraindo
        ; 20 do índice, você está subindo ou descendo uma linha
        ; e adicionando ou subtraindo 1 você move para a direita ou esquerda
        ; então você só precisa verificar se o índice ajustado
        ; é válido
        Ciclo
        {
            t: = r (4)
            w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
        } até se k.HasKey (w)
        h. = k [w]
    }
}
; exibe a string como uma mensagem de erro
jogue% h
r (n)
{
    Aleatório, w, 1, n
    retorno w
}

Com quais programas isso funciona?
Ismael Miguel

É executado pelo AutoHotkey.exe. autohotkey.com
Person93
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.