Вставте друкарські помилки в текст


63

Я написав якийсь текст, але це виглядає занадто професійно. Я хочу, щоб це виглядало так, що я дуже втомився, коли писав це. Мені потрібно, щоб ти вставив помилки.

Ваше завдання - взяти довільний один рядок тексту та додати друкарські помилки. Це означає, що для кожного персонажа буде 10% шансу його опублікувати.

Визначення "типофікованого" полягає в тому, що потрібно вибрати (випадковим чином) одне з наступних:

  • Дублювати персонаж.
  • Видаліть символ.
  • Перемістіть символ пробілу на клавіатурі. "Клавіатура" визначається як:

    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
А як із випадковим натисканням клавіші на замок? Коли ви вводите "A" або "Z", то має бути випадковий шанс, що вони замість них наберуть "cap", ND END UP LIKE This.
AJMansfield

2
@AJMansfield Лол, це, мабуть, буде занадто складно. Це вже досить складно, як зараз: P
Дверна ручка

1
@ user2509848 Гей, перестань, поцікавившись, руде спів, складніше, ніж це вже є! :-P
Дверна ручка

1
@Doorknob Ваш приклад не виглядає так, як ви втомилися , це здається, що ви новачок вводити текст, і ви не знаєте, як правильно виправити помилки. (Або ви взагалі не переглянули те, що набрали . )
Blacklight Shining

1
"крайні корпуси" <- я бачу, що ти там робив. * повільний хлопання *
Адам Марас

Відповіді:


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 рядок для розбірливості)

#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

@FDinoff Ах, звичайно. Зараз не так багато редагування точок; судно вже затонуло :-D
пискляве окоп'яття

ви також можете замінити обидва continues на elses. (залиште там, ;де був перший).
AShelly

1
У чому проблема з випадковим ()% 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
Вибачте, я не можу прочитати Рубі. Тут я запускав цю програму 10 разів зі STDIN '0123456789'x10, тобто 100 цифр (тобто 1000 цифр усього за 10 циклів), і ніколи не було дублювання цифр у висновку. Чи є проблема з цим сайтом чи моїм розумінням того, як це все працює?
користувач2846289

@VadimR гарний улов, дякую! Я почав використовувати Kernel#putcдля друку вихідних даних, оскільки для цього не потрібні пароні, врятувавши мене один символ. Звичайно, putcдрукується лише перший символ, а вихідний рядок іноді може мати два символи. Дурна помилка. Спробуйте цю версію!
Пол Престиждж

Ідеально зараз. Дякую.
користувач2846289

9

Пітона, 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 символів - спасибі гр.к., +2 символи (і правильність, вартий набагато більше 2 символів) - дякую Дхара


2
Деякі незначні вдосконалення: використовуйте пробіли як роздільник d="SQ VNH XVF...".split(), видаліть пробіл після printта замініть if/ elseна ([...]+[...])*z.isalpha(). Крім того, вам не потрібна змінна, dоскільки ви використовуєте її лише один раз.
grc

1
Можна зробити w=__import__('random').choice(принаймні в Python 3 afaik).
SimonT

1
Цей код розпадається з кількома текстовими символами:?;: <Тощо
Дхара

1
Крім того, у ньому є помилка поодинці в індексації: 'b' у 'bbbbbbbb' замінюються на 'x', 'zzzzzzzzzz' дає індекс поза межами
Dhara

1
Використовуйте Python 3 input()і print()збережіть 2 символи.
Cees Timmerman

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 # потрібно мати принаймні "public class A {static void Main () {}}", щоб бути дійсними. Потім вам потрібно буде прочитати з консолі. Але схоже, що ваше рішення все одно буде коротшим, ніж моє, так добре зроблено.
Ксантікс

@Xantix, я знаю, але вони ніколи не говорили, що це повинна бути програма. Так чи інакше, моя відповідь тепер включає обгортання програми.
Hand-E-Food

Я щойно зрозумів, що моя функція прийме символи CR та LF у вхідних даних, які потенційно можуть бути подвоєні або скинуті. Це дозволило б отримати цікавий результат ...
Hand-E-Food

2
Хм, недостатньо випадкових дзвінків, щоб зробити Func<int,int> n=x=>r.Next(x);гарну ідею. Якби тільки компілятор міг зробити висновок про тип для делегатів ...
Magus

8

JS, 303 , 288 , 275 , 273 , 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 ніндзя нагороджений!
Сонячний Р Гупта

1
@SunnyRGupta Дякую! Бажаю, щоб я міг її знизити більше. Я думаю, що пекельні круглі дужки можуть зробити це довше, ніж потрібно.
Не те, що Чарльз

Спробуйте також показати неміфіковану версію для новачків!
Сонячний Р Гупта,

Ну, технічно ваш код має 277 байт на windows. ВИ ПОТРІБНО замінити всі нові рядки на ;. Це єдиний спосіб сказати, що він насправді має 274 байти. Крім того, він працює лише в нових версіях Javascript і JScript.
Ісмаїл Мігель

6

Перл, 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 (випадковим чином) і повторюється до дійсного кроку.

Редагувати: Завдяки довідці щодо перегляду посилань та інших оптимізаціям нам вдалося значно зменшити розмір коду.

В останньому підході використовуються деякі хитрощі при пошуку regexp, щоб знайти дійсний крок по рядку заміни, усуваючи ручні перевірки.

Ще одна редакція: 5 байт вимкнено, оскільки нам не потрібні цілі числа для індексів масиву + невеликий трюк з незаконним індексом масиву. Я спробував той же трюк з [-4+rand@-](тобто негативні індекси) і позбувся одного елемента списку, '',але він нічого не врятував.

Змінити: Назад до простоти - заміна стан ~~rand 10з rand>.1економить 2 байта ...


1
Немає потреби в крапці з комою після визначення sub i. Ви не використовуєте суворі 'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'строки , тому їх можна подавати як головне слово (зберігає два символи лапки). Так само може і так 'Z'(хоча це означає, що вам потрібно додати пробіл між нею gt, і це збереже лише один символ). Загальна економія: 4 символи.
tobyink

1
Конструкція ($n=i$&=~/\pL/?3:2)?--$n?do{...}:$&x2:''може бути переписана як ($&x2,'',do{...})[i$&=~/\pL/?3:2]. Це означає, що оцінка не лінива (вона обчислює всі три способи, за допомогою яких персонаж може бути заміщений, перш ніж зважитися на техніку заміщення), але він працює, і він моїми розрахунками зберігає ще сім символів.
tobyink

1
О, я щойно помітив, що у вас є пробіл і раніше gt'Z'- це можна скинути. З усіма цими змінами ви зможете зменшити їх до 184 символів.
tobyink

@tobyink, велике спасибі, особливо за твій другий коментар - як я не бачив цієї конструкції там, я не знаю :-(. Sub пішов (заощаджує нам пару байтів). Трюк Barewords теж хороший, а насправді я вже робив це, коли читав ваш коментар. :-) Ще раз дякую.
користувач2846289

1
У мене є ще один персонаж для тебе. Якщо ви перейменовуєте $sв $,(ця вбудована змінна є роздільником поля print, але ви не друкуєте декілька полів ніде, тому вбудоване використання не має значення, завдяки чому змінна стигла для повторного використання), тоді ви можете усунути пробіл білого кольору в , що $s x3робить його просто $,x3.
tobyink

4

PHP, функціонує з 368 байтами

Ось моя спроба.

Це якийсь "франкенкод", але він начебто працює.

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

Після тестування, будь ласка, скажіть мені, чи це правдива відповідь.


Схоже, це взагалі не впливає на великі літери.
пискливий косторог

1
Великі літери в прикладі не зачіпаються. Але так, це не так. Але також зауважте, що я сказав, що це KINDA працює.
Ісмаїл Мігель

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 байти.
Ісмаїл Мігель

1
Там, де ви є ($e?0:32), замінивши 32*!!$e(помічайте відсутність дужок), збережіть 2 байти. Якщо $eЗАВЖДИ буле, ви можете зробити 32*!$eі зберегти 3 байти. Це спрацює, оскільки 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_LoopField, q: = r (z? 3: 2), z =
якщо r (10)! = 10 {
ч. = ​​а
продовжувати
}
для х, у в к
z: = y = a? x: z
якщо q = 1
ч. = ​​аа
якщо q = 3
{
Петля {
t: = r (4), w: = z + (t = 1? 20: t = 2? -20: t = 3? 1: -1)
} до k.HasKey (w)
h. = k [w]
}
}
кинути% год
r (n) {
Випадкові, ш, 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_LoopField
    ; отримайте випадкове число від 1-10 і перевірте, чи це 10
    ; якщо це не пропустити решту цієї ітерації
    якщо r (10)! = 10
    {
        ч. = ​​а
        продовжувати
    }

    ; перевірте, чи поточний символ знаходиться в k
    z =
    для х, у в к
        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]
    }
}
; відобразити рядок як повідомлення про помилку
кинути% год
r (n)
{
    Випадкові, w, 1, n
    повернути w
}

За допомогою яких програм це працює?
Ісмаїл Мігель

Він працює під управлінням AutoHotkey.exe. autohotkey.com
Person93
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.