Masukkan kesalahan ketik ke dalam teks


63

Saya menulis beberapa teks, tetapi terlihat terlalu profesional. Saya ingin membuatnya terlihat seperti saya benar-benar lelah ketika saya menulisnya. Saya ingin Anda memasukkan beberapa kesalahan ketik.

Tantangan Anda adalah mengambil satu baris teks sembarang, dan menambahkan kesalahan ketik. Ini berarti bahwa untuk setiap karakter, akan ada peluang 10% untuk itu diketikkan.

Definisi "typofied" adalah Anda harus memilih (secara acak) salah satu dari yang berikut:

  • Gandakan karakter.
  • Hapus karakter.
  • Geser karakter satu ruang keyboard. "Keyboard" didefinisikan sebagai:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    Untuk perubahan karakter, Anda harus naik satu spasi, turun, kiri, atau kanan. Ini harus dipilih secara acak. Opsi shift hanya berlaku untuk karakter alfabet. Kasing harus dilestarikan. Berhati-hatilah dengan kasus tepi, seperti m!

Definisi "acak" adalah bahwa hasilnya tidak dapat diprediksi (dengan melihat hasil sebelumnya). Misalnya, Anda tidak dapat mengetik setiap karakter kesepuluh. Selanjutnya, keacakan harus memiliki distribusi yang merata. Misalnya, Anda tidak dapat melakukan 30% duplikat, 30% menghapus, dan 40% shift; itu harus menjadi 1/3 kesempatan untuk masing-masing (1/2 untuk masing-masing jika itu adalah karakter nonalphabetic).

Input contoh:

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

Contoh output:

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

Ini adalah , jadi kode terpendek dalam byte akan menang.


4
Bagaimana dengan secara tidak sengaja memencet tombol capslock? Ketika seseorang mengetik "A" atau "Z", harus ada kesempatan acak bahwa mereka akan menekan capslock sebagai gantinya, ND AKHIR SEPERTI INI.
AJMansfield

2
@AJMansfield Lol, itu mungkin terlalu rumit. Ini sudah cukup rumit seperti: P
Gagang Pintu

1
@ user2509848 Hei, berhenti, aking itu, bijih co, dijelaskan dari yang sudah ada! :-P
Gagang Pintu

1
@Doorknob Contoh output Anda tidak tampak seperti Anda lelah , sepertinya Anda baru mengetik dan Anda tidak tahu cara memperbaiki kesalahan ketik. (Atau Anda tidak melihat apa yang Anda ketikkan sama sekali. )
Blacklight Shining

1
"kasus tepi" <- Saya melihat apa yang Anda lakukan di sana. * tepuk tangan lambat *
Adam Maras

Jawaban:


15

GolfScript, 120 karakter

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

Kode dapat diuji di sini .

{                      # 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 byte

(Hanya ada tiga baris kode, tapi saya sudah putus baris 3 untuk keterbacaan)

#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));}}

Array string di awal daftar kemungkinan kunci yang berdekatan untuk setiap huruf alfabet. Saya harus menggandakan "O" (berdekatan dengan "P") untuk menghindari perhitungan random()%1ketika memilih karakter yang digeser.

Uji coba:

$ 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..

Memperbarui:

Inilah versi kode sumber yang diperluas dan dikomentari:

#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
Saya cukup yakin Anda tidak perlu memasukkan 26 char*s[26]. Kompilator harus dapat mengetahuinya sendiri.
FDinoff

@Finoff Ah, tentu saja. Tidak banyak gunanya mengedit sekarang; kapal sudah tenggelam :-D
lubang air deras

Anda juga bisa mengganti keduanya continuedengan elses. (tinggalkan ;tempat yang pertama).
AShelly

1
Apa masalah dengan random ()% 1? Setiap% int 1 harus 0.
user253751

18

Ruby, 168

Pengambilan sedikit lebih singkat menggunakan strategi pengindeksan larik:

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)}

Versi ekspresi reguler asli (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
Maaf, saya tidak bisa membaca Ruby. Di sini saya menjalankan program ini 10 kali dengan STDIN '0123456789'x10 yaitu 100 digit (yaitu total 1000 digit dalam 10 kali berjalan), dan tidak pernah ada duplikat digit dalam output. Apakah ada masalah dengan situs itu, atau pemahaman saya tentang cara kerjanya?
user2846289

@Adv tangkapan yang bagus, terima kasih! Saya sudah mulai menggunakan Kernel#putcuntuk mencetak output karena itu tidak memerlukan parens, menyelamatkan saya satu karakter. Tentu saja putchanya mencetak karakter pertama, dan string output kadang-kadang bisa dua karakter. Kesalahan bodoh. Coba versi ini!
Paul Prestidge

Sempurna sekarang. Terima kasih.
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())

Teknik pencarian yang sangat sederhana, untuk sesaat saya pikir mungkin lebih murah untuk menyandikan keyboard sebagai grafik yang tidak terarah tetapi overhead untuk membuat tipe seperti itu di Python terbukti penghalang. Karena fungsi acak Python memiliki nama yang terlalu deskriptif, saya menggunakan choice()secara eksklusif, menamainya menjadi w. Peluang kesalahan 10% ditangani di w([z]*9+[...])mana sembilan salinan karakter yang tidak diketik ada dalam daftar dengan satu kesalahan ketik.

-16 karakter - terima kasih grc, +2 karakter (dan kebenarannya, bernilai lebih dari 2 karakter) - terima kasih Dhara


2
Beberapa perbaikan kecil: gunakan spasi sebagai pembatas d="SQ VNH XVF...".split(), hapus spasi setelahnya print, dan ganti if/ elsedengan ([...]+[...])*z.isalpha(). Juga, Anda tidak perlu variabel dkarena Anda hanya menggunakannya sekali.
grc

1
Anda dapat melakukannya w=__import__('random').choice(setidaknya dalam Python afaik 3).
SimonT

1
Kode ini pecah dengan beberapa karakter teks:?;: <Dll
Dhara

1
Juga, ini memiliki kesalahan off-by-one dalam pengindeksan: 'b' dalam 'bbbbbbbb' digantikan oleh 'x', 'zzzzzzzzzz' memberikan indeks di luar batas
Dhara

1
Gunakan Python 3 input()dan print()untuk menyimpan 2 karakter.
Cees Timmerman

8

C #, 320 byte (360 byte dengan pembungkus program)

Termasuk dukungan untuk huruf besar "bergeser".

Sebagai fungsi (320 byte):

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;
}

Sebagai program yang membaca sebaris teks (360 byte):

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);
    }
}

Sampel keluaran input:

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!

Program C # legal harus memiliki setidaknya "kelas publik A {static void Main () {}}" untuk valid. Anda kemudian harus membaca dari konsol. Tapi sepertinya solusimu masih lebih pendek daripada milikku, jadi dilakukan dengan baik.
Xantix

@Xantix, saya tahu, tetapi mereka tidak pernah mengatakan itu harus menjadi sebuah program. Bagaimanapun, jawaban saya sekarang termasuk bungkus program.
Hand-E-Food

Saya baru sadar, fungsi saya akan menerima karakter CR dan LF di input yang berpotensi digandakan atau dihapus. Itu akan menghasilkan output yang menarik ...
Hand-E-Food

2
Hmm, tidak cukup panggilan acak untuk membuat Func<int,int> n=x=>r.Next(x);ide bagus. Andai saja kompiler dapat menyimpulkan tipe delegasi ...
Magus

8

JS, 303 , 288 , 275 , 273 , 274 (perbaikan 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('')}

Algoritma untuk keylip:

  • temukan char dalam string (atau huruf besar)
  • tambahkan 11, -11, 1 atau -1 ke indeks.
  • jika tidak valid (0 atau nol), putar ulang

Versi Non-Golf per permintaan:

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! Ninja ninja diberikan!
Sunny R Gupta

1
@SunnyRGupta Terima kasih! Seandainya aku bisa menurunkannya. Saya pikir neraka kurung besar mungkin membuatnya lebih lama dari yang dibutuhkan.
Bukan karena Charles

Coba juga untuk menampilkan versi non-minified untuk pemula!
Sunny R Gupta

Nah, secara teknis kode Anda memiliki 277 byte di windows. Anda HARUS mengganti semua baris baru dengan ;. Itulah satu-satunya cara untuk mengatakan bahwa ia sebenarnya memiliki 274 byte. Selain itu, ini hanya berfungsi pada versi Javascript dan JScript yang lebih baru.
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

Jalankan dengan -p, kemudian 148 +1 = 149 byte. Misalnya:

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.

Tidak golf, kurang lebih:

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

Pada awalnya saya berpikir bahwa memilih elemen secara acak dalam array (dari 26 dari mereka dengan panjang yang berbeda) secara statistik lebih 'bersih' (yaitu acak), tapi mungkin itu salah. (Lihat versi sebelumnya.) Upaya terakhir ini adalah, mengikuti pemimpin :-), melangkah sepanjang string dengan -1,1, -11,11 (secara acak) dan ulangi hingga langkah yang valid.

Sunting: Berkat bantuan tobyink dan optimisasi lainnya, kami berhasil mengurangi ukuran kode secara signifikan.

Pendekatan terakhir menggunakan beberapa trik dengan pencarian regexp untuk menemukan langkah yang valid di sepanjang string substitusi, menghilangkan pemeriksaan manual.

Suntingan lain: mati 5 byte karena kita tidak perlu integer untuk indeks array + trik kecil dengan indeks array ilegal. Saya mencoba trik yang sama dengan [-4+rand@-](yaitu indeks negatif) dan menyingkirkan satu elemen daftar, '',tetapi tidak menyimpan apa pun.

Sunting: Kembali ke kesederhanaan - mengganti kondisi ~~rand 10dengan rand>.1menghemat 2 byte ...


1
Tidak perlu titik koma setelah definisi sub i. Anda tidak menggunakan ketat, jadi 'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'dapat diberikan sebagai kata kunci (menyimpan dua karakter tanda kutip). Demikian pula, bisa 'Z'(meskipun ini berarti Anda perlu menambahkan spasi di antara itu dan gt, jadi itu hanya menyimpan satu karakter). Total penghematan: 4 karakter.
tobyink

1
Konstruk ($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''dapat ditulis ulang sebagai ($&x2,'',do{...})[i$&=~/\pL/?3:2]. Ini berarti bahwa evaluasi tidak malas (itu menghitung ketiga cara karakter dapat diganti sebelum memutuskan teknik substitusi), tetapi berhasil, dan menyimpan tujuh karakter lain dengan perhitungan saya.
tobyink

1
Oh, saya perhatikan Anda juga memiliki spasi putih gt'Z'- itu bisa dibatalkan. Dengan semua perubahan ini, Anda harus bisa mendapatkannya hingga 184 karakter.
tobyink

@tobyink, terima kasih banyak, terutama untuk komentar kedua Anda - bagaimana saya tidak melihat konstruk ini di sana, saya tidak tahu :-(. Sub sudah hilang (menghemat beberapa byte). Trik kata kunci bagus juga, dan sebenarnya saya sudah melakukannya ketika saya membaca komentar Anda. :-) Terima kasih lagi.
user2846289

1
Saya punya satu karakter lagi untuk Anda. Jika Anda mengganti nama $smenjadi $,(variabel bawaan ini adalah pemisah bidang untuk print, tetapi Anda tidak mencetak beberapa bidang di mana saja, jadi penggunaan bawaan itu tidak relevan, menjadikan variabel matang untuk digunakan kembali), maka Anda dapat menghilangkan ruang putih dalam $s x3membuatnya adil $,x3.
tobyink

4

PHP, berfungsi dengan 368 byte

Ini usahaku.

Ini beberapa "frankencode", tetapi agak berhasil.

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;}

Kode yang lebih "dapat dibaca":

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;
}

Satu-satunya perbedaan antara 2 kode adalah bahwa satu memiliki banyak tab dan baris baru.

Itu tidak menghasilkan jenis "kesalahan" yang sama persis, tetapi menghapus atau mengganti char menggunakan kondisi tersebut.

Anda dapat mencobanya di http://writecodeonline.com/php/ .

Salin dan tempel kode ini:

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.');

Setelah pengujian, tolong, beri tahu saya jika itu adalah jawaban yang valid.


Tampaknya tidak mempengaruhi huruf kapital sama sekali.
squeamish ossifrage

1
Huruf kapital tidak terpengaruh dalam contoh. Tapi ya, tidak. Tetapi perhatikan juga bahwa saya mengatakan bahwa KINDA berfungsi.
Ismael Miguel

3

C #, 581 byte

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+"";}}

dan dalam format yang lebih mudah dibaca:

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 karakter

$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;

Dan versi yang lebih mudah dibaca dan dikomentari:

// $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 */

Masih bisa ditingkatkan, saya kira.

-2, -3 terima kasih kepada Ismael Miguel


1
Di mana Anda memiliki (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)?2:1))perubahan (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?dan Anda akan menghemat 2 byte.
Ismael Miguel

1
Di mana Anda memiliki ($e?0:32), mengganti dengan 32*!!$e(perhatikan kurangnya tanda kurung) simpan 2 byte. Jika $eSELALU boolean, Anda dapat melakukannya 32*!$edan Anda menghemat 3 byte. Ini akan berhasil karena php memiliki prioritas aritmatika. Ini berarti bahwa penggandaan dan pembagian dibuat sebelum ada penambahan dan pengurangan.
Ismael Miguel

2

Java (475 bytes)

Ini adalah percobaan saya dalam bahasa verbose yaitu Java. Mendapatkan nomor acak cukup lama di Jawa, dan pemetaannya tidak terlalu efisien. Mungkin bisa ditingkatkan.

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);}}

Pemakaian:

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

Tanpa kompresi, pujian ditambahkan:

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 byte

Input harus diberikan sebagai parameter baris perintah, output diberikan sebagai pesan kesalahan.

Versi golf

loop, parse, 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 =
if r (10)! = 10 {
h. = a
terus
}
untuk x, y di k
z: = y = a? x: z
jika q = 1
h. = aa
jika q = 3
{
Loop {
t: = r (4), w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
} sampai k.HasKey (w)
h. = k [w]
}
}
throw% h
r (n) {
Acak, w, 1, n
kembali w
}

Versi yang tidak di-golf dan dianotasi (perbedaannya adalah bahwa versi ini memiliki lebih banyak ruang putih dan penugasan variabel berada di baris terpisah untuk dibaca.)

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, parse, 1
{
    a: = A_LoopField
    ; dapatkan nomor acak dari 1-10 dan periksa apakah nomornya 10
    ; jika tidak melewati sisa iterasi ini
    jika r (10)! = 10
    {
        h. = a
        terus
    }

    ; periksa apakah karakter saat ini dalam k
    z =
    untuk x, y di k
        z: = y = a? x: z

    ; pilih nomor acak untuk memutuskan kesalahan ketik apa yang harus dilakukan
    q: = r (z? 3: 2)
    jika q = 1
        h. = aa; duplikat kuncinya
    jika q = 3
    {
        ; array keyboard diatur sehingga dengan menambah atau mengurangi
        ; 20 dari indeks Anda bergerak naik atau turun berturut-turut
        ; dan dengan menambahkan atau mengurangi 1 Anda bergerak ke kanan atau kiri
        ; maka Anda hanya perlu memeriksa apakah indeksnya sudah disesuaikan
        ; adalah benar
        Loop
        {
            t: = r (4)
            w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
        } sampai jika k.HasKey (w)
        h. = k [w]
    }
}
; menampilkan string sebagai pesan kesalahan
throw% h
r (n)
{
    Acak, w, 1, n
    kembali w
}

Dengan program apa ini bekerja?
Ismael Miguel

Dijalankan oleh AutoHotkey.exe. autohotkey.com
Person93
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.