Chèn lỗi chính tả vào văn bản


63

Tôi đã viết một số văn bản, nhưng nó trông quá chuyên nghiệp. Tôi muốn làm cho nó trông giống như tôi thực sự mệt mỏi khi tôi viết nó. Tôi cần bạn chèn một số lỗi chính tả.

Thách thức của bạn là lấy một dòng văn bản tùy ý và thêm lỗi chính tả. Điều này có nghĩa là với mỗi nhân vật, sẽ có 10% cơ hội để nó được đánh máy.

Định nghĩa của "typofied" là bạn phải chọn (ngẫu nhiên) một trong những điều sau đây:

  • Nhân đôi nhân vật.
  • Xóa ký tự.
  • Di chuyển nhân vật một không gian bàn phím. "Bàn phím" được định nghĩa là:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    Đối với sự thay đổi nhân vật, bạn phải đi một khoảng trống lên, xuống, sang trái hoặc phải. Điều này phải được chọn ngẫu nhiên. Tùy chọn thay đổi chỉ áp dụng cho các ký tự chữ cái. Trường hợp phải được bảo quản. Hãy cẩn thận với các trường hợp cạnh, như m!

Định nghĩa của "ngẫu nhiên" là kết quả không được dự đoán trước (bằng cách nhìn vào kết quả trước đó). Ví dụ, bạn không thể đánh máy mọi ký tự thứ mười. Hơn nữa, tính ngẫu nhiên phải có phân phối đồng đều. Ví dụ: bạn không thể thực hiện sao chép 30%, xóa 30% và thay đổi 40%; nó phải là một cơ hội 1/3 cho mỗi (1/2 cho mỗi nếu đó là một nhân vật không mắc bệnh).

Ví dụ đầu vào:

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

Ví dụ đầu ra:

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

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng.


4
Điều gì về việc vô tình nhấn phím capslock? Khi một người gõ "A" hoặc "Z", sẽ có một cơ hội ngẫu nhiên rằng họ sẽ nhấn capslock thay vào đó, ND KẾT THÚC NHƯ VẬY.
AJMansfield

2
@AJMansfield Lol, điều đó có lẽ sẽ quá phức tạp. Nó đã đủ phức tạp như nó là: P
Doorknob

1
@ user2509848 Này, dừng lại, hỏi nó, quặng đồng, được coi là đã hơn! :-P
Doorknob

1
@Doorknob Kết quả ví dụ của bạn không có vẻ như bạn mệt mỏi , có vẻ như bạn chưa quen với việc gõ và bạn không biết cách sửa lỗi chính tả. (Hoặc bạn không nhìn vào những gì bạn đã nhập . )
Blacklight Shining

1
"trường hợp cạnh" <- Tôi thấy những gì bạn đã làm ở đó. * vỗ tay chậm *
Adam Maras

Câu trả lời:


15

GolfScript, 120 ký tự

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

Mã có thể được kiểm tra ở đây .

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

(Chỉ có ba dòng mã, nhưng tôi đã chia dòng 3 để dễ đọc)

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

Mảng các chuỗi ở đầu liệt kê các phím liền kề có thể có cho mỗi chữ cái của bảng chữ cái. Tôi đã phải tăng gấp đôi chữ "O" (liền kề với "P") để tránh tính toán random()%1khi chọn ký tự thay đổi.

Chạy thử nghiệm:

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

Cập nhật:

Đây là phiên bản mở rộng và nhận xét của cùng một mã nguồn:

#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
Tôi khá chắc chắn rằng bạn không cần phải đặt 26 vào char*s[26]. Trình biên dịch sẽ có thể tự tìm ra điều đó.
FDinoff

@FDinoff À, tất nhiên rồi. Không chỉnh sửa nhiều điểm bây giờ; con tàu đã bị chìm :-D
ossifrage squeamish

bạn cũng có thể thay thế cả continues bằng elses. (rời khỏi ;nơi đầu tiên là).
HỎI

1
Có vấn đề gì với ngẫu nhiên ()% 1? Bất kỳ int% 1 nào cũng phải là 0.
user253751

18

Ruby, 168

Hơi ngắn hơn khi sử dụng chiến lược lập chỉ mục mảng:

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

Phiên bản biểu thức chính quy gốc (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
Xin lỗi, tôi không thể đọc Ruby. Ở đây tôi đã chạy chương trình này 10 lần với STDIN '0123456789'x10 tức là 100 chữ số (tức là 1000 chữ số trong 10 lần chạy) và không bao giờ có chữ số trùng lặp trong đầu ra. Có một vấn đề với trang web đó, hoặc sự hiểu biết của tôi về cách tất cả hoạt động?
dùng2846289

@VadimR bắt tốt, cảm ơn! Tôi đã bắt đầu sử dụng Kernel#putcđể in ra đầu ra vì điều đó không yêu cầu parens, tiết kiệm cho tôi một ký tự. Tất nhiên putcchỉ in ký tự đầu tiên và chuỗi đầu ra đôi khi có thể dài hai ký tự. Sai lầm ngu ngốc. Hãy thử phiên bản này!
Paul Prestidge

Hoàn hảo bây giờ. Cảm ơn bạn.
dùng2846289

9

Con trăn

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

Kỹ thuật tra cứu rất đơn giản, trong một khoảnh khắc tôi đã nghĩ rằng có thể rẻ hơn để mã hóa bàn phím dưới dạng đồ thị không bị chặn nhưng chi phí để tạo ra một loại như vậy trong Python đã bị cấm. Vì các hàm ngẫu nhiên của Python có các tên quá mô tả mà tôi sử dụng choice()riêng, nên đổi tên thành w. 10% khả năng lỗi được xử lý bằng cách w([z]*9+[...])chín bản sao của một ký tự không đánh máy nằm trong một danh sách có một lỗi đánh máy.

-16 ký tự - cảm ơn grc, +2 ký tự (và chính xác, đáng giá hơn 2 ký tự) - cảm ơn Dhara


2
Một số cải tiến nhỏ: sử dụng khoảng trắng làm dấu phân cách d="SQ VNH XVF...".split(), xóa khoảng trắng sau printvà thay thế if/ elsebằng ([...]+[...])*z.isalpha(). Ngoài ra, bạn không cần một biến dvì bạn chỉ sử dụng nó một lần.
grc

1
Bạn có thể làm w=__import__('random').choice(ít nhất là trong Python 3 afaik).
SimonT

1
Mã này phá vỡ với một số ký tự văn bản:?;: <Vv
Dhara

1
Ngoài ra, nó có một lỗi xảy ra khi lập chỉ mục: 'b' trong 'bbbbbbbb' được thay thế bằng 'x', 'zzzzzzzzzz' đưa ra một chỉ số ngoài giới hạn
Dhara

1
Sử dụng Python 3 input()print()để lưu 2 ký tự.
Cees Timmerman

8

C #, 320 byte (360 byte với gói chương trình)

Bao gồm hỗ trợ cho các chữ cái viết hoa "thay đổi".

Là một hàm (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;
}

Là một chương trình đọc một dòng văn bản (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);
    }
}

Mẫu đầu ra đầu vào:

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!

Các chương trình C # hợp pháp cần phải có ít nhất "lớp công khai A {static void Main () {}}" để hợp lệ. Sau đó bạn sẽ cần phải đọc từ bảng điều khiển. Nhưng có vẻ như giải pháp của bạn vẫn sẽ ngắn hơn của tôi, vậy là xong.
Xantix

@Xantix, tôi biết, nhưng họ không bao giờ nói nó phải là một chương trình. Dù bằng cách nào, câu trả lời của tôi bây giờ bao gồm các gói chương trình.
Thực phẩm điện tử cầm tay

Tôi mới nhận ra, chức năng của tôi sẽ chấp nhận các ký tự CR và LF trong đầu vào có khả năng tăng gấp đôi hoặc giảm. Điều đó sẽ tạo ra kết quả thú vị ...
Hand-E-Food

2
Hmm, không đủ các cuộc gọi ngẫu nhiên để thực hiện Func<int,int> n=x=>r.Next(x);một ý tưởng tốt. Nếu chỉ có trình biên dịch có thể suy ra loại dành cho đại biểu ...
Magus

8

JS, 303 , 288 , 275 , 273 , 274 (sửa lỗi)

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

Thuật toán cho keylip:

  • tìm char trong chuỗi (hoặc chữ hoa)
  • thêm 11, -11, 1 hoặc -1 vào chỉ mục.
  • nếu nó không hợp lệ (0 hoặc null), hãy cuộn lại

Phiên bản không chơi gôn theo yêu cầu:

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! Giải thưởng ninja ninja!
Sunny R Gupta

1
@SunnyRGupta Cảm ơn! Ước gì tôi có thể lấy nó xuống nhiều hơn. Tôi nghĩ rằng địa ngục lớn có thể làm cho nó dài hơn cần thiết.
Không phải Charles

Cũng cố gắng hiển thị phiên bản không rút gọn cho người mới!
Sunny R Gupta

Về mặt kỹ thuật, mã của bạn có 277 byte trên windows. Bạn NÊN thay thế tất cả các dòng mới với ;. Đó là cách duy nhất để nói rằng nó thực sự có 274 byte. Bên cạnh đó, nó chỉ hoạt động trên các phiên bản Javascript và JScript mới hơn.
Ismael Miguel

6

Perl, 278 239 197 169 162 156 151 149 149

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

Chạy với -p, sau đó 148 + 1 = 149 byte. Ví dụ:

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.

Không chơi gôn, nhiều hay ít:

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

Lúc đầu, tôi nghĩ rằng việc chọn phần tử ngẫu nhiên trong một mảng (trong số 26 phần tử có độ dài khác nhau) sẽ thống kê hơn 'sạch' (nghĩa là ngẫu nhiên), nhưng có lẽ nó đã sai. (Xem phiên bản trước.) Lần thử cuối cùng này là, theo các nhà lãnh đạo :-), bước dọc theo chuỗi bằng -1,1, -11,11 (ngẫu nhiên) và lặp lại cho đến bước hợp lệ.

Chỉnh sửa: Nhờ trợ giúp tobyink và tối ưu hóa khác, chúng tôi đã quản lý để giảm đáng kể kích thước mã.

Cách tiếp cận cuối cùng sử dụng một số thủ thuật với tìm kiếm regrec để tìm bước hợp lệ dọc theo chuỗi thay thế, loại bỏ kiểm tra thủ công.

Một chỉnh sửa khác: tắt 5 byte vì chúng tôi không cần số nguyên cho chỉ mục mảng + mẹo nhỏ với chỉ mục mảng bất hợp pháp. Tôi đã thử cùng một mẹo với [-4+rand@-](tức là các chỉ mục tiêu cực) và loại bỏ một yếu tố danh sách, '',nhưng nó không tiết kiệm được gì.

Chỉnh sửa: Trở lại đơn giản - thay thế điều kiện ~~rand 10bằng cách rand>.1lưu 2 byte ...


1
Không cần phải có dấu chấm phẩy sau định nghĩa sub i. Bạn không sử dụng nghiêm ngặt, vì vậy 'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'có thể được cung cấp dưới dạng bareword (lưu hai ký tự dấu ngoặc kép). Tương tự như vậy, có thể 'Z'(mặc dù điều này có nghĩa là bạn cần thêm khoảng trắng giữa nó và gtvì vậy nó chỉ lưu một ký tự). Tổng số tiền tiết kiệm: 4 ký tự.
tobyink

1
Cấu trúc ($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''có thể được viết lại như ($&x2,'',do{...})[i$&=~/\pL/?3:2]. Điều đó có nghĩa là việc đánh giá không lười biếng (nó tính toán cả ba cách mà nhân vật có thể được thay thế trước khi quyết định kỹ thuật thay thế), nhưng nó hoạt động và nó tiết kiệm được bảy ký tự khác theo tính toán của tôi.
tobyink

1
Ồ, tôi chỉ nhận thấy bạn có khoảng trắng trước đây gt'Z'- điều đó có thể bị loại bỏ. Với tất cả những thay đổi này, bạn sẽ có thể giảm xuống còn 184 ký tự.
tobyink

@tobyink, cảm ơn rất nhiều, đặc biệt là cho nhận xét thứ hai của bạn - làm thế nào tôi không thấy cấu trúc này ở đó, tôi không biết :-(. Sub đã biến mất (tiết kiệm cho chúng tôi một vài byte). và thực sự tôi đã làm điều đó khi đọc bình luận của bạn. :-) Cảm ơn một lần nữa.
dùng2846289

1
Tôi đã có thêm một nhân vật cho bạn. Nếu bạn đổi tên $sthành $,(biến tích hợp này là dấu tách trường cho print, nhưng bạn không in nhiều trường ở bất kỳ đâu, do đó, việc sử dụng tích hợp là không liên quan, làm cho biến trở nên chín muồi để sử dụng lại), sau đó bạn có thể loại bỏ khoảng trắng trong $s x3việc làm cho nó chỉ $,x3.
tobyink

4

PHP, hàm với 368 byte

Đây là nỗ lực của tôi.

Đó là một số "frankencode", nhưng nó kinda hoạt động.

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

Mã "dễ đọc" hơn:

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

Sự khác biệt duy nhất giữa 2 mã là một mã có hàng tấn tab và dòng mới.

Nó không tạo ra cùng một loại "không chính xác", nhưng nó sẽ xóa hoặc thay thế một char sử dụng các điều kiện đã nói.

Bạn có thể dùng thử tại http://writecodeonline.com/php/ .

Sao chép và dán mã này:

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

Sau khi kiểm tra, xin vui lòng, cho tôi biết nếu đó là một câu trả lời hợp lệ.


Nó dường như không ảnh hưởng đến chữ in hoa.
squossish ossifrage

1
Các chữ in hoa không bị ảnh hưởng trong ví dụ. Nhưng vâng, nó không. Nhưng cũng lưu ý rằng tôi đã nói rằng nó KINDA hoạt động.
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+"";}}

và ở định dạng dễ đọc hơn:

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 ký tự

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

Và một phiên bản dễ đọc và bình luận hơn:

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

Vẫn có thể được cải thiện, tôi cho rằng.

-2, -3 nhờ Ismael Miguel


1
Nơi bạn đã (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)?2:1))thay đổi (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?và bạn sẽ tiết kiệm được 2 byte.
Ismael Miguel

1
Nơi bạn có ($e?0:32), thay thế bằng 32*!!$e(chú ý thiếu dấu ngoặc đơn) lưu 2 byte. Nếu $eLUÔN là boolean, bạn có thể làm 32*!$evà bạn tiết kiệm được 3 byte. Điều này sẽ làm việc vì php có quyền ưu tiên số học. Điều này có nghĩa là phép nhân và phép chia được thực hiện trước bất kỳ phép cộng và phép trừ nào.
Ismael Miguel

2

Java (475 byte)

Đây là thử của tôi trong ngôn ngữ dài dòng là Java. Lấy số ngẫu nhiên khá dài trong Java và ánh xạ không thực sự hiệu quả. Nó có thể được cải thiện.

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

Sử dụng:

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

Không nén, giải thưởng được thêm vào:

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

Đầu vào phải được đưa ra dưới dạng tham số dòng lệnh, đầu ra được đưa ra dưới dạng thông báo lỗi.

Phiên bản chơi gôn

vòng lặp, phân tích cú pháp, 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 =
nếu r (10)! = 10 {
h. = a
tiếp tục
}
cho x, y trong k
z: = y = a? x: z
nếu q = 1
h. = aa
nếu q = 3
{
Vòng{
t: = r (4), w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
} cho đến khi k.HasKey (w)
h. = k [w]
}
}
ném% h
r (n) {
Ngẫu nhiên, w, 1, n
trở về
}

Phiên bản không được đánh gôn và chú thích (sự khác biệt là phiên bản này có nhiều khoảng trắng hơn và các phép gán biến đổi nằm trên các dòng riêng biệt để dễ đọc.)

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"}
vòng lặp, phân tích cú pháp, 1
{
    a: = A_LoopField
    ; lấy số ngẫu nhiên từ 1-10 và kiểm tra xem nó có phải là 10 không
    ; nếu nó không bỏ qua phần còn lại của lần lặp này
    nếu r (10)! = 10
    {
        h. = a
        tiếp tục
    }

    ; kiểm tra xem ký tự hiện tại có trong k không
    z =
    cho x, y trong k
        z: = y = a? x: z

    ; chọn một số ngẫu nhiên để quyết định đánh máy lỗi nào
    q: = r (z? 3: 2)
    nếu q = 1
        h. = aa; sao chép khóa
    nếu q = 3
    {
        ; mảng bàn phím được thiết lập sao cho bằng cách thêm hoặc bớt
        ; 20 từ chỉ mục bạn đang di chuyển lên hoặc xuống một hàng
        ; và bằng cách thêm hoặc bớt 1, bạn di chuyển sang phải hoặc trái
        ; sau đó bạn chỉ cần kiểm tra nếu chỉ số điều chỉnh
        ; có giá trị
        Vòng
        {
            t: = r (4)
            w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
        } cho đến khi k.HasKey (w)
        h. = k [w]
    }
}
; hiển thị chuỗi dưới dạng thông báo lỗi
ném% h
r (n)
{
    Ngẫu nhiên, w, 1, n
    trở về
}

Với những chương trình này làm việc?
Ismael Miguel

Nó được điều hành bởi AutoHotkey.exe. autohotkey.com
Person93
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.