在文本中插入错别字


63

我写了一些文字,但看起来太专业了。我想让它看起来像我在写时真的很累。我需要您输入一些错字。

您面临的挑战是采用任意一行文本并添加错字。这意味着对于每个角色,将有10%的机会被打字。

“ typofied”的定义是,您必须(随机)选择以下其中一项:

  • 复制字符。
  • 删除字符。
  • 将字符移动一个键盘空间。“键盘”定义为:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    对于字符转换,您必须向上,向下,向左或向右移动一个空格。必须随机选择。shift选项仅适用于字母字符。案件必须保留。小心边缘情况,例如m

“随机”的定义是结果必须不可预测(通过查看以前的结果)。例如,您不能每十个字符错别字。此外,随机性必须具有均匀的分布。例如,您不能执行30%的重复,30%的删除和40%的转换;每个角色必须有1/3的几率(如果是非字母字符,则每个为1/2)。

输入示例:

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

输出示例:

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

这是,因此以字节为单位的最短代码将获胜。


4
意外敲击Capslock键怎么办?当键入“ A”或“ Z”时,应该有一个随机的机会,他们会碰到大写字母,这就像ND END UP UP。
AJMansfield

2
@AJMansfield大声笑,那可能太复杂了。它已经足够复杂了:P
门把手

1
@ user2509848嘿,别再说了,比现在已经复杂了!:-P
门把手

1
@Doorknob您的示例输出看起来并不像您很累,看起来您是新手,而且您不知道如何纠正错别字。(或者您根本没有看过所键入的内容
Blacklight闪耀

1
“边际案例” <-我看到你在那里做了什么。*拍手慢速*
Adam Maras 2014年

Answers:


15

GolfScript,120个字符

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

可以在这里测试代码。

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

(只有三行代码,但是为了清晰起见,我将第三行分解了)

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

开头的字符串数组列出了字母表中每个字母可能的相邻键。我必须加倍“ O”(与“ P”相邻)以避免random()%1在选择移位字符时进行计算。

测试运行:

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

更新:

这是相同源代码的扩展和注释版本:

#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
我相当肯定你不需要把26放进去char*s[26]。编译器应该能够弄清楚这一点。
FDinoff 2014年

@FDinoff啊,当然。现在没有太多的点编辑;船已经沉没了:-D
吱吱作响的ossifrage,2014年

您也可以将continues和elses 都替换。(保留;第一个所在的位置)。
AShelly 2014年

1
random()%1有什么问题?任何INT%1应为0。
user253751

18

红宝石168

使用数组索引策略的时间略短:

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

原始正则表达式版本(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
抱歉,我看不懂Ruby。在这里,我用STDIN'0123456789'x10运行了10次此程序,即100位数(即10次运行总计1000位数),并且输出中没有重复的位数。该网站是否存在问题,或者我对它的工作方式了解?
user2846289

@VadimR好抓住,谢谢!我已经开始使用Kernel#putc打印输出了,因为不需要parens,为我节省了一个字符。当然,putc仅输出第一个字符,并且输出字符串有时可以是两个字符长。愚蠢的错误。试试这个版本!
Paul Prestidge 2014年

现在完美。谢谢。
user2846289'2

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

非常简单的查找技术,有一段时间我认为将键盘编码为无向图可能会更便宜,但事实证明,在Python中创建这种类型的开销非常高。由于Python的随机函数具有过于描述性的名称,因此我choice()专门使用它,并将其重命名为w。出现错误的10%的机会是通过w([z]*9+[...])列表中未键入字符的九个副本出现错别字来处理的。

-16个字符-感谢grc,+ 2个字符(以及正确性,价值超过2个字符)-感谢Dhara


2
一些小的改进:使用空格作为分隔符d="SQ VNH XVF...".split(),后删除空间print,并更换if/ else([...]+[...])*z.isalpha()。同样,您不需要变量,d因为您只使用了一次。
grc 2014年

1
您可以做到w=__import__('random').choice(至少在Python 3 afaik中)。
SimonT 2014年

1
这段代码用几个文本字符中断:?;:<等
Dhara

1
此外,它在索引编制中存在一个错误:将“ bbbbbbbb”中的“ b”替换为“ x”,“ zzzzzzzzzz”给出了超出范围的索引
Dhara

1
使用Python 3 input()print()保存2个字符。
Cees Timmerman 2014年

8

C#,320个字节(带程序包装的360个字节)

包括对“移位的”大写字母的支持。

作为功​​能(320字节):

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

作为读取一行文本(360字节)的程序:

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

输入输出样本:

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#程序至少必须具有“公共类A {static void Main(){}}”才能生效。然后,您需要从控制台读入。但是看来您的解决方案仍会比我的解决方案短,所以做得很好。
Xantix

@Xantix,我知道,但他们从未说过它必须是一个程序。无论哪种方式,我的答案现在都包括程序包装。
Hand-E-Food

我刚刚意识到,我的函数将在输入中接受CR和LF字符,这些字符可能会加倍或删除。那将带来有趣的输出...
Hand-E-Food

2
嗯,没有足够的随机调用来提出Func<int,int> n=x=>r.Next(x);一个好主意。如果只有编译器可以推断出委托的类型……
Magus 2014年

8

JS,303288275273,274(错误修复)

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

键盘加密算法:

  • 在字符串中查找字符(或大写)
  • 将11,-11、1或-1添加到索引。
  • 如果无效(0或null),请重新滚动

每个请求的非高尔夫版本:

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
}

太棒了!JS忍者奖!
Sunny R Gupta 2014年

1
@SunnyRGupta谢谢!希望我能得到更多。我认为圆括号可能会使它变得比所需的更长。
并不是说Charles

也请尝试为新手显示未缩小的版本!
Sunny R Gupta 2014年

好吧,从技术上讲,您的代码在Windows上有277个字节。您应将所有换行符替换为;。那是说它实际上有274个字节的唯一方法。此外,它仅适用于更新的Javascript和JScript版本。
Ismael Miguel 2014年

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

运行-p,然后148 + 1 = 149字节。例如:

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.

不打高尔夫球,或多或少:

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

起初,我认为从数组中随机选择元素(从26种不同长度的元素中)在统计学上更“干净”(即随机),但也许是错误的。(请参阅以前的版本。)这最后一次尝试是在跟随领导者之后:-),以-1,1,-11,11(随机)的方式沿字符串移动,并重复直到有效的步骤为止。

编辑:由于tobyink帮助和其他优化,我们设法大大减少了代码大小。

最后一种方法使用正则表达式搜索的一些技巧来沿替换字符串查找有效步骤,从而消除了手动检查的麻烦。

另一个编辑:减少5个字节,因为我们不需要整数用于数组索引+带有非法数组索引的小技巧。我尝试了相同的技巧[-4+rand@-](即负索引),并摆脱了一个列表元素,'',但没有节省任何东西。

编辑:回到简单-更换条件~~rand 10rand>.1节省2个字节...


1
的定义后无需分号sub i。您使用的不是严格,因此'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'可以作为裸词来使用(节省两个引号字符)。同样,也可以'Z'(尽管这意味着您需要在它和gt,因此只保存一个字符)。总共节省:4个字符。
tobyink 2014年

1
构造 ($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''可以重写为($&x2,'',do{...})[i$&=~/\pL/?3:2]。这意味着评估不是很懒惰(它在决定替代技术之前计算了可以替换字符的所有三种方式),但是它可以工作,并且通过我的计算可以节省另外七个字符。
tobyink 2014年

1
哦,我刚刚注意到您之前gt'Z'也有空白-可以删除它。通过所有这些更改,您应该可以将其减少到184个字符。
tobyink

@tobyink,非常感谢,特别是您的第二条评论-我怎么看不到那里的构造,我也不知道:-(。Sub不见了(为我们节省了几个字节)。Barewords技巧也很不错,当我阅读您的评论时,实际上我已经在这样做了。:-)再次感谢。
user2846289'2

1
我还有一个角色给你。如果您重命名$s$,(此内置变量是的字段分隔符print,但是您没有在任何地方打印多个字段,因此它的内置用法无关紧要,从而使该变量成熟以便重用),那么您可以消除空白在$s x3制作它只是$,x3
tobyink

4

PHP,功能为368字节

这是我的尝试。

这是一些“ frankencode”,但是有点用

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

更具“可读性”的代码:

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

这两个代码之间的唯一区别是,一个代码具有大量制表符和换行符。

它不会产生完全相同的“不正确”类型,但是会使用上述条件删除或替换一个字符。

您可以在http://writecodeonline.com/php/上尝试一下。

复制并粘贴以下代码:

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

经过测试后,请告诉我这是否是有效答案。


它似乎根本不影响大写字母。
吱吱作响的ossifrage,2014年

1
在示例中,大写字母不受影响。但是是的,事实并非如此。但也请注意,我说KINDA有效。
Ismael Miguel

3

C#,581字节

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

并采用更具可读性的格式:

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个字符

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

以及更具可读性和评论性的版本:

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

我想仍然可以改善。

-2,-3感谢Ismael Miguel


1
您在其中进行(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)?2:1))更改的地方(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?将节省2个字节。
Ismael Miguel 2014年

1
在有的地方($e?0:32),替换为32*!!$e(请注意缺少括号)可节省2个字节。如果$e始终为布尔值,则可以这样做,32*!$e并且可以节省3个字节。这将起作用,因为php具有算术优先级。这意味着乘法和除法是在任何加法和减法之前进行的。
Ismael Miguel 2014年

2

Java(475字节)

这是我尝试使用Java作为详细语言的尝试。在Java中获取随机数的时间很长,而且映射的效率并不高。它可能可以改进。

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

用法:

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

未压缩,增加了赞誉:

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字节

输入必须作为命令行参数给出,输出必须作为错误消息给出。

高尔夫版

循环,解析,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_LoopF​​ield,q:= r(z?3:2),z =
如果r(10)!= 10 {
h。= a
继续
}
对于x,y in k
z:= y = a?x:z
如果q = 1
h。= aa
如果q = 3
{
环{
t:= r(4),w:= z +(t = 1?20:t = 2?-20:t = 3?1:-1)
},直到k.HasKey(w)
h。= k [w]
}
}
抛出%h
r(n){
随机,w,1,n
返回w
}

取消注释的版本(区别在于该版本具有更多的空白,并且变量分配位于单独的行上,以提高可读性。)

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”}
循环,解析,1
{
    a:= A_LoopF​​ield
    ;从1-10中获取一个随机数,并检查它是否为10
    ; 如果不跳过此迭代的其余部分
    如果r(10)!= 10
    {
        h。= a
        继续
    }

    ;检查当前字符是否在k中
    z =
    对于k中的x,y
        z:= y = a?x:z

    ;选择一个随机数来决定要做什么错字
    q:= r(z?3:2)
    如果q = 1
        h。= aa;复制密钥
    如果q = 3
    {
        ;键盘阵列设置为通过加或减
        ; 从您向上或向下移动的索引开始的20
        ; 并通过加或减1向右或向左移动
        ; 那么您只需要检查调整后的索引
        ; 已验证
        环
        {
            t:= r(4)
            w:= z +(t = 1?20:t = 2?-20:t = 3?1:-1)
        直到k.HasKey(w)
        h。= k [w]
    }
}
;将字符串显示为错误消息
抛出%h
r(n)
{
    随机,w,1,n
    返回w
}

使用哪些程序可以工作?
Ismael Miguel

它由AutoHotkey.exe运行。 autohotkey.com
Person93
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.