テキストにタイプミスを挿入する


63

私はいくつかのテキストを書きましたが、あまりにもプロフェッショナルに見えます。書いたときに本当に疲れたように見せたいです。誤字を挿入する必要があります。

あなたの挑戦は、テキストの任意の単一行を取り、タイプミスを追加することです。これは、各キャラクターについて、タイプミスの可能性が10%あることを意味します。

「typofied」の定義では、次のいずれかを(ランダムに)選択する必要があります。

  • キャラクターを複製します。
  • キャラクターを削除します。
  • 文字をキーボードスペース1つ分シフトします。「キーボード」は次のように定義されます。

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    文字シフトの場合、スペースを1つ上、下、左、または右に移動する必要があります。これはランダムに選択する必要があります。シフトオプションは、アルファベット文字にのみ適用されます。大文字と小文字を区別する必要があります。m!のようなエッジケースには注意してください!

「ランダム」の定義は、結果が予測可能であってはならないことです(以前の結果を見て)。たとえば、10文字ごとにタイプミスすることはできません。さらに、ランダム性は均等に分布している必要があります。たとえば、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」を入力すると、代わりにcapslockがヒットする可能性がランダムに発生するはずです(ND END UP LIKE THIS)。
AJMansfield 14

2
@AJMansfield Lol、それはおそらく複雑すぎるでしょう。それは既に十分に複雑です:P
ドアノブ

1
@ user2509848ちょっと、やめて、それを作る、もう一つ、それがすでにあるよりも複製された!:-P
ドアノブ

1
@Doorknobあなたの出力例は、あなたが疲れていたように見えず、タイプするのが初めてで、タイプミスを修正する方法がわからないようです。(または、入力した内容を見なかった
ブラックライトシャイニング14

1
「エッジケース」<-あなたがそこで何をしたかわかります。*スロークラップ*
アダム・マラス14

回答:


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バイト

(コードは3行のみですが、読みやすくするために3行目を分割しています)

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

先頭の文字列の配列には、アルファベットの各文字の可能な隣接キーがリストされています。random()%1シフトされた文字を選択する際の計算を避けるために、「O」(「P」に隣接)を2倍にしなければなりませんでした。

テスト走行:

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

@FDinoffああ、もちろん。それほど多くのポイント編集は今ではありません。船はすでに沈没している:-D
きしむオッシファージュ14

両方continueのをに置き換えることもできますelse。(;最初のものがあった場所を残します)。
AShelly 14

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、つまり100桁(10回の実行で合計1000桁)で10回実行しましたが、出力に数字が重複することはありませんでした。そのサイトに問題がありますか、それともすべてがどのように機能するかについての私の理解ですか?
user2846289 14

@VadimR良いキャッチ、ありがとう!Kernel#putc出力を印刷するために使用を開始しました。これは、括弧を必要とせず、1文字を節約しました。もちろんputc最初の文字のみを出力し、出力文字列は2文字の長さになる場合があります。愚かな間違い。このバージョンをお試しください!
ポール・プレスティッジ14

今完璧。ありがとうございました。
user2846289 14

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+[...])可能性は、タイプミスのない文字の9つのコピーが1つのタイプミスのリストにある場合に処理されます。

-16文字-grc、+ 2文字(および正確さ、2文字以上の価値)に感謝-Dharaに感謝


2
いくつかの小さな改善:区切り文字としてスペースを使用し、d="SQ VNH XVF...".split()printにスペースを削除し、if/ elseをに置き換え([...]+[...])*z.isalpha()ます。また、変数をd使用するのは一度だけなので、変数は必要ありません。
GRC

1
あなたは行うことができますw=__import__('random').choice(少なくとも私の知る限りではPython 3で)。
SimonT 14

1
<など:;:?このコードは、いくつかのテキスト文字を破る
ダラ

1
、「BBBBBBBB」の「B」は「X」で置き換えられている「zzzzzzzzzz」が範囲外の指標を与える。また、インデックス作成におけるoff-by-oneエラーを有する
ダラ

1
Python 3を使用input()print()て、2文字を保存します。
シーズティマーマン

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 14

@Xantix、私は知っていますが、彼らはそれがプログラムでなければならないと言ったことはありません。いずれにせよ、私の答えにはプログラムのラッピングが含まれるようになりました。
Hand-E-Food 14

気付いたところですが、私の関数は入力でCRおよびLF文字を受け入れますが、これらは2倍またはドロップされる可能性があります。それは...興味深い出力のためになるだろう
ハンド-E-食品

2
うーん、Func<int,int> n=x=>r.Next(x);良いアイデアを作るのに十分なランダム呼び出しではありません。唯一のコンパイラは、代表者のための型を推論することができれば...
メイガス

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

キースリップのアルゴリズム:

  • 文字列(または大文字)でcharを見つける
  • インデックスに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忍者が授与されました!
サニーRグプタ14

1
@SunnyRGuptaありがとう!もっと降ろしてほしい。大括弧の地獄は、必要以上に長くなる可能性があると思います。
チャールズではない14

また、初心者向けに縮小されていないバージョンを表示してみてください!
サニーRグプタ14

まあ、技術的にあなたのコードはウィンドウ上で277バイトを持っています。すべての改行をに置き換える必要があり;ます。それが実際に274バイトあると言う唯一の方法です。また、新しいJavascriptおよびJScriptバージョンでのみ機能します。
イスマエルミゲル

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@-](負のインデックスなど)で同じトリックを試して1つのリスト要素を削除しましたが、'',何も保存されませんでした。

編集:シンプルに戻る-条件~~rand 10rand>.12バイトの節約に置き換える...


1
の定義の後にセミコロンは必要ありませんsub i。strictを使用していないため'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'、ベアワードとして指定できます(2つの引用符文字を保存します)。同様に、そうすることもできます'Z'(ただし、との間にスペースを追加する必要があるgtため、1文字しか保存されません)。合計節約量:4文字。
tobyink 14

1
構造($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''はとして書き換えられ($&x2,'',do{...})[i$&=~/\pL/?3:2]ます。評価は怠evaluationではないことを意味します(置換テクニックを決定する前に文字を置換できる3つの方法すべてを計算します)が、動作し、私の計算でさらに7文字を保存します。
tobyink 14

1
ああ、私gt'Z'もあなたが前に空白を持っていることに気づいた-それはドロップすることができます。これらすべての変更により、184文字まで減らすことができるはずです。
tobyink

@tobyink、特にあなたの2番目のコメントに感謝します-このコンストラクトがそこに見えなかったのはわかりません:-(。Subがなくなっています(数バイト節約します)。Barewordsトリックもいいです、そして実際、私はあなたのコメントを読んだときにすでにそれをやっていたのです。
user2846289 14

1
あなたのためにもう一つのキャラクターがあります。に名前$sを変更すると$,(この組み込み変数はのフィールドセパレーターですがprint、どこにも複数のフィールドを印刷しないため、組み込みの使用法は無関係であり、変数を再利用のために熟成させます)、空白を削除できます$s x3ちょうどそれを作ることで$,x3
tobyink 14

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

2つのコードの唯一の違いは、多数のタブと改行があることです。

同じタイプの「不正」を生成するわけではありませんが、前述の条件を使用してcharを削除または置換します。

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

テスト後、それが有効な答えかどうか教えてください。


大文字にはまったく影響がないようです。
squeamish ossifrage 14

1
この例では大文字は影響を受けません。しかし、はい、そうではありません。しかし、KINDAが動作していると言ったことにも注意してください
イスマエルミゲル14

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イスマエル・ミゲルに感謝


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つのバイトを保存します。
イスマエルミゲル14

1
あなたが持っている場合($e?0:32)32*!!$e(括弧がないことに注意して)に置き換えると、2バイト節約できます。$eが常にブール値の場合は、32*!$e3バイト節約できます。phpには算術優先順位があるため、これは機能します。これは、加算と減算の前に乗算と除算が行われることを意味します。
イスマエルミゲル

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 =
if r(10)!= 10 {
h。= a
持続する
}
kのx、y
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
}

これはどのプログラムで機能しますか?
イスマエルミゲル

AutoHotkey.exeによって実行されます。 autohotkey.com
Person93 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.