बेतरतीब ढंग से एक शब्द याद आती है


16

इस CR प्रश्न से प्रेरित होकर (कृपया मुझे CR ब्राउज़ करने के लिए मत मारो)

कल्पना

किसी शब्द को गलत बताने की संभावनाएँ हैं:

  • समय का 1/3 आउटपुट नहीं बदलता है
  • समय के 1/3 एक यादृच्छिक चरित्र को हटा दें
  • 1/3 समय एक यादृच्छिक चरित्र की नकल करता है

इनपुट में दिए गए वर्ण को हटाने / डुप्लिकेट करने का मौका सभी वर्णों के लिए समान होना चाहिए।

यदि दो लगातार वर्ण समान हैं (केस-संवेदी), तो उनमें से एक के संशोधित होने की संभावना समान होनी चाहिए जैसे कि वे एक वर्ण हों। यानी के लिए outputs AA(जो AAया Aया AAA) सभी एक ही संभावना होनी चाहिए।


इनपुट में केवल सादगी के लिए अक्षर होंगे।

उदाहरण

पहली पंक्ति इनपुट है, निम्नलिखित लाइनें सभी संभव गलत वर्तनी हैं। प्रत्येक पंक्ति में आउटपुट होने की समान संभावना होनी चाहिए, इनपुट को उदाहरणों में बाहर रखा गया है, लेकिन इसमें आउटपुट की 1/3 संभावना होनी चाहिए।

foo

fo
oo
ffoo
fooo
PPCG

PPC
PPG
PCG
PPPCG
PPCCG
PPCGG

यह एक अच्छी चुनौती है, लेकिन अगर प्रत्येक पंक्ति में आउटपुट होने की समान संभावना है, तो इसका मतलब यह नहीं है कि यह 1/3 मौका नहीं है कि शब्द समान रहता है?
मूल्य इंक

@ValueInk ठीक है कि उदाहरणों के साथ एक दोष है। मुझे ठीक करने दें
डाउनगोट

3
प्रतीक्षा करें, यदि प्रत्येक पंक्ति में आउटपुट होने की समान संभावना होगी, तो क्या वर्णों का वितरण समान नहीं होगा? जैसे, fooयदि आप किसी पात्र को हटाते हैं तो वह (-f) ऊ, एफ (-ओ) ओ, और फो (-ओ) बन सकता है। तो foसंभावना के रूप में दोगुना होना चाहिए oo, लेकिन आप कहते हैं कि हर पंक्ति में समान संभावना है।
Deusovi

2
@Deusovi वहाँ एक पूरा पैराग्राफ है यह खोज, मैं कॉपी करूँगा कि यहाँ सिर्फ मामले मेंIf two consecutive characters are the same (case-sensitive), the probability of one of them being modified should be the same as if they are one character. I.e. the outputs for AA (which are AA or A or AAA) should all have the same probability.
edc65

1
@DJMcMayhem नहीं, एक से अधिक अक्षर आमतौर पर गलत होते हैं; _;
डाउनगोट

जवाबों:


5

पिप , 38 27 बाइट्स

a@:`(.)\1*`YRR#aa@y@0X:RR3a

यह मजेदार था - पिप की रेगेक्स और म्यूटेबल स्ट्रिंग क्षमताओं का उपयोग करने के लिए मिला, जिसे मैंने थोड़ी देर में बाहर नहीं निकाला था। कमांड-लाइन तर्क के माध्यम से इनपुट लेता है।

स्पष्टीकरण:

a@:`(.)\1*`                  Split a into runs of identical chars using regex match
           YRR#a             Yank randrange(len(a)) into y (randomly choosing one such run)
                a@y@0        Take the first character of that run
                     X:RR3   Modify in place, string-multiplying by randrange(3):
                               If RR3 is 0, character is deleted
                               If RR3 is 1, no change
                               If RR3 is 2, character is duplicated
                          a  Output the modified a

इसे ऑनलाइन आज़माएं!


1
वाह, केवल ASCII के साथ एक
ट्रिक

3

रूबी, 64 55 + 1 ( pध्वज) = 56 बाइट्स

इनपुट नई लाइन को पीछे किए बिना STDIN पाइप की एक लाइन है।

a=[]
gsub(/(.)\1*/){a<<$&}
a.sample[-1]*=rand 3
$_=a*''

2

CJam (21 बाइट्स)

re`_,mr_2$=3mr(a.+te~

ऑनलाइन डेमो

विच्छेदन

r     e# Read a line of input from stdin
e`    e# Run-length encode it
_,mr  e# Select a random index in the RLE array
_     e# Hang on to a copy of that index
2$=   e# Copy the [run-length char] pair from that index
3mr(  e# Select a uniformly random integer from {-1, 0, 1}
a.+   e# Add it to the run-length
t     e# Replace the pair at that index
e~    e# Run-length decode

2

जावास्क्रिप्ट (ईएस 6), 107

w=>(r=x=>Math.random()*x|0,a=w.match(/(.)\1*/g),a[p=r(a.length)]=[b=a[p],b+b[0],b.slice(1)][r(3)],a.join``)

कम गोल्फ वाला

w=>(
  a = w.match(/(.)\1*/g),
  r = x => Math.random()*x | 0,
  p = r(a.length),
  b = a[p],
  a[p] = [b, b+b[0], b.slice(1)][r(3)],
  a.join``
)

परीक्षा

f=w=>(r=x=>Math.random()*x|0,a=w.match(/(.)\1*/g),a[p=r(a.length)]=[b=a[p],b+b[0],b.slice(1)][r(3)],a.join``)

function update() { 
  O.innerHTML = Array(99)
  .fill(I.value)
  .map(x=>(
    r=f(x),
    r==x?r:r.length<x.length?'<b>'+r+'</b>':'<i>'+r+'</i>'
  
    )
  ).join` `
}

update()
#O { width:90%; overflow: auto; white-space: pre-wrap}
<input id=I oninput='update()' value='trolley'><pre id=O></pre>


2

जावा 7, 189 180 178 बाइट्स

import java.util.*;String c(String i){Random r=new Random();int x=r.nextInt(2),j=r.nextInt(i.length());return x<1?i:i.substring(0,j-(x%2^1))+(x<2?i.charAt(j):"")+i.substring(j);}

अनगुल्ड और परीक्षण के मामले:

इसे यहाँ आज़माएँ।

import java.util.*;
class M{
  static String c(String i){
    Random r = new Random();
    int x = r.nextInt(2),
        j = r.nextInt(i.length());
    return x < 1
            ? i
            : i.substring(0, j - (x%2 ^ 1)) + (x<2?i.charAt(j):"") + i.substring(j);
  }

  public static void main(String[] a){
    for(int i = 0; i < 5; i++){
      System.out.println(c("foo"));
    }
    System.out.println();
    for(int i = 0; i < 5; i++){
      System.out.println(c("PPCG"));
    }
  }
}

संभव उत्पादन:

foo
fooo
foo
foo
ffoo

PPCCG
PPCG
PPCCG
PPPCG
PPCG


1

पायथ - 17 बाइट्स

यह वास्तव में लगातार चार वर्णों के साथ विशेष मामलों को सही ढंग से संभालता है।

 XZOKrz8Or_1 2r9K

टेस्ट सूट


यह 16 बाइट्स है? क्या अग्रणी स्थान सही है? यदि यह 15 बाइट्स नहीं है?
डाउनगोट

@Downgoat नहीं, अग्रणी स्थान सही है। मुझे पूरा यकीन है कि इसकी 17 बाइट्स हैं।
माल्टसेन

1

एपीएल, 21

{⍵/⍨3|1+(?3)×(⍳=?)⍴⍵}

यह यादृच्छिक स्थिति में 1 के साथ शून्य के वेक्टर को बनाने से शुरू होता है। फिर 1 और 3. +1 के बीच एक यादृच्छिक संख्या से इसे गुणा करता है और आधुनिक 3 सभी 1s के साथ एक वेक्टर प्राप्त करता है और एक यादृच्छिक 0,1 या 2 तैनात करता है।

अंत में, be / that का कहना है कि प्रत्येक अक्षर को n बार लिखा जाना चाहिए, जहां n वेक्टर में संख्याएं हैं।

इसे tryapl.org पर आज़माएं


0

पायथन 2, 123 बाइट्स

from random import*
R=randint
s=input()
m=n=R(0,len(s)-1)
c=R(0,2)
m=[m,1+[-len(s),m][m>0]][c==1]
n+=c==2
print s[:m]+s[n:]

0

जावास्क्रिप्ट (ईएस 6), 103

w=>{w=w.split(''),r=Math.random,x=r(),i=r()*w.length|0;w.splice(i,x<.6,x>.3?w[i]:'');alert(w.join(''))}

0

एपीएल, 27 बाइट्स

{⍵/⍨(?3)⌷1⍪2 0∘.|1+(⍳=?)⍴⍵}

स्पष्टीकरण:

                        ⍴⍵  ⍝ length of ⍵
                   (⍳=?)    ⍝ bit vector with one random bit on 
                 1+         ⍝ add one to each value (duplicate one character)
           2 0∘.|           ⍝ mod by 2 and 0 (remove instead of duplicate)
         1⍪                 ⍝ add a line of just ones (do nothing)
    (?3)⌷                   ⍝ select a random line from that matrix
 ⍵/⍨                        ⍝ replicate characters in ⍵

परीक्षा:

      {⍵/⍨(?3)⌷1⍪2 0∘.|1+(⍳=?)⍴⍵} ¨ 10/⊂'foo'
 fooo  foo  oo  foo  fo  fo  oo  fo  oo  fooo 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.