Ini jauh lebih maju daripada Cara mengacak huruf dalam sebuah kata dan Cambridge Transposition karena aturan tentang huruf mana yang dapat ditukar dengan yang mana. Regex sederhana tidak akan cukup di sini.
Sudah diketahui bahwa teks masih dapat dibaca sementara bagian dalam kata-katanya telah diacak, selama huruf pertama dan terakhir ditambah keseluruhan garis besarnya tetap konstan. Diberikan teks Ascii + Newline yang dapat dicetak, aduk setiap kata sesuai aturan berikut:
Perebutan harus (pseudo) acak.
Kata adalah urutan karakter Latin, A hingga Z.
Hanya huruf awal yang akan menjadi huruf besar.
Huruf pertama dan terakhir harus tetap tidak tersentuh.
Saat berebut, hanya surat dalam salah satu grup berikut yang dapat bertukar tempat:
acemnorsuvwxz
bdfhkl
gpqy
it
j
(tetap di tempat)
Contoh
Srcmable wrods sambil psrrnveieg oeiltnus mereka
Sudah diketahui bahwa sebuah txet masih dapat dibaca sementara inrand dari wrodnya telah diacak, selama huruf terakhir dan huruf terakhir mereka ditambah huruf mereka sendiri dan raemin tidak dapat menulis. Diberi hak paten Acsii + Nwnliee txet, samrclbe ecah word anoccdirg untuk relus ini:
Smncrbliag harus (pusedo) rondam.
Wrod adalah seqencue dari chreratacs Latin, A thurogh Z.
Hanya lrtte awal yang akan lebih dulu.
Hak fiskal dan lsat harus tetap uctoenhud.
Saat sarnclbimg, hanya huruf dengan salah satu pengatur fwllnoiog yang dapat menggabungkan plaecs:
aneusvrowxmcz
bhkfdl
gqpy
it
j
(tetap di plcae)Emxaple
t
seharusnya lebih pendek daripadah
meskipun banyak orang tidak menulisnya.t
dari grup 2? Atau mungkin menempatkant
dalam grup 4 dengani
?printable
Sayapatnirlbe
tidak bisa dibaca. Saya pikiri
/t
swap yang harus disalahkan. Hmm ...paintrlbe
Tidak juga tidak membantu. Mungkin itu adalahpr
/pa
swap. Garis besarnya dipertahankan, tetapi saya pikir saya membaca "pr" dan "pa" secara semantik (?) 1 huruf.prtnialbe
Ah iya. Itu berhasil. Tidak yakin saya bisa menawarkan perbaikan pada algoritme.Jawaban:
Jelly ,
8074 byte-2 byte dengan pindah dari
czar + vex + mow + sun
keczar + vexes + unmown
(berulange
dann
s bukan masalah)-1 byte menggunakan
Tị
daripadaȦÐf
-1 byte menggunakan
Œle€Øa
daripadai@€ØB>⁵
-2 byte dengan mengkonfigurasi ulang tata letak sedikit
Program lengkap yang mengambil daftar karakter (atau string berformat Python), yang mencetak hasil pengacakan.
Cobalah online!
Sejumlah besar kesulitan untuk Jelly di sini tampaknya (baik itu atau saya telah melewatkan trik, yang telah diketahui terjadi!) Ini pasti akan dikalahkan oleh bahasa dengan manipulasi string yang lebih baik seperti
Retina(tanpa fungsi acak) atau 05ab1e .Bagaimana?
sumber
czar + vex + mow + sun
‽acemnorsuvwxz
. Saya akan menulis kode komentar di beberapa titik juga.PHP, 278 Bytes
Cobalah online!
Diperluas
fungsi
array_combine
array_filter
array_keys
ksort
preg_replace_callback
mengocok
sumber
Pyth , 79 byte
dimana
❤
U + 0018Cobalah online!
Sampel
Sudah diketahui bahwa sebuah teks masih dapat ditingkatkan sementara iringan dari wrodnya telah seraclbmd, selama lettres pertama dan terakhir mereka ditambah ontliues mereka sendiri ontliues rmeain conntsat. Diberikan teks, sacmrble setiap wrod acrncdiog untuk thsee relus:
Scamrlbing harus (puesdo) rnadom.
Sebuah kata adalah suqencee dari chraectars Latin, A thuorgh Z.
Hanya saja iaitinl lettres yang akan menjadi uppaersce.
Lettres pertama dan terakhir msut tetap diunduh.
Saat srancblimg, hanya lettres wiihtn salah satu dari pengikutnya follnwiog yang dapat mengikutsertakan plecas:
amsuvrcnoxewz
bhfkdl
gpqy
it
j
(tetap di tempat)sumber
\pL
bukan[A-Za-z]
?\pL
?\w
akan cukup?JavaScript 176 byte
Metode:
RegExp mengulangi bagian tengah setiap kata (
/\B(\w+)\B/g
) menggunakan ganti 1st fn.Pengganti pertama fn mengulangi array RegExp untuk setiap grup surat (
/[bdfkhl/g, /[gqpy]/g, etc..
).Setiap iterasi membangun array temp dari karakter pusat kata yang muncul di grup surat saat ini.
Setiap iterasi kemudian menggunakan RegExp grup surat saat ini untuk beralih di seluruh pusat kata, menggunakan fn ganti kedua.
Pengganti kedua fn menyambung secara acak array temp, menghapus karakter acak dan mengembalikannya.
Demo:
Jalankan di JSFiddle: https://jsfiddle.net/CookieJon/bnpznb7r/
sumber
\pL(\pL+)\pL
daripada\B(\w+)\B
mengecualikan angka dan garis bawah.b=>[...].map(...)&&b
menyimpan byte lain. Saya juga tidak yakin Andai
perlu.t.replace(/[A-Za-z]([a-z]+)(?=[a-z])/g,(w,b)=>...w[0]+b...)
atau semacamnya.C,
453, 356369 byteungolf dengan komentar
sumber
Python 3.6,
349340 byteDiindentasi dengan tab. Fungsi ini dinamai
A
. Itu tidak menggunakan kekuatan kasar, runtime bersifat deterministik, seperti yang diminta OP.sumber
Mathematica 232 Bytes
Ide dasarnya adalah untuk mengubah urutan himpunan bagian yang sesuai dengan 4 grup karakter yang berbeda. Mungkin ruang untuk perbaikan.
sumber
C,
306282 BytesCobalah online
Tidak Disatukan:
sumber
JavaScript (ES6),
380327311294 Bytes(
298282265 Bytes tidak termasuk aturan)Terima kasih kepada @Shaggy untuk tips yang bermanfaat!
Fungsi f mengambil string apa pun (kata tunggal, banyak kata, banyak kata dengan tanda di dalamnya - yang diartikan sebagai pemecah kata) dan
larikstring "aturan" dengan panjang apa pun yang dipisahkan oleh koma.Array aturan itu, dalam kasus pertanyaan Anda, adalah
["aneusvrowxmcz", "bhkfdl", "gqpy", "it"]
"aneusvrowxmcz,bhkfdl,gqpy,it"
Beberapa huruf tidak tercampur meskipun mereka bisa, karena Anda menyatakan dalam pertanyaan Anda bahwa huruf "mungkin bertukar ruang". Jika saya salah mengartikannya, saya dapat mengubah kode untuk selalu berebut huruf yang sesuai dengan aturan.
Saya tahu ini adalah jumlah byte yang sangat besar dan tidak akan dapat bersaing dengan bahasa golf, tetapi saya tetap ingin mencobanya, semoga Anda menyukainya :)
Kode tidak terbaca yang dapat dibaca manusia:
sumber
var
s danlet
s. 02) Kecuali itu adalah fungsi rekursif, tidak perlu menyertakan deklarasi variabel (f=
) dalam jumlah byte Anda. 03) Gunakan currying ketika suatu fungsi memiliki 2 parameter (b=>d=>
bukan(b,d)=>
) dan panggil fungsi Anda denganf(b)(d)
. 04) Anda memilikii
bendera sehingga tidak perlu disertakanA-Z
dalam regex Anda. 05) Anda bisa menggunakanindexOf
atau menggunakansearch
string, tanpa membaginya menjadi sebuah array.Clojure,
326322324 bytePembaruan 1: diganti
(map(fn[[k v]]...)...)
dengan(for[[k v]...]...)
Pembaruan 2: memperbaiki regex, menggunakan
\pL
alih-alih\w
dll.Saya tak sabar untuk melihat sesuatu yang lebih pendek. Versi ungolfed sebelumnya dengan beberapa contoh berjalan:
sumber
\pL+
dan\PL+
bukan\w+
dan\W+
untuk mengecualikan angka dan garis bawah.Perl 6 ,
241195 byteTermasuk +1 byte untuk
-p
sakelar baris perintah.Tidak Disatukan:
sumber
(\pL)(\pL+)(\pL)
daripada(\w)(\w+)(\w)
mengecualikan angka dan garis bawah.\pL
termasuk banyak karakter di luar rentang yang diizinkan huruf latin AZ. Saya telah memperbarui kode saya untuk mencerminkan persyaratan dengan lebih akurat.\pL
dieja<:L>
dalam Perl 6 sekalipun.C #,
438394380374 byteHemat 10 byte berkat @ MartinEnder ♦.
Yang menjengkelkan,
CaptureCollection
tidak diterapkanIEnumerable<T>
dan itu sebabnya.Cast<Capture>()
diperlukan. Semoga, saya bisa menggabungkan permintaan Linq danforeach
loop.Saya yakin ada banyak yang bisa bermain golf tetapi butuh waktu cukup lama hanya untuk membuatnya bekerja ...
Cobalah online!
Versi yang diformat / Lengkap:
sumber