Ten kot ma błędy? Naprawdę?

11

Wyzwanie:

Czytaj dane wejściowe (w widocznym zakresie ASCII) i dane wyjściowe z kilkoma modyfikacjami:

  1. W każdym zestawie 10 znaków losowo (50/50):
    • zamień jeden znak * (na losowy ** jeden w widocznym zakresie ASCII) (np. lumberjackstaje się lumbeZjack)
    • lub usuń jeden znak (np. lumberjackstaje się lmberjack)

* Jeśli zestaw ma mniej niż 10 znaków, nie musisz go modyfikować, ale możesz.
** Postać może być taka sama jak jedno wejście, o ile nadal jest losowa.

Przykład:

Dane wejściowe: Dane Go home cat! You're drunk!
wyjściowe: Go hom cat! YouLre drunk!
(tylko przykład, ponieważ dane wyjściowe mogą być losowe, nie należy używać ich jako przypadku testowego)

Zasady:

n4melyh4xor
źródło
5
@ n4melyh4xor również możesz publikować przyszłe wyzwania w piaskownicy . Tam otrzymasz informacje zwrotne na temat twojego wyzwania.
Rod
1
Co się stanie, jeśli znak zastępujący jest taki sam jak znak, który ma zostać zastąpiony?
Brad Gilbert b2gills,
@ BradGilbertb2gills, nie jestem wybredna, w porządku.
n4melyh4xor
Ściśle związany
AdmBorkBork,
Czy indeks zastępowanej postaci musi być losowy?
Yytsi

Odpowiedzi:

4

Pyth, 27 25 bajtów

VczTpXNOT?<JOr\ \ÞKC127JK

Zestaw testowy dostępny tutaj.

Dzięki Maltysen za zgolenie 2 bajtów.

Wyjaśnienie

VczTpXNOT?<JOr\ \ÞKC127JK    z autoinitalizes to input, T autoinitializes to 10 
 czT                         chop input into strings of length 10, returned as list of strings
V                            for each string N in this list:
            Or\ \Þ            randomly pick a char between ' ' (32) and 'Þ' (222)
           J                  and assign it to variable J
                  KC127       assign the DEL char to variable K
         ?<J      K           if J < K:
     XNOT              J       replace a random character in N with J
         ?<J      K           else:
     XNOT               K      replace a random character in N with K
    p                         print this string with no trailing newline

Jak to często bywa, uważam, że jest to naiwna metoda, którą można ulepszyć. Zwykle pisząc wyjaśnienie, znajduję coś oczywistego, ale tym razem nic mnie nie wyskoczyło.

Mike Bufardeci
źródło
1
Ładne użycie znaku usuwania! Jedna wskazówka jest taka, że ​​zasięg działa również na sznurku
Maltysen
@Maltysen Thanks! Myślałem o twoim komentarzu, ale nie jestem do końca pewien, gdzie mógłbym go użyć, aby zaoszczędzić miejsce. OC\¾jest taką samą liczbą bajtów, jak O190i przypisanie K do znaku usuwania nie oszczędza również miejsca.
Mike Bufardeci,
@Maltysen Zajęło mi to trochę, ale zrozumiałem, co masz na myśli i ogoliłem 2 bajty. Dzięki jeszcze raz!
Mike Bufardeci,
3

*> <> , 44 46 52 50 bajtów

rl5(?voooo/!|Ou+1Ox:@=?~o~oooo!
ol5(?v" ":/
o;!?l<

Wypróbuj tutaj!

Wykorzystuje dowolny znak ascii w pobliżu / powyżej miejsca dla losowych znaków. To zawsze edytuje szósty znak, chyba że jest to koniec łańcucha, a długość łańcucha nie jest wielokrotnością 10. To ma 50% szans na usunięcie siódmego znaku zamiast edytowania szóstego.

Wejście

Standard IEEE dla arytmetyki zmiennoprzecinkowej (IEEE 754) to techniczny standard obliczeń zmiennoprzecinkowych ustanowiony w 1985 r. Przez Instytut Inżynierów Elektryków i Elektroników (IEEE). Norma rozwiązała wiele problemów występujących w różnorodnych implementacjach zmiennoprzecinkowych, które utrudniały niezawodne i przenośne ich użycie. Wiele sprzętowych jednostek zmiennoprzecinkowych wykorzystuje teraz standard IEEE 754.

Wynik

Standard IEE dla arytmetyki zmiennoprzecinkowej (EEE 754) w standardzie technicznym! dla floa! ing-point! computati # n założonego w 1985 r. przez Insitute of! lectrical # and Electrnics Engi! eers (IEE%). St! Ndard add! Essed man! problemy # znalezione w! on nurków! floating oint impl! mentation ", że # # szalony # trudny do ui reliabl # i port! bly. Wiele! sprzętowe jednostki #% używają standardu! IEEE 754".

Edycja: Ta odpowiedź prawdopodobnie nie zawsze jest w widocznym zakresie ascii, edycja ... Naprawiono.

Edit2: Nie widziałem, że musi istnieć szansa 50/50 na usunięcie postaci, edycję ponownie ... Wierzę, że wszystko jest teraz w porządku :).

redstarcoder
źródło
Jeszcze jedno, ktoś zasugerował losową postać, więc teraz jest losowa.
n4melyh4xor
@ n4melyh4xor, to byłem ja! To jest losowe :).
redstarcoder
2

Perl 6 ,  78  67 bajtów

{[~] map {~S/.**{(^.chars).pick}<(./{(' '..'~').pick x Bool.pick}/},.comb(10)}
{[~] .comb(10)».&{~S/.**{10.rand}<(./{(' '..'~').pick x 2.rand}/}}

Spróbuj

Wyjaśnienie:

{
  [~]                  # reduce with string concatenation operator

  .comb(10)\           # take input and break it into chunks of up-to 10 chars

  ».\                 # on each of them call the following

  &{
    ~                  # Stringify the following

    S/                 # substituted
      .                # any char
        **             # repeated
           { 10.rand } # a random number of times

      <(               # ignore all of that

      .                # the char to be removed/replaced
    /{

      ( ' ' .. '~' ).pick  # choose a character
      x                    # string repeated
      2.rand               # zero or one times

    }/

  }
}
Brad Gilbert b2gills
źródło
2

Python 3 , 75 bajtów

75-bajtowy stosuje transformację do pierwszego znaku z każdej grupy i wybiera tylko 2 losowe znaki, takie jak w odpowiedzi Jelly (które OP dozwolone):

from random import*
f=lambda s:s and choice(['','a','b'])+s[1:10]+f(s[10:])

Wypróbuj online!

Jest to funkcja rekurencyjna, która przy każdej iteracji poprzedza albo nic 'a', albo 'b', a następnie wywołuje się z odciętymi pierwszymi 10 znakami. Końcowe zwarcie w iteracji w s and(pusty ciąg jest fałszem), unikając nieskończonej rekurencji.

Wynik wszystkich osobnych wywołań jest następnie łączony i wracany do kontekstu, który wywołał funkcję.

120 bajtów

Oczywiście to trochę przypomina oszustwo, więc oto jedno, które jest całkowicie losowe:

from random import*;r=randint
def f(S):a=S[:10];R=r(0,len(a)-1);print(end=a[:R]+chr(r(32,126))*r(0,1)+a[R+1:]);f(S[10:])

Wypróbuj online!

FlipTack
źródło
Gdzie OP wspomniało, że indeks zastąpionego znaku może wynosić 0?
Yytsi
@TuukkaX komentarze zostały usunięte, aby uniknąć bałaganu, ale to właśnie robi galaretka odpowiedź , a OP powiedział, że było w porządku.
FlipTack,
1

Galaretka , 15 14  13 bajtów 13 znaków

2X
s⁵µ¢1¦ṫ¢µ€

TryItOnline!

Zastępuje lub usuwa pierwszy z każdych dziesięciu znaków, w tym ten z ostatnich 1-9, jeśli występuje taki fragment. Wybiera z, co prawda niewielkiego, podzbioru znaków 1:; 2.

W jaki sposób?

2X         - Link 1, flip a coin: no arguments
 X         - random choice from
2          - 2 (treated as the integers [1,2])

s⁵µ¢1¦ṫ¢µ€ - Main link: string of printable ASCII
s⁵         - split (s) into chunks of size ten (⁵)
  µ     µ  - monadic chain separation 
         € - for each chunk
   ¢       -     last link as a nilad
    1¦     -     apply to index 1 (replace 1st of the 10 char chunk with the chosen integer)
       ¢   -     last link as a nilad
      ṫ    - tail - if it was 1 this has no effect (50%)
                  - if it was 2 this discards the replaced character (50%)
           - implicit print

Aby wybrać spośród wszystkich drukowalnych ASCII zamiast tylko 1i 2(wciąż zastępując lub usuwając pierwszy znak każdego fragmentu) w 21 bajtach:

s⁵µ32r126¤ỌX¤1¦ṫ2X¤µ€

Dla wersji w pełni losowej (usuwanie / zamiana 50/50, jednolite losowe ASCII do wydruku i jednolicie losowa lokalizacja znaków w każdej części) mam 30 bajtów (prawdopodobnie nieoptymalnych):

95R+31ỌX;

s⁵µṙ⁵X¤©Ṗ2X¤Ŀṙ®C¤µ€

Powoduje to obracanie każdej części o losową liczbę, usuwa ostatnią postać, a następnie wywołuje losowe jedno z pierwszych dwóch łączy, z których jedno jest puste, a drugie łączy się z losowym drukowalnym znakiem ASCII; następnie ponownie obraca porcję w prawo.

Jonathan Allan
źródło
To naprawdę sprzeczne z duchem postu
Maltysen
@Maltysen - OP powiedział, że wszystkie te rzeczy są w porządku.
Jonathan Allan,
Gdzie? Nic nie widzę w komentarzach ani OP.
Maltysen
@Maltysen zostały usunięte.
Jonathan Allan,
1
Był komentarz, który wyraźnie mówi, że możemy wybierać spośród 2 znaków ORAZ, że nie chcieli oni umieszczać go w treści pytania.
Jonathan Allan,
1

Python3, 188 186 184 114 znaków

from random import*
s=input()
for c in[s[i:i+10]for i in range(0,len(s),10)]:print(end=choice(["","x","y"])+c[1:])

Wydaje się za długi. Prawdopodobnie można go znacznie skrócić za pomocą lambda.

Najwyraźniej OP pozwolił wybrać losowy znak z listy dwóch znaków, a indeks znaku, który ma zostać zastąpiony, może być stały. Po modyfikacjach moja odpowiedź wyglądałaby dokładnie tak samo jak przesłanie @FlipTacks w Pythonie, więc jest to forma, w której jestem.

@FlipTack zapisał 5 bajtów!

Yytsi
źródło
0

Clojure, 135 139 bajtów

Edycja: Zapomniałem użyć partition-allzamiast partition.

(fn[i](apply str(flatten(map #(let[r rand-int [b e](split-at(r 9)%)][b(if(<(rand)0.5)""(char(+(r 25)97)))(rest e)])(partition-all 10 i)))))

Nie golfowany:

(def f (fn[i]
         (->> i
              (partition-all 10)
              (map #(let [[begin end] (split-at (rand-int 9) %)]
                      [begin (if (< 0.5 (rand)) "" (char (+(rand-int 25)97))) (rest end)]))
              flatten
              (apply str))))

Człowieku, te nazwy funkcji są długie ... W każdym razie dzieli dane wejściowe na partycje po 10 znaków, dzieli je losowo na dwie połowy, losowo wstrzykuje pusty ciąg lub losowy znak między nimi i odrzuca pierwszy znak drugiej połowy.

NikoNyrh
źródło
0

Mathematica 133 bajtów (129 znaków)

StringReplacePart[#,Table[If[(r=RandomInteger)[]<1,"",FromCharacterCode@r@128],c=⌊StringLength@#/10⌋],Array[{g=10#-9+r@9,g}&,c]]&

76 znaków, aby wpisać nazwy 8 funkcji: /

Użycie ⌊..⌋zamiast Floor[]zapisuje 5 znaków, 1 bajt.

Kelly Lowder
źródło
0

Python 3, 129 bajtów

def f(s):f=id(s)%9+1;print(''.join(j[0:f-1]+chr(33+id(s)%94)*(id(s)//10%2)+j[f:]for j in [s[i:i+10]for i in range(0,len(s),10)]))

Aby zaoszczędzić trochę bajtów, zamiast importować losowy moduł Pythona, po prostu wykonałem kilka operacji modulo na id łańcucha, który powinien być inny za każdym razem. Na przykład program zdecyduje, czy usunąć znak, czy zastąpić znak na podstawie tego, czy id(string)//10jest parzysty, czy nie (dzielę liczbę całkowitą przez 10, ponieważ ostatnia cyfra zawsze będzie parzysta).

Cormac
źródło