Metne yazım hatası ekleme


63

Biraz metin yazdım ama çok profesyonel görünüyor. Yazarken gerçekten yorgundum gibi görünmesini istiyorum. Sana bazı yazım hataları eklemelisin.

Buradaki zorluk, rastgele tek bir metin satırı almak ve yazım hataları eklemektir. Bu, her karakter için, yazılması için% 10'luk bir şans olacağı anlamına gelir.

"Yazım hatası" tanımı, aşağıdakilerden birini (rasgele) seçmeniz gerektiğidir:

  • Karakteri çoğalt.
  • Karakteri silin.
  • Karakteri bir klavye boşluğuna kaydırın. "Klavye" şu şekilde tanımlanır:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    Karakter kaydırma için bir boşluk yukarı, aşağı, sola veya sağa gitmelisiniz. Bu rastgele seçilmelidir. Shift seçeneği sadece alfabetik karakterler için geçerlidir. Dava korunmalı. Gibi kenar durumlarda dikkat edin m!

"Rastgele" tanımı, sonucun tahmin edilebilir olmaması gerektiğidir (önceki sonuçlara bakarak). Örneğin, her onuncu karakteri yazamazsınız. Ayrıca, rastgelelik düzgün bir dağılıma sahip olmalıdır. Örneğin,% 30 kopya,% 30 silme ve% 40 kaydırma yapamazsınız; her biri için 1/3 şans olmalıdır (alfabetik olmayan bir karakterse her biri için 1/2).

Örnek giriş:

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

Örnek çıktı:

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

Bu , yani bayt cinsinden en kısa kod kazanacak.


4
Yanlışlıkla capslock tuşuna basmaya ne dersiniz? Bir "A" veya "Z" yazdığında, bunun yerine capslock'a varacakları rastgele bir şans olmalıdır, ND BU GİBİ SONLANDIR.
AJMansfield

2
@ AJMansfield Lol, bu muhtemelen çok karmaşık olurdu. Olduğu gibi zaten yeterince karmaşık: P
Doorknob

1
@ user2509848 Hey, dur, aking, cevher co, zaten olduğundan daha karışık! :-P
Doorknob

1
Sizin örnek çıktısı senin gibi görünmüyor @Doorknob yorgun sen yazmaya yeni konum ve yazım hataları düzeltmek için nasıl bilmiyorum gibi görünüyor. (Veya ne yazdığınıza hiç
bakmadınız

1
"edge-case" <- Orada ne yaptığını gördüm. * yavaş alkış *
Adam Maras

Yanıtlar:


15

GolfScript, 120 karakter

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

Kod burada test edilebilir .

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

(Yalnızca üç satır kod vardır, ancak okunaklı olması için satır 3'ü bozdum)

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

Baştaki dizelerin dizisi, alfabenin her harfi için olası bitişik tuşları listeler. random()%1Değişen bir karakter seçerken hesaplama yapmaktan kaçınmak için "O" 'yu ​​("P" ye komşu) ikiye katlamak zorunda kaldım .

Test sürüşü:

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

Güncelleme:

İşte aynı kaynak kodun genişletilmiş ve yorumlanmış bir sürümü:

#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'yı koymak zorunda olmadığına kesinlikle eminim char*s[26]. Derleyici bunu çözebilmelidir.
FDinoff

Elbette @FDinoff Ah. Artık düzenleme çok fazla değil; gemi çoktan battı :-D
squishish ossifrage

Ayrıca, ikisini de continues ile değiştirebilirsiniz else. ( ;ilki olduğu yerde bırakın ).
AShelly

1
% 1 rasgele () ile ilgili sorun nedir? % 1 herhangi bir int olmalıdır. 0
user253751

18

Ruby, 168

Dizi indeksleme stratejisini kullanarak biraz daha kısa sürün:

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

Orijinal düzenli ifade versiyonu (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
Üzgünüm, Ruby'yi okuyamıyorum. Burada 10 kez STDIN '0123456789'x10 ile yani 100 rakamla (yani 10 çalıştırmada toplam 1000 rakam) 10 kez çalıştırdım ve çıktıda hiçbir zaman yinelenmemiş rakam yoktu . Bu siteyle ilgili bir sorun mu var, yoksa tüm sitelerin nasıl çalıştığını anlamak
user2846289

@VadimR iyi yakalamak, teşekkürler! Kernel#putcÇıktıları yazdırmak için kullanmaya başlamıştım , çünkü bu parens gerektirmiyordu, bana bir karakter kazandırdı. Tabii ki putcsadece ilk karakteri basar ve çıktı dizesi bazen iki karakter uzunluğunda olabilir. Aptalca hata. Bu sürümü dene!
Paul Prestidge

Şimdi mükemmel. Teşekkür ederim.
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())

Çok basit bir arama tekniği, bir an için klavyeyi yönlendirilmemiş bir grafik olarak kodlamanın daha ucuz olabileceğini düşündüm, ancak Python'da böyle bir tür oluşturmanın yükü engelleyici oldu. Python'un rastgele işlevleri çok açıklayıcı isimlere sahip choice()olduğu için, sadece onu yeniden adlandırarak kullanıyorum w. % 10 hata şansı, w([z]*9+[...])yazılmamış bir karakterin dokuz kopyasının bir yazım hatası bulunan listede olduğu durumlarda işlenir .

-16 karakter - teşekkürler grc, +2 karakter (ve doğruluk, 2 karakterden fazlaya değer) - teşekkürler Dhara


2
Bazı küçük iyileştirmeler: sınırlayıcı olarak boşluk kullanın d="SQ VNH XVF...".split(), sonraki boşluğu kaldırın printve if/ elseile değiştirin ([...]+[...])*z.isalpha(). Ayrıca, dyalnızca bir kez kullandığınız için bir değişkene ihtiyacınız yoktur .
grc

1
Yapabilirsiniz w=__import__('random').choice(en azından Python 3 afaik'te).
SimonT

1
Bu kod birkaç metin karakterinden
Dhara

1
Ayrıca, indekslemede bire bir hata var: 'bbbbbbbb' içindeki 'b' 'x' ile değiştirildi, 'zzzzzzzzzz', sınırların dışında bir dizin veriyor
Dhara

1
Python 3'leri input()ve print()2 karakter kaydetmek için kullanın .
Cees Timmerman

8

C #, 320 bayt (program kaydırma ile 360 ​​bayt)

"Üst karakter" büyük harfleri için destek içerir.

İşlev olarak (320 bayt):

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

Metin satırı okuyan bir program olarak (360 bayt):

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

Giriş çıkışı örneği:

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!

Yasal C # programlarının geçerli olması için en az "genel A sınıfı {statik void Main () {}}" olması gerekir. Daha sonra konsoldan okumalısınız. Ama çözümün hala benimkinden daha kısa olacak gibi görünüyor, çok iyi iş çıkarıldı.
Xantix

@ Xantix, biliyorum, ama bir program olması gerektiğini asla söylemediler. Her iki durumda da, cevabım şimdi program paketleri içeriyor.
El-E-Yemek

Daha yeni farkettim, fonksiyonum girişte potansiyel olarak iki katına veya düşebilecek CR ve LF karakterlerini kabul edecek. Bu ilginç çıktılar yapardı ...
Hand-E-Food

2
Hmm, Func<int,int> n=x=>r.Next(x);iyi bir fikir yapmak için yeterince rastgele arama yok . Keşke delegeler için bir derleyici çıkarsa ...
Magus

8

JS, 303 , 288 , 275 , 273 , 274 (hata düzeltme)

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

Klavye için algoritma:

  • dizgede char bul (veya büyük harf)
  • dizine 11, -11, 1 veya -1 ekleyin.
  • geçersizse (0 veya null), yeniden rulo

İsteğe bağlı Golfsüz sürüm:

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

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

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

      // we must be in keyslip mode.

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

Bravo! JS ninja ödüllendirildi!
Sunny R Gupta,

1
@SunnyRGupta Teşekkürler! Keşke daha fazlasını elde edebilsem. Bence büyük parantezler cehennemden daha uzun sürebilir.
Charles,

Ayrıca acemiler için küçültülmemiş sürümünü göstermeye çalış!
Sunny R Gupta,

Teknik olarak kodunuzda pencerelerde 277 bayt var. Tüm yeni satırları ile değiştirmelisiniz ;. Aslında 274 bayt olduğunu söylemenin tek yolu bu. Ayrıca, sadece daha yeni Javascript ve JScript sürümlerinde çalışır.
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

Çalıştır -p, ardından 148 + 1 = 149 bayt. Örneğin:

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.

Golfsüz, az ya da çok:

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

İlk başta bir dizideki rastgele öğeyi seçmenin (farklı uzunluklardan 26'sı), daha istatistiksel olarak 'temiz' (yani rastgele) olduğunu düşündüm, ama belki de yanlıştı. (Önceki versiyona bakınız.) Bu son deneme, liderleri takip ederek :-), bir dizgede -1,1, -11,11 (rasgele) adımlarla ilerler ve geçerli adıma kadar tekrar eder.

Düzenleme: tobyink yardım ve diğer optimizasyonlar sayesinde kod boyutunu önemli ölçüde azaltmayı başardık.

Son yaklaşım, değiştirme dizesi boyunca geçerli adımı bulmak ve el ile denetimleri ortadan kaldırmak için regexp aramasıyla ilgili bazı püf noktaları kullanır.

Başka bir düzenleme: 5 bayt kapalı çünkü dizi indeksleri için tamsayıya ihtiyacımız yok + yasadışı dizi indeksi ile küçük hile. Aynı numarayı [-4+rand@-](negatif indekslerle) denedim ve bir liste öğesinden kurtuldum, '',ancak hiçbir şey kaydetmedi.

Düzenleme: Basitliğe geri dön - durumu 2 bayt ~~rand 10ile değiştirir rand>.1...


1
Tanımından sonra noktalı virgül gerekmez sub i. Sıkı kullanmıyorsunuz, böylece 'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'bir korkak olarak verilebilir (iki alıntı işareti karakteri kaydeder). Benzer şekilde, bunu da yapabilir 'Z'(bununla birlikte arasına bir boşluk eklemeniz gerektiği anlamına gelir gt, bu nedenle yalnızca bir karakter kaydeder). Toplam tasarruf: 4 karakter.
tobyink

1
Yapı ($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''olarak yeniden yazılabilir ($&x2,'',do{...})[i$&=~/\pL/?3:2]. Bu, değerlendirmenin tembel olmadığı anlamına gelir (bir ikame tekniğine karar vermeden önce karakterin ikame edilebileceği üç yolu da hesaplar), ancak işe yarar ve hesaplamalarıma göre yedi karakter daha kaydeder.
tobyink

1
Oh, daha önce beyaz alanınızın olduğunu farkettim gt'Z'- bu düşebilir. Tüm bu değişikliklerle, 184 karaktere kadar indirebilmelisiniz.
tobyink

@ tobyink, çok teşekkürler, özellikle ikinci yorumunuz için - bu yapıyı orada görmedim, bilmiyorum :-(. Sub gitti (bize birkaç bayt kazandırdı). Barewords hilesi de güzel, ve aslında yorumunuzu okuduğumda zaten yapıyordum. :-) Tekrar teşekkürler.
user2846289

1
Senin için bir karakterim daha var. Eğer yeniden adlandırırsanız $siçin $,(bu dahili değişken için saha ayırıcı olduğunu print, ancak her yerde birden çok alan baskı değiliz, bu yüzden dahili kullanım yeniden kullanım için olgunlaşmış değişken hale alakasız var), o zaman beyaz boşluk ortadan kaldırabilir içinde $s x3sadece yapım $,x3.
tobyink

4

PHP, 368 bayt ile işlev

İşte benim girişimim.

Bazı "Frankencode", ama biraz çalışıyor.

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

Daha "okunabilir" bir kod:

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 kod arasındaki tek fark, birinin tonlarca sekme ve yeni satır içermesidir.

Aynı tipte "yanlışlık" üretmez, ancak belirtilen koşulları kullanarak bir karakteri siler veya değiştirir.

Bunu http://writecodeonline.com/php/ adresinde deneyebilirsiniz .

Bu kodu kopyalayıp yapıştırı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;}
echo _('This is some correct text. It is too correct. Please un-correctify it.');

Testten sonra lütfen geçerli bir cevap olup olmadığını söyle.


Hiç büyük harfleri etkilemiyor gibi görünüyor.
squeamish ossifrage

1
Büyük harfler örnekte etkilenmez. Ama evet, öyle değil. Ama aynı zamanda KINDA'nın işe yaradığını söylediğime dikkat edin .
Ismael Miguel,

3

C #, 581 bayt

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

ve daha okunabilir bir biçimde:

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;

Ve daha okunaklı ve yorumlanmış bir sürüm:

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

Hala geliştirilebilir, sanırım.

Ismael Miguel sayesinde -2, -3


1
(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)?2:1))Değişiklik yaptığınız yerde (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?2 bayttan tasarruf edersiniz.
Ismael Miguel,

1
Sahip olduğunuz yerde ($e?0:32), 32*!!$e(parantez eksikliğine dikkat edin) ile değiştirdiğinizde 2 bayt tasarruf edin. Eğer $eDAİMA boolean, yapabileceğiniz 32*!$eve 3 bayt kaydedin. Bu işe yarayacak çünkü php aritmetik önceliğe sahip. Bu, çarpma ve bölmelerin herhangi bir toplama ve çıkarma işleminden önce yapıldığı anlamına gelir.
Ismael Miguel,

2

Java (475 bayt)

Bu benim Java olan ayrıntılı dilde denemem. Java'da rasgele sayılar almak oldukça uzundur ve haritalama gerçekten verimli değil. Muhtemelen geliştirilebilir.

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

Kullanımı:

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

Sıkıştırılmamış, hesaplar eklendi:

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 bayt

Giriş bir komut satırı parametresi olarak verilmelidir, çıkış bir hata mesajı olarak verilir.

Golf versiyonu

döngü, ayrıştırma, 1
{
k: = {1: "q", 2 "e", 4: "r", 5: "t", 6 "y", 7: 3 "W", "u", 8 "ı " 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 =
eğer r (10)! = 10 {
h. = bir
devam et
}
x için y
z: = y = a x: z
eğer q = 1 ise
h. = aa
eğer q = 3 ise
{
Döngü {
t: = r (4), ağırlık: = z + (t = 1 ila 20: t = 2 -20:? T = 3: 1: 1)
} 'e kadar.
h. = k [b]
}
}
% h at
r (n) {
Rastgele w, 1, n
dönüş w
}

Golfsüz ve açıklamalı sürüm (fark, bu sürümün daha fazla beyaz alana sahip olması ve değişken atamalarının okunabilirlik için ayrı satırlarda olmasıdır.)

k: = {1: "q", 2 "e", 4: "r", 5: "t", 6 "y", 7: 3 "W", "u", 8 "ı " 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"}
döngü, ayrıştırma, 1
{
    a: = A_LoopField
    ; 1-10 arasında rastgele bir sayı almak ve 10 olup olmadığını kontrol edin
    ; bu yinelemenin geri kalanını atlamazsa
    eğer r (10)! = 10 ise
    {
        h. = bir
        devam et
    }

    ; Geçerli karakterin k cinsinden olup olmadığını kontrol edin.
    z =
    x için y
        z: = y = a x: z

    ne yazım hatası yapılacağına karar vermek için rastgele bir sayı seçin
    q: = r (z 3: 2)
    eğer q = 1 ise
        h. = aa; anahtarı çoğalt
    eğer q = 3 ise
    {
        klavye dizisi, eklenerek veya çıkarılarak ayarlanmıştır.
        ; 20 dizinden aşağı veya yukarı doğru hareket ediyor
        ; ve 1 ekleyerek veya çıkararak sağa veya sola hareket edersiniz.
        ; o zaman sadece ayarlanan endeksi kontrol etmeniz gerekir
        ; geçerli
        döngü
        {
            t: = r (4)
            ağırlık: = z + (t = 1 ila 20: t = 2 -20: t = 3: 1: 1)
        } eğer öyleyse k.HasKey (w)
        h. = k [b]
    }
}
; dizgiyi bir hata mesajı olarak göster
% h at
r (n)
{
    Rastgele w, 1, n
    dönüş w
}

Bu hangi programlarla çalışıyor?
Ismael Miguel,

AutoHotkey.exe tarafından çalıştırılır. autohotkey.com
Person93 16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.