แทรกความผิดพลาดลงในข้อความ


63

ฉันเขียนข้อความ แต่มันดูเป็นมืออาชีพเกินไป ฉันต้องการทำให้ดูเหมือนว่าฉันเหนื่อยมากเมื่อฉันเขียนมัน ฉันต้องการให้คุณใส่ตัวพิมพ์ผิด

ความท้าทายของคุณคือการใช้ข้อความบรรทัดเดียวและเพิ่มความผิดพลาด ซึ่งหมายความว่าสำหรับตัวละครแต่ละตัวจะมีโอกาส 10% ที่จะพิมพ์ออกมา

คำจำกัดความของ "typofied" คือคุณต้องเลือก (แบบสุ่ม) อย่างใดอย่างหนึ่งต่อไปนี้:

  • ทำซ้ำอักขระ
  • ลบตัวละคร
  • เลื่อนอักขระหนึ่งช่องว่างของคีย์บอร์ด "keyboard" ถูกกำหนดเป็น:

    qwertyuiop
    asdfghjkl
     zxcvbnm
    

    สำหรับการเลื่อนตัวละครคุณต้องขึ้นหนึ่งช่องว่างขึ้นลงซ้ายหรือขวา ต้องเลือกแบบสุ่ม ตัวเลือก shift จะใช้กับอักขระที่เป็นตัวอักษรเท่านั้น เคสต้องได้รับการเก็บรักษาไว้ ระวังตัวกล่องขอบด้วยm!

คำจำกัดความของ "สุ่ม" คือผลลัพธ์ต้องไม่สามารถคาดเดาได้ (โดยดูผลลัพธ์ก่อนหน้า) ตัวอย่างเช่นคุณไม่สามารถพิมพ์อักขระทุกตัวที่สิบ นอกจากนี้การสุ่มต้องมีการแจกแจงแบบสม่ำเสมอ ตัวอย่างเช่นคุณไม่สามารถทำซ้ำ 30% ลบ 30% และเปลี่ยน 40% จะต้องมีโอกาส 1/3 สำหรับแต่ละคน (1/2 สำหรับแต่ละคนหากเป็นตัวอักษรที่ไม่ใช่ตัวอักษร)

อินพุตตัวอย่าง:

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

ตัวอย่างผลลัพธ์:

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

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ


4
สิ่งที่เกี่ยวกับการกดปุ่ม capslock โดยไม่ตั้งใจ? เมื่อหนึ่งพิมพ์ "A" หรือ "Z" ควรมีโอกาสสุ่มว่าพวกเขาจะกดปุ่ม capslock แทน ND END ขึ้นเช่นนี้
AJMansfield

2
@JMansfield Lol ที่อาจซับซ้อนเกินไป มันซับซ้อนพอแล้วที่เป็นเช่นนี้: P
Doorknob

1
@ user2509848 เฮ้หยุดยั้ง aking แร่ co plicated กว่าที่เป็นอยู่แล้ว! :-P
Doorknob

1
@Doorknob ผลลัพธ์ตัวอย่างของคุณดูเหมือนว่าคุณเหนื่อยแล้วดูเหมือนว่าคุณยังใหม่กับการพิมพ์และคุณไม่รู้วิธีแก้ไขการพิมพ์ผิด (หรือคุณไม่ได้ดูสิ่งที่คุณพิมพ์เลย )
แบล็กไลท์ส่องแสง

1
"edge-cases" <- ฉันเห็นสิ่งที่คุณทำที่นั่น * clap ช้า *
Adam Maras

คำตอบ:


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
ผมค่อนข้างบางอย่างที่คุณไม่จำเป็นต้องใส่ char*s[26]26 คอมไพเลอร์ควรจะสามารถคิดออกเอง
FDinoff

@FDinoff อ่าแน่นอน การแก้ไขจุดไม่มากตอนนี้; เรือจมแล้ว :-D
คลื่นไส้ ossifrage

คุณสามารถแทนที่ทั้งสองcontinueด้วยelses (ปล่อยให้;ตำแหน่งแรกอยู่)
AShelly

1
ปัญหาของการสุ่ม ()% 1 คืออะไร int% 1 ใด ๆ ควรเป็น 0
253751

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 ไม่ได้ ที่นี่ฉันรันโปรแกรมนี้ 10 ครั้งด้วย STDIN '0123456789'x10 คือ 100 หลัก (เช่น 1,000 หลักใน 10 ครั้ง) และไม่มีการทำซ้ำตัวเลขในผลลัพธ์ มีปัญหากับเว็บไซต์นั้นหรือฉันเข้าใจว่ามันทำงานอย่างไร
2846289

@VadimR จับได้ดีขอบคุณ! ฉันเริ่มใช้Kernel#putcพิมพ์ผลลัพธ์เนื่องจากไม่ต้องใช้ parens ช่วยฉันได้ตัวละครตัวหนึ่ง แน่นอนputcพิมพ์อักขระแรกเท่านั้นและบางครั้งสตริงออกอาจยาวสองอักขระ ความผิดพลาดโง่ ๆ ลองรุ่นนี้!
Paul Prestidge

สมบูรณ์แบบแล้ว ขอขอบคุณ.
2846289

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

เทคนิคการค้นหาที่ง่ายมากสักครู่ฉันคิดว่ามันอาจจะถูกกว่าในการเข้ารหัสแป้นพิมพ์เป็นกราฟที่ไม่ได้บอกทิศทาง ตั้งแต่ฟังก์ชั่นแบบสุ่ม ธ มีชื่อเกินไปอธิบายผมใช้เฉพาะการเปลี่ยนชื่อไปยังchoice() wโอกาสในการเกิดข้อผิดพลาด 10% จะถูกจัดการโดยw([z]*9+[...])ที่ตัวอักขระเก้าตัวที่ไม่พิมพ์ผิดอยู่ในรายการที่มีตัวพิมพ์หนึ่งตัว

-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 afaik)
SimonT

1
รหัสนี้มีตัวอักษรหลายตัวแบ่ง:?;: <etc
Dhara

1
นอกจากนี้ยังมีข้อผิดพลาดแบบ off-one ในการทำดัชนี: 'b' ใน 'bbbbbbbb' จะถูกแทนที่ด้วย 'x', 'zzzzzzzzzzzz' ให้ดัชนีนอกขอบเขต
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

@ Xantix ฉันรู้ แต่พวกเขาไม่เคยบอกว่ามันต้องเป็นโปรแกรม ไม่ว่าจะด้วยวิธีใดคำตอบของฉันในตอนนี้มีการห่อโปรแกรม
มือ-E-อาหาร

ฉันเพิ่งรู้ว่าฟังก์ชั่นของฉันจะยอมรับอักขระ 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('')}

อัลกอริทึมสำหรับ keyslip:

  • ค้นหาอักขระในสตริง (หรือตัวพิมพ์ใหญ่)
  • เพิ่ม 11, -11, 1 หรือ -1 ในดัชนี
  • ถ้ามันไม่ถูกต้อง (0 หรือ null) ให้หมุนใหม่

รุ่นที่ไม่ใช่กอล์ฟต่อคำขอ:

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

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

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

      // we must be in keyslip mode.

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

ไชโย! รับรางวัล JS นินจา!
Sunny R Gupta

1
@SunnyRGupta ขอบคุณ! หวังว่าฉันจะได้รับมันมากขึ้น ฉันคิดว่านรกในวงเล็บขนาดใหญ่อาจทำให้มันนานเกินความจำเป็น
ไม่ใช่ชาร์ลส์

นอกจากนี้พยายามที่จะแสดงรุ่นที่ไม่ใช่แบบย่อสำหรับสามเณร!
Sunny R Gupta

ในทางเทคนิคแล้วโค้ดของคุณมี 277 ไบต์บน windows ;คุณควรเปลี่ยนการขึ้นบรรทัดใหม่ทั้งหมดที่มี นั่นเป็นวิธีเดียวที่จะบอกว่าจริง ๆ แล้วมี 274 ไบต์ นอกจากนี้ยังใช้งานได้เฉพาะกับ Javascript และ JScript เวอร์ชันใหม่กว่าเท่านั้น
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

ทำงานด้วย-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ช่วยและเพิ่มประสิทธิภาพอื่น ๆ เราจัดการเพื่อลดขนาดรหัสอย่างมาก

วิธีการสุดท้ายใช้เทคนิคบางอย่างกับการค้นหา regexp เพื่อค้นหาขั้นตอนที่ถูกต้องพร้อมสตริงการแทนที่การกำจัดการตรวจสอบด้วยตนเอง

การแก้ไขอื่น: ปิด 5 ไบต์เพราะเราไม่ต้องการจำนวนเต็มสำหรับดัชนีอาเรย์ + เคล็ดลับเล็ก ๆ กับดัชนีอาเรย์ที่ผิดกฎหมาย ฉันลองใช้เคล็ดลับเดียวกันกับ[-4+rand@-](เช่นดัชนีเชิงลบ) และกำจัดองค์ประกอบรายการหนึ่ง'',แต่ก็ไม่ได้บันทึกอะไรเลย

แก้ไข: กลับสู่ความเรียบง่าย - แทนที่เงื่อนไข~~rand 10ด้วยการrand>.1บันทึก 2 ไบต์ ...


1
sub iไม่มีความจำเป็นสำหรับอัฒภาคหลังจากนิยามของไม่ได้ คุณไม่ได้ใช้ความเข้มงวดจึง'QWERTYUIOP0ASDFGHJKL000ZXCVBNM'สามารถกำหนดให้เป็น bareword (บันทึกอักขระเครื่องหมายคำพูดสองตัว) ในทำนองเดียวกันสามารถทำได้'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 ไบต์

นี่คือความพยายามของฉัน

มันเป็นบางอย่าง "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 รหัสคือมีแท็บมากมายและขึ้นบรรทัดใหม่

มันไม่ได้ผลิต "ความไม่ถูกต้อง" แบบเดียวกัน แต่เป็นการลบหรือแทนที่อักขระโดยใช้เงื่อนไขดังกล่าว

คุณสามารถลองได้ที่http://writecodeonline.com/php/

คัดลอกและวางรหัสนี้:

function _($m){$q=array(array('qwertyuiop','asdfghjkl',' zxcvbnm'),'!.-,;?+/');$r='mt_rand';foreach(str_split($m)as$k=>$c)if(!$r(0,9)&&$c!=' ')foreach($q[0]as$x=>$y)if(($z=strpos($y,$c))!==!1){switch($t=$r(-3,2-($z>>3)-($x>>1))){case 2:++$z;break;case 1:++$x;break;case -1:--$x;break;case -2:--$z;break;case -3:$z=8;break;}$m[$k]=$t?$q[0][$x][$z]:$q[1][$z];}return$m;}
echo _('This is some correct text. It is too correct. Please un-correctify it.');

หลังจากการทดสอบโปรดบอกฉันว่ามันเป็นคำตอบที่ถูกต้อง


ดูเหมือนจะไม่ส่งผลกระทบต่อตัวพิมพ์ใหญ่เลย
ossifrage คลื่นไส้

1
ตัวอักษรพิมพ์ใหญ่ไม่ได้รับผลกระทบในตัวอย่าง แต่ใช่มันไม่ได้ แต่ก็สังเกตว่าฉันบอกว่ามันใช้งานได้จริงKINDA
Ismael Miguel

3

C #, 581 ไบต์

using System;class B{static void Main(){var z=Console.ReadLine();var r=new Random();foreach(char C in z){String o;if(r.Next(10)==0){int w=r.Next(3);o=w==0?C+""+C:w==1?"":f(C,r);}else{o=C+"";}Console.Write(o);}Console.ReadLine();}static string f(char C,Random r){string[]k={"00000000000","0qwertyuiop0","0asdfghjkl0","00zxcvbnm0","000000000"};char L=char.ToLower(C);char h='0';for(int i=1;i<4;i++){var d=k[i].IndexOf(L);if(d!=-1){while(h=='0'){int n=r.Next(4);h=n==0?k[i][d-1]:n==1?k[i][d+1]:n==2?k[i-1][d]:k[i+1][d];}h=char.IsUpper(C)?char.ToUpper(h):h;return h+"";}}return C+"";}}

และในรูปแบบที่อ่านได้มากขึ้น:

using System;

class A
{
    static void Main()
    {
        var z = Console.ReadLine();
        var r = new Random();

        foreach (char C in z)
        {
            String o;

            if (r.Next(10) == 0)
            {
                int w = r.Next(3);
                o = w == 0 ? C + "" + C :
                    w == 1 ? "" :
                             f(C, r);
            }
            else
            {
                o = C + "";
            }

            Console.Write(o);
        }
    }

    static string f(char C, Random r)
    {
        string[] k = {
                            "00000000000", 
                            "0qwertyuiop0", 
                            "0asdfghjkl0", 
                            "00zxcvbnm0", 
                            "000000000"};  
        char L = char.ToLower(C);
        char h = '0';

        for (int i = 1; i < 4; i++)
        {
            var d = k[i].IndexOf(L);

            if (d != -1)
            {
                while (h == '0')
                {
                    int n = r.Next(4);

                    h = n == 0 ? k[i][d - 1] :
                        n == 1 ? k[i][d + 1] :
                        n == 2 ? k[i - 1][d] :
                                 k[i + 1][d];
                }
                h = char.IsUpper(C) ? char.ToUpper(h) : h;
                return h + "";
            }
        }
        return C + "";
    }
}

3

PHP, 326 320 318 315 ตัวอักษร

$h=array(qs,vhn,vxf,sefx,wrd,drgc,fthv,gyjb,uko,hukn,jilm,ok,nk,bjm,ilp,o,aw,etf,awdz,rgy,yji,cgb,qse,zdc,thu,sx);$a=x.$argv[1];for(;$d=$a[++$b];)echo!rand(0,9)&&($c=ord($d)-65)?(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?$d.$d:($g<2?"":(($j=$i[rand(0,strlen($i=$h[$c-!$e*32]))])&&$e?strtoupper($j):$j))):$d;

และรุ่นที่อ่านได้และแสดงความคิดเห็นเพิ่มเติม:

// $a   input
// $b   char iterator
// $c   current char ascii value
// $d   current char
// $e   is uppercase
// $g   rand() output
// $h   char displacement
// $i   current character in $h
// $j   temporary var for uppercasing

// the neighbouring characters of a-z, in alphabetical (and ASCII) order
$h=array(qs,vhn,vxf,sefx,wrd,
    drgc,fthv,gyjb,uko,hukn,
    jilm,ok,nk,bjm,ilp,
    o,aw,etf,awdz,rgy,
    yji,cgb,qse,zdc,thu,
    sx);
// input from argument
$a=x.$argv[1];

for(;$d=$a[++$b];)
    echo!rand(0,9)&&($c=ord($d)-65)? /* 10% chance, read char ASCII value - 65 into $c */
        (!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?
          /* random number from 0 to 2 (if alphabetic) or 0 to 1 stored in $g */
            $d.$d: /* double char if $g = 0 */
            ($g<2?
                "": /* omit char if $g = 1*/
                (($j=$i[rand(0,strlen($i=$h[$c-!$e*32]))])&&$e?
                  /* $j = random neighbour of the current char */
                    strtoupper($j): /* uppercase $j */
                    $j)))
        :$d; /* keep char */

ยังคงสามารถปรับปรุงได้ฉันคิดว่า

-2, -3 ขอบคุณ Ismael Miguel


1
ที่ซึ่งคุณมี(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)?2:1))การเปลี่ยนแปลง(!($g=rand(0,($e=($c>-1&&$c<26)or$c>31&&$c<58)+1))?และคุณจะประหยัด 2 ไบต์
Ismael Miguel

1
ที่ที่คุณมี($e?0:32)แทนที่ด้วย32*!!$e(สังเกตเห็นการขาดวงเล็บ) บันทึก 2 ไบต์ ถ้า$eเป็นบูลีนคุณสามารถทำได้32*!$eและคุณบันทึกได้ 3 ไบต์ สิ่งนี้จะทำงานได้เพราะ php มีความสำคัญทางคณิตศาสตร์ ซึ่งหมายความว่าการคูณและการหารเกิดขึ้นก่อนการเพิ่มและการลบใด ๆ
Ismael Miguel

2

Java (475 ไบต์)

นี่คือความพยายามของฉันในภาษา verbose นั่นคือ 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 ไบต์

อินพุตต้องถูกกำหนดเป็นพารามิเตอร์บรรทัดคำสั่งเอาต์พุตจะถูกกำหนดเป็นข้อความแสดงข้อผิดพลาด

รุ่น golfed

วน, แยกวิเคราะห์, 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: "เอ็กซ์" 44: "C", 45: "วี", 46: "B", 47: "n", 48: "m"}, A: = A_LoopField, Q: r = (? Z 3: 2) Z =
ถ้า r (10)! = 10 {
h. = a
ต่อ
}
สำหรับ x, y ใน k
Z: y = x = a: 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
ผลตอบแทน
}

รุ่นที่ไม่ตีกอล์ฟและมีคำอธิบายประกอบ (ข้อแตกต่างคือรุ่นนี้มีพื้นที่สีขาวมากกว่าและการกำหนดตัวแปรอยู่ในบรรทัดที่แยกต่างหากเพื่อให้สามารถอ่านได้)

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: "วี", 46: "B", 47: "n", 48: "m"}
วน, แยกวิเคราะห์, 1
{
    A: = A_LoopField
    รับตัวเลขสุ่มจาก 1-10 และตรวจสอบว่าเป็น 10 หรือไม่
    ; ถ้ามันไม่ข้ามส่วนที่เหลือของการทำซ้ำนี้
    ถ้า r (10)! = 10
    {
        h. = a
        ต่อ
    }

    ตรวจสอบว่าตัวละครปัจจุบันอยู่ใน k
    Z =
    สำหรับ x, y ใน k
        Z: y = x = a: 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
    ผลตอบแทน
}

โปรแกรมนี้ใช้งานอะไรได้บ้าง?
Ismael Miguel

มันทำงานโดย AutoHotkey.exe autohotkey.com
บุคคล 93
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.