Kucing ini punya serangga? Betulkah?

11

Tantangan:

Baca input (dalam rentang ASCII yang terlihat) dan output dengan beberapa modifikasi:

  1. Dalam setiap set 10 karakter input secara acak (50/50):
    • ganti satu karakter * (dengan acak ** satu dalam rentang ASCII yang terlihat) (mis. lumberjackmenjadi lumbeZjack)
    • atau hapus satu karakter (mis. lumberjackmenjadi lmberjack)

* Jika set kurang dari 10 karakter, Anda tidak perlu memodifikasinya, tetapi Anda bisa.
** Karakter dapat sama dengan satu input, asalkan masih acak.

Contoh:

Input: Go home cat! You're drunk!
Output: Go hom cat! YouLre drunk!
(hanya sebuah contoh, karena output bisa acak, jangan gunakan sebagai test case)

Aturan:

  • , paling tidak karakter yang menang!
n4melyh4xor
sumber
5
@ n4melyh4xor juga Anda bisa memposting tantangan masa depan di Sandbox . Di sana Anda akan mendapatkan umpan balik tentang tantangan Anda.
Rod
1
Bagaimana jika char pengganti sama dengan char yang akan diganti?
Brad Gilbert b2gills
@ BradGilbertb2gills, saya tidak pilih-pilih, tidak apa-apa.
n4melyh4xor atau
Erat terkait
AdmBorkBork
Apakah indeks karakter yang akan diganti harus acak?
Yytsi

Jawaban:

4

Pyth, 27 25 byte

VczTpXNOT?<JOr\ \ÞKC127JK

Test suite tersedia di sini.

Terima kasih kepada Maltysen karena telah memangkas 2 byte.

Penjelasan

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

Seperti yang sering terjadi, saya merasa bahwa ini adalah metode yang naif dan dapat ditingkatkan. Biasanya saya menemukan sesuatu yang jelas saat mengetik penjelasan tetapi tidak ada yang melompat keluar pada saya saat ini.

Mike Bufardeci
sumber
1
Penggunaan char delete yang bagus! Salah satu tipnya adalah rentang beroperasi pada string juga
Maltysen
@Maltysen Terima kasih! Saya telah memikirkan komentar Anda, tetapi saya tidak sepenuhnya yakin di mana saya dapat menggunakannya untuk menghemat ruang. OC\¾adalah jumlah byte yang sama dengan O190, dan menugaskan K untuk menghapus char tidak menghemat ruang juga.
Mike Bufardeci
@Maltysen Jadi saya butuh sedikit tapi saya menyadari apa yang Anda maksud dan saya telah mencukur 2 byte. Terima kasih lagi!
Mike Bufardeci
3

*> <> , 44 46 52 50 byte

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

Coba di sini!

Ini menggunakan karakter ascii dekat / di atas ruang untuk karakter acak. Ini selalu mengedit karakter ke-6, kecuali itu adalah akhir dari string dan panjang string itu bukan kelipatan 10. Ini memiliki peluang 50% untuk menghapus karakter ke-7 daripada mengedit ke-6.

Memasukkan

Standar IEEE untuk Aritmatika Floating-Point (IEEE 754) adalah standar teknis untuk perhitungan floating-point yang didirikan pada tahun 1985 oleh Institute of Electrical and Electronics Engineers (IEEE). Standar ini menangani banyak masalah yang ditemukan dalam implementasi floating point yang beragam yang membuatnya sulit digunakan secara andal dan mudah dibawa. Banyak unit floating point perangkat keras sekarang menggunakan standar IEEE 754.

Keluaran

Standar IEE untuk Float $ ng-Point Aithmetic (EEE 754) adalah standar teknis! untuk floa! ing-point! computati # n didirikan pada tahun 1985 oleh Insitute of! lectrical # dan Electrnics Engi! eers (IEE%). The st! Ndard add! Essed man! ditemukan masalah! he penyelam! mengaplikasi perintah "yang gila itu? sulit untuk dapat dipercaya dan port! banyak. perangkat keras untuk unit po% n% menggunakan standar! IEEE 754".

Sunting: Jawaban ini mungkin tidak selalu dalam rentang ascii yang terlihat, diedit ... Tetap.

Sunting2: Tidak melihat perlu ada peluang 50/50 untuk menghapus karakter, mengedit lagi ... Saya percaya semuanya sudah beres sekarang :).

redstarcoder
sumber
Satu hal lagi, seseorang menyarankan karakter acak jadi acak sekarang.
n4melyh4xor atau
@ n4melyh4xor, itu saya! Itu acak :).
redstarcoder
2

Perl 6 ,  78  67 byte

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

Cobalah

Penjelasan:

{
  [~]                  # 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
sumber
2

Python 3 , 75 byte

75-byte menerapkan transformasi ke karakter pertama dari setiap grup, dan hanya mengambil dari 2 karakter acak, seperti pada jawaban Jelly (yang diizinkan OP):

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

Cobalah online!

Ini adalah fungsi rekursif yang, setiap iterasi, tidak menambahkan apa-apa 'a',, atau 'b', dan kemudian menyebut dirinya sendiri dengan 10 karakter pertama yang dipotong. Sirkuit pendek iterasi terakhir di s and(string kosong falsy), menghindari rekursi tak terbatas.

Hasil dari semua panggilan terpisah kemudian digabungkan, dan dikembalikan ke konteks yang disebut fungsi.

120 byte

Tentu saja, itu terasa seperti kecurangan, jadi inilah yang benar-benar acak:

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:])

Cobalah online!

FlipTack
sumber
Di mana OP menyebutkan bahwa indeks karakter yang diganti bisa 0?
Yytsi
@ TuukkaX komentar telah dihapus untuk menghindari kekacauan, tapi itulah jawaban jelly , dan OP mengatakan itu baik-baik saja.
FlipTack
1

Jelly , 15 14  13 byte 13 karakter

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

TryItOnline!

Mengganti atau menghapus yang pertama dari setiap sepuluh karakter termasuk yang dari 1-9 terakhir jika ada potongan seperti itu. Memilih dari itu, diakui kecil, subset dari karakter: 1; 2.

Bagaimana?

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

Untuk memilih dari semua ASCII yang dapat dicetak, bukan hanya 1dan 2(masih mengganti atau menghapus karakter pertama dari setiap chunk) dalam 21 byte:

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

Untuk versi yang sepenuhnya acak (50/50 menghapus / mengganti, ASCII acak yang dapat dicetak seragam, dan lokasi karakter acak yang seragam dalam setiap potongan) Saya memiliki 30 byte (mungkin tidak optimal):

95R+31ỌX;

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

Ini memutar setiap potongan yang ditinggalkan dengan jumlah acak, memunculkan karakter terakhir dan kemudian memanggil salah satu dari dua tautan pertama, salah satunya kosong dan yang lainnya digabungkan dengan karakter ASCII yang dapat dicetak secara acak; kemudian memutar potongan itu lagi.

Jonathan Allan
sumber
Ini benar-benar bertentangan dengan semangat posting
Maltysen
@Maltysen - OP mengatakan semua ini baik-baik saja.
Jonathan Allan
Dimana? Saya tidak melihat apa pun di komentar atau OP.
Maltysen
@Maltysen mereka sudah dibersihkan.
Jonathan Allan
1
Ada komentar yang secara eksplisit mengatakan bahwa kita dapat memilih dari 2 karakter DAN bahwa mereka tidak ingin memasukkannya ke dalam badan Pertanyaan.
Jonathan Allan
1

Python3, 188 186 184 114 karakter

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:])

Sepertinya terlalu lama. Mungkin bisa dipersingkat banyak dengan lambda.

Rupanya OP telah memungkinkan memilih karakter acak dari daftar dua karakter dan indeks karakter yang akan diganti bisa berupa konstanta. Setelah modifikasi, jawaban saya akan terlihat persis sama dengan pengajuan @FlipTacks Python, jadi ini adalah bentuk yang saya gunakan .

@FlipTack menyelamatkan 5 byte!

Yytsi
sumber
0

Clojure, 135 139 byte

Sunting: Lupa menggunakan partition-allbukan 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)))))

Tidak Disatukan:

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

Man nama-nama fungsi itu panjang ... Pokoknya, itu membagi input menjadi partisi 10 karakter, membaginya secara acak menjadi dua bagian, secara acak menyuntikkan string kosong atau karakter acak di antara mereka dan membuang karakter pertama dari babak ke-2.

NikoNyrh
sumber
0

Mathematica 133 Bytes (129 karakter)

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

76 karakter untuk menulis nama 8 fungsi: /

Menggunakan ⌊..⌋bukannya Floor[]menyimpan 5 karakter, 1 byte.

Kelly Lowder
sumber
0

Python 3, 129 byte

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

Untuk menghemat beberapa byte, alih-alih mengimpor modul acak Python, saya hanya melakukan beberapa operasi modulo pada id string, yang harus berbeda setiap waktu. Sebagai contoh, program akan memutuskan apakah akan menghapus char atau tidak atau mengganti yang didasarkan pada apakah id(string)//10genap atau tidak (saya bilangan integer dengan 10 karena angka terakhir akan selalu genap).

Cormac
sumber