Вставьте опечатки в текст


63

Я написал какой-то текст, но он выглядит слишком профессионально. Я хочу, чтобы я выглядел так, как будто я очень устал, когда писал это. Мне нужно, чтобы вы вставили несколько опечаток.

Ваша задача состоит в том, чтобы взять произвольную строку текста и добавить опечатки. Это означает, что для каждого персонажа будет 10% шанс его типизации.

Определение «typofied» заключается в том, что вы должны выбрать (случайным образом) одно из следующих:

  • Дублируйте персонажа.
  • Удалить персонажа.
  • Сдвиг символа на одну клавиатуру. «Клавиатура» определяется как:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    Для смены персонажа вы должны пройти один пробел вверх, вниз, влево или вправо. Это должно быть выбрано случайно. Опция сдвига применяется только к буквенным символам. Дело должно быть сохранено. Будьте осторожны с крайними случаями, как 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», должен быть случайный шанс, что они вместо этого попадут в колпачок, ND END UP, ПОТОМУ ЧТО ЭТО.
AJMansfield

2
@ AJMansfield Lol, это было бы слишком сложно. Это уже достаточно сложно, как это: P
дверная ручка

1
@ user2509848 Эй, остановись, aking, руда, сложенная, чем это уже есть! :-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
В чем проблема с 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
Извините, я не могу читать Руби. Здесь я запустил эту программу 10 раз с STDIN '0123456789'x10, то есть 100 цифрами (т.е. всего 1000 цифр за 10 прогонов), и на выходе никогда не было дублированной цифры. Есть проблема с этим сайтом, или мое понимание того, как все это работает?
user2846289

@VadimR хороший улов, спасибо! Я начал использовать Kernel#putcдля распечатки выходных данных, так как для этого не нужны парены, за исключением одного символа. Конечно, putcпечатается только первый символ, и выходная строка иногда может содержать два символа. Глупая ошибка. Попробуйте эту версию!
Пол Престиж

Идеально сейчас. Спасибо.
user2846289

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 символов - спасибо grc, +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
Этот код разрывается с несколькими текстовыми символами:?;: <
Etc

1
Кроме того, в индексировании есть ошибка «один за другим»: «b» в «bbbbbbbb» заменяются на «x», «zzzzzzzzzz» дает индекс вне границ
Дхара

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 # должны иметь как минимум "public class A {static void Main () {}}", чтобы быть действительными. Затем вам нужно будет читать с консоли. Но похоже, что ваше решение все равно будет короче моего, так что хорошо сделано.
Xantix,

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

Алгоритм скольжения клавиш:

  • найти символ в строке (или в верхнем регистре)
  • добавьте 11, -11, 1 или -1 к индексу.
  • если он недействителен (0 или ноль), перебросьте

Версия без гольфа для каждого запроса:

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 Гупта

1
@SunnyRGupta Спасибо! Хотел бы я получить это больше. Я думаю, что адские массивные скобки могут сделать это дольше, чем нужно.
Не то, что Чарльз

Также попробуйте показать неунифицированную версию для новичков!
Солнечный R Гупта

Ну, технически ваш код имеет 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@-](т.е. отрицательными индексами) и избавился от одного элемента списка, '',но он ничего не сохранил.

Изменить: Назад к простоте - замена состояние ~~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 больше не существует (спасает нас на пару байтов). Трюк с несложными словами тоже хорош, и на самом деле я уже делал это, когда я читал ваш комментарий. :-) Еще раз спасибо.
user2846289

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

После тестирования, пожалуйста, скажите мне, если это правильный ответ.


Кажется, это не влияет на заглавные буквы.
брезгливое оссифраж

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 байт

Входные данные должны быть заданы как параметр командной строки, а выходные данные - как сообщение об ошибке.

Гольф версия

loop, parse, 1
{
K: = {1: "д", 2: "ш", 3: "е", 4: "R", 5: "T", 6: "Y", 7: "U", 8: "я », 9: "о", 10: "р", 21: "а", 22: "с", 23: "д", 24: "F", 25: "г", 26: "ч", 27: "J", 28: "к", 29: "л", 42: "г", 43: "х", 44: "с", 45: "V", 46: "б", 47: "н", 48: "м"}, а: = A_LoopField, д: = г (? г 3: 2), г =
если r (10)! = 10 {
ч. = ​​а
Продолжить
}
для х, у в к
г: = у = а х: г
если q = 1
ч. = ​​аа
если q = 3
{
Loop {
т: = г (4), W: = Z + (Т = 1 20:? Т = 2 -20:?? Т = 3: 1: 1)
} до k.HasKey (w)
ч. = ​​к [ш]
}
}
бросить% h
г (п) {
Случайные, ш, 1, п
возвращение
}

Версия без гольфа и аннотированная версия (отличие в том, что в этой версии больше пробелов, а назначения переменных расположены на отдельных строках для удобства чтения).

K: = {1: "д", 2: "ш", 3: "е", 4: "R", 5: "T", 6: "Y", 7: "U", 8: "я », 9: "о", 10: "р", 21: "а", 22: "с", 23: "д", 24: "F", 25: "г", 26: "ч", 27: "J", 28: "к", 29: "л", 42: "г", 43: "х", 44: "с", 45: "V", 46: "б", 47: "н", 48: "м"}
loop, parse, 1
{
    а: = A_LoopField
    ; получить случайное число от 1 до 10 и проверить, является ли оно 10
    ; если не пропустить оставшуюся часть этой итерации
    если r (10)! = 10
    {
        ч. = ​​а
        Продолжить
    }

    ; проверить, находится ли текущий символ в k
    г =
    для х, у в к
        г: = у = а х: г

    ; выберите случайное число, чтобы решить, какую опечатку делать
    д: = г (г 3: 2)
    если q = 1
        h. = aa; дублировать ключ
    если q = 3
    {
        ; массив клавиатуры настроен так, чтобы путем сложения или вычитания
        ; 20 из индекса вы двигаетесь вверх или вниз по строке
        ; и, добавляя или вычитая 1, вы двигаетесь вправо или влево
        ; тогда вам просто нужно проверить, если скорректированный индекс
        ; действует
        петля
        {
            т: = г (4)
            ш: = г + (т = 1 20:? Т = 2 -20:? Т = 3: 1: 1)
        } пока, если k.HasKey (W)
        ч. = ​​к [ш]
    }
}
; отображать строку как сообщение об ошибке
бросить% h
г (п)
{
    Случайные, ш, 1, п
    возвращение
}

С какими программами это работает?
Исмаэль Мигель

Он запускается AutoHotkey.exe. autohotkey.com
Person93
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.