Setelah desas-desus bahwa Codegolf akan mengadakan turnamen Rock-Paper-Gunting Anda melihat ke dalam topik kata-kata bebas persegi . Sebuah kata yang terbuat dari huruf R
, P
, S
adalah persegi bebas jika tidak mengandung urutan yang mengulangi dua kali. Artinya, kata itu tidak bisa ditulis sebagai
a x x b
di mana a
dan b
adalah kata-kata dari setiap panjang dan x
adalah kata panjang setidaknya satu, semua terbuat dari huruf R
, P
, S
.
Tugas
Menulis sebuah program yang menghasilkan persegi bebas kata-kata dari huruf-huruf R
, P
, S
panjang n
di mana jumlah 1 <= n <= 10
diambil sebagai masukan.
Contoh
Misalnya kata - kata bebas persegi panjang 3 adalah
RPR
, RSR
, RPS
, RSP
, SPS
, SRS
, SRP
, SPR
, PRP
, PSP
, PSR
,PRS
dan yang panjangnya 4 adalah
RPRS
, RPSR
, RPSP
, RSRP
, RSPR
, RSPS
, PRPS
, PRSR
, PRSP
, PSRP
, PSRS
, PSPR
, SRPR
, SRPS
, SRSP
, SPRP
, SPRS
,SPSR
dan perhatikan bahwa misalnya SPSP
atau PRPR
tidak bebas persegi
Aturan
- Ini codegolf, kemenangan program terpendek, celah standar ditutup.
- Anda dapat mencetak kata-kata atau membuatnya dalam memori.
- Program Anda dapat ditulis sebagai fungsi.
Referensi
Entri Wikipedia pada kata-kata bebas persegi
Jumlah kata terner bebas persegi dengan panjang tertentu ada di https://oeis.org/A006156
Terkait: Kata-kata Ternary Squarefree Sewenang-Wenang-Panjang
n>3
akan menjadi ide yang baik, karena telah ada beberapa kebingungan tentang karakter yang berulang vs urutan yang berulang.Jawaban:
Ruby, 39 byte
Fungsi lucu yang tidak efisien ini menghasilkan semua string dengan panjang N yang terletak secara alfabetis antara N Ps dan N Ss, kemudian menyaring sebagian besar yang berisi karakter non-RPS. Cek squarefree yang sebenarnya hanya menggunakan backreference Regexp:
(.+)\1
.Lebih banyak 65 byte idiomatis yang selesai dalam jumlah waktu yang wajar untuk N = 10:
Sunting: Menyimpan satu byte berkat G B.
sumber
Jelly ,
1514 byteCobalah online!
Bagaimana itu bekerja
sumber
Retina , 28 byte
Cobalah online!
Mengambil input di unary .
Penjelasan
Ini menghasilkan semua string yang terdiri
RPS
dari panjangn
. Cara kami melakukan ini adalah bahwa kami berulang kali mengganti yang pertama1
di setiap baris. Mari kita berpikir tentang garis sebagai<1>
, di mana<
segala sesuatu di depan pertandingan dan>
segalanya setelah pertandingan (mereka$`
dan$'
masing - masing dalam sintaks substitusi regex, tetapi yang terlihat kurang intuitif). Kami mengganti1
denganR>¶<P>¶<S
, di mana¶
umpan baris. Jadi hasil substitusi penuh ini sebenarnya<R>¶<P>¶<S>
, yang merupakan tiga salinan garis, dengan1
mengganti denganR
,P
,S
, masing-masing, di masing-masing tiga eksemplar. Proses ini berhenti setelah semua1
diganti.Akhirnya, kami hanya membuang semua baris yang berisi pengulangan.
sumber
1(.*)
dengan$1R¶$1P¶$1S
tetapi byte-countnya sama.Sekam ,
1514 byte-1 byte terima kasih kepada Zgarb!
Cobalah online!
Buat semua urutan yang mungkin dari panjang yang benar dan simpan hanya yang memiliki semua substring (kecuali yang kosong) yang disusun oleh dua bagian yang berbeda.
Sial, aku benar-benar ingin mengalahkan Jelly di sini.
sumber
Mathematica, 61 byte
Cobalah online!
sumber
Java 8,
285277 byteMeskipun Java hampir selalu bertele-tele, dalam hal ini jelas bukan bahasa yang tepat untuk tantangan seperti ini. Menghasilkan permutasi dengan substring buruk untuk kinerja dan tidak efisien.
Pasti bisa bermain golf lagi.
-8 byte berkat @Jakob .
Penjelasan:
Coba di sini. (Kinerja terlalu buruk untuk kasus uji di atas 3, tetapi itu berfungsi secara lokal ..)
sumber
n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
. Juga, mengapa tidak refactorfor(;i<1;p(...));
kewhile(i<l)p(...);
?for(;...;)
codegolf-habbit untuk jujur. Kasing terburuk adalah byte-count yang sama denganwhile(...)
, kasing terbaik dapat ditempatkan di dalam for-loop untuk menghemat byte. Jadi saya mencoba untuk tidak menggunakanwhile
sama sekali dalam codegolfing, karena tidak pernah menguntungkan byte-count. Entah itu meningkatkannya, atau tetap sama, jadi saya pribadi tidak peduli dengan keterbacaan yang lebih baik. ;)PRS
urutan, sedangkan loop asli Anda menghasilkan satu dengan 2 ^ ( n -2) urutan.n
kali "PRS" benar. Milik saya menghasilkan lebih banyak karena menghemat byte (dan menurunkan kinerja, tetapi siapa yang peduli dengan codegolf). ;)Python 3 ,
9796 byteMengembalikan serangkaian string.
Cobalah online!
sumber
Julia 0,6 , 65 byte
Cobalah online!
sumber
Perl 5 , 37 byte
Cobalah online!
Function mengembalikan array dari string bebas persegi.
Dijelaskan:
The
glob
menghasilkan semua kombinasi dari R, S, & P dengan panjang sama untuk input. Thegrep
pernyataan filter keluar orang-orang yang tidak persegi gratis.sumber
R , 97 byte
Cobalah online!
combn(rep(c('p','r','s'),n),n,paste,collapse='')
menghitung semuan
string sepanjang karakter denganp
,r
,s
, tapi sayangnya duplikat banyak (*), jadi kami uniquify itu, dan mengambil orang-orang yang sesuai regex(.+)\1
, menggunakan pencocokan perl-gaya, maka kita mencetak daftar yang dihasilkan.(*) Secara teknis, ini menghasilkan semua kombinasi
3n
huruf secarap,r,s
berulang 3 kali diambiln
pada satu waktu, kemudian berlakupaste(..., collapse='')
untuk setiap kombinasi daripada menghitung3^n
string secara langsung, tetapi ini lebih golf daripadaexpand.grid
(produk Cartesian yang sebenarnya).sumber
JavaScript (Firefox 30-57), 69 byte
Karena semua substring dari kata-kata bebas persegi juga bebas persegi, pemeriksaan dapat dilakukan secara rekursif.
sumber
Haskell ,
10198 byteCobalah online!
sumber
JavaScript (ES6), 93 byte
Mengonversi semua bilangan bulat dari 0 ke 3ⁿ menjadi (dibalik berlapis) basis 3 menggunakan
RPS
sebagai digit dan memfilternya untuk kata-kata bebas persegi.sumber
Julia, 88
Tidak ada yang mewah.
sumber
C # / LINQ, 169
Harus ada cara yang lebih baik untuk melakukan ini :)
sumber
F #, 143
sumber
k, 56 byte
Kurangnya regex asli menempatkan k jauh di belakang kurva untuk sekali. Saya pergi dengan solusi rekursif, karena karakter untuk mengimplementasikannya disimpan oleh cek squarefree sederhana.
adalah operator ternary k, di sini kami melakukan hal-hal menarik tanpa panjang nol, dan mengembalikan string kosong tunggal jika diminta kata-kata panjang nol.
mengambil produk cartesian "RPS" dan semua kata bebas persegi n-1. , /: \: bergabung dengan setiap elemen dari kanan ke kiri, memberikan panjang array 3 panjang n array. , / ratakan ini menjadi array 3n panjang.
mengambil n huruf pertama dari setiap string dan membandingkannya dengan n kedua, kemudian mengurangi array hanya di mana mereka tidak cocok. Karena kita tahu hasil sebelumnya bebas persegi, hanya substring yang dimulai dari karakter pertama yang perlu dicocokkan - menyederhanakan pemeriksaan di sini sepadan dengan karakter yang dihabiskan untuk mengimplementasikan rekursi. Akhirnya,
menerapkan lambda ke hasil awal yang ditetapkan di sebelah kirinya, iterasi setiap panjang substring dari 1 ke (panjang kata) -1. ! x membuat daftar dari 0 hingga x-1, lalu 1_ menghapus elemen pertama (karena substring panjang 0 akan selalu cocok)
Mengorbankan beberapa karakter dapat kita gunakan .zs untuk referensi-sendiri daripada bergantung pada nama fungsi, dan alih-alih memeriksa substring hingga panjang n-1 hanya lantai periksa (n / 2) untuk kinerja. Ia menemukan semua panjang 49 kata (yang ada 5207706) dalam sekitar 120 detik pada 7700k, di atas itu saya mengalami batas 4GB gratis 32-bit k.
sumber
Python 2 , 99 byte
Cobalah online!
sumber