Jika Anda mengurutkan string, Anda biasanya akan mendapatkan sesuatu seperti:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Ya, itu adalah kalimat pertama yang disortir.
Seperti yang Anda lihat, ada banyak karakter berulang, aa
, eee
, ttttt
, 9 ruang dan sebagainya.
Jika kita menambah 128
nilai ASCII dari duplikat pertama, 256
ke yang kedua, 384
ke yang ketiga dan seterusnya, urutkan lagi dan hasilkan string baru (modulus 128 untuk mendapatkan karakter yang sama kembali) kita mendapatkan string:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Perhatikan satu spasi utama dan 4 spasi tambahan).
String "berurutan diurutkan" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
, <space>
, <space>
.
Mungkin lebih mudah untuk memvisualisasikan ini jika kita menggunakan string dengan angka di dalamnya. String 111222334
akan ketika "diurutkan" menjadi: 123412312
.
Tantangan:
Tidak mengherankan, tantangannya adalah menulis kode yang mengurutkan string sesuai dengan deskripsi di atas.
Anda dapat mengasumsikan bahwa string input hanya akan berisi karakter ASCII yang dapat dicetak dalam kisaran 32-126 (ruang untuk tilde).
Kasus uji:
**Test cases:**
*:Tacest*es*s*
If you sort a string you'll typically get something like:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
Hello, World!
!,HWdelorlol
#MATLAB, 114 bytes
#,14ABLMTbesty 1A
f=@(s)[mod(sort(cell2mat(cellfun(@(c)c+128*(0:nnz(c)-1),mat2cell(sort(s),1,histc(s,unique(s))),'un',0))),128),''];
'()*+,-0128:;=@[]acdefhilmnoqrstuz'(),0128@acefilmnorstu'(),12celmnostu'(),12celnstu(),clnst(),cls(),cs(),()()()()
Ini adalah kode-golf , jadi kode terpendek di setiap bahasa yang dihitung dalam byte akan memenangkan ref .
{'S', 'g', 'i', 'n', 'r', 't'}
dalam Python, karena cara "normal" untuk melakukannya adalah"String"
.{'a','b'}
tidak diterima di Matlab karena Anda dapat menambahkan karakter untuk masing-masing karakter seperti ini:{'aa','b'}
. Input dan output Anda harus dalam format yang sama.Jawaban:
Pyth, 5 byte
Suite uji
Sangat mudah: Kelompokkan dan urutkan, transpos, digabungkan.
sumber
Jelly , 3 byte
Cobalah online!
Bagaimana itu bekerja
Oh nak, tantangan ini dibuat untuk Jelly.
The kelompok atom (
Ġ
) mengambil array 1 sebagai indeks masukan dan kelompok yang sesuai dengan unsur-unsur yang identik dari array. Array grup indeks diurutkan dengan elemen yang sesuai sebagai kunci, yang merupakan urutan yang kami butuhkan untuk tantangan ini.Selanjutnya, atom zip (
Z
) mentransposisi baris dan kolom dari matriks indeks yang dihasilkan (kasar). Ini hanya terdiri dari membaca kolom dari matriks, melewatkan elemen yang tidak ada dalam kolom itu. Sebagai hasilnya, kita mendapatkan indeks karakter pertama dengan titik kode terendah, diikuti oleh indeks pertama karakter dengan titik kode terendah kedua, ... diikuti oleh indeks karakter kedua dengan titik kode terendah, dll.Akhirnya, atom unindex (
ị
) mengambil elemen array input di semua indeksnya dalam urutan yang dihasilkan. Hasilnya adalah array karakter 2D, yang Jelly rata sebelum mencetaknya.1 Jelly tidak memiliki tipe string , hanya array karakter.
sumber
Python 3,
10910510410399939088817969 byte2 byte disimpan berkat FlipTack
7 byte disimpan karena flornquake menangkap kesalahan bodoh saya
2 byte disimpan berkat xnor
10 byte disimpan berkat Dennis
Penjelasan
Kami mulai dengan mengubah string kami ke daftar menggunakan percikan dan menyimpan daftar itu dalam sebuah variabel
a
. Kemudian, sementara kamia
bukan daftar kosong, kami memeriksa setiap anggota unika
dalam urutan, cetak dan hapus salinan karakter itu dari daftar.Setiap iterasi mencetak dengan demikian mencetak satu salinan dari setiap karakter yang ada di
a
.sumber
set
adalah set yang tidak disortir.f
string alih-alih daftar untuk menyimpan beberapa byte.a=list(input())
, Anda bisa melakukannyaa.remove(c)
, yang merupakan penghematan bersih.Haskell, 44 byte
Contoh penggunaan:
Urutkan, kelompok karakter yang sama dengan daftar string (misalnya
"aabbc"
->["aa","bb","c"]
), transpos dan ratakan menjadi satu string, lagi.sumber
Python 2 , 75 byte
Cobalah online!
sumber
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
berfungsi untuk string dengan panjang maksimal9e9
.[]
dan mengubah18
ke17
untuk menyimpan dua byte.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, tetapi saya tidak berpikir menambahkan1e9
akan pernah terjadi pada saya ... Terima kasih!Dyalog APL , 21 karakter = 39 byte
t[
...]
indeks t (akan didefinisikan segera) dengan ...0~⍨
nol dihapus dari∊
yang terdaftar (diratakan)⍉
ditransposisikan(⊢⌸t)[
...;]
dikunci * t , diindeks baris oleh ...⍋
indeks yang akan diurutkan∪
surat unik darit←
t , yang memiliki nilai⍞
input teks yang dimintaTryAPL online!
*
⊢⌸t
membuat tabel di mana baris (diisi dengan nol untuk tabel persegi panjang) daftar masing-masing indeks huruf unik di t .sumber
⌸
menyebabkan semuanya menjadi UTF-8, bukan satu byte per karakter.C,
10910610510410210097989691 BytesCadangkan hingga 98 Bytes, diperlukan untuk menginisialisasi j agar f (n) dapat digunakan kembaliTurun ke 96 Bytes menggunakan menempatkan strlen B-)Sungguh aneh saya harus kembali ke strlen tapi saya menyingkirkan for (; i ++;) loop jadi sekarang turun ke 91 Bytes. Tampaknya halaman manual untuk menempatkan dibaca;
... Saya beruntung itu bekerja di tempat pertama
kode uji ...
Berikut adalah beberapa kasus uji, sekarang saatnya untuk memainkan golf ini
sumber
Mathematica,
686059 byteMenerima String. Menghasilkan String.
Jika daftar karakter diizinkan (46 byte):
Versi menggunakan
Sort
(40 byte):Versi ini tidak dapat menjadi jawaban saya karena
Sort
tidak dapat digunakan di sini;Sort
mengurutkan berdasarkan urutan kanonik, bukan dengan kode karakter.sumber
Characters
perintah secara teknis menampilkan daftar string panjang-1.Python 2,
7776 byteMengambil string yang dikutip sebagai input dari stdin.
Cobalah online!
sumber
JavaScript (ES6), 79 byte
Bekerja dengan mengekstraksi himpunan karakter unik, mengurutkannya, menghapusnya dari string asli, dan secara rekursif menghitung jenis sisa string. Solusi 81 byte yang menurut saya menarik:
sumber
J ,
1615 byteIni adalah kata kerja yang mengambil dan mengembalikan satu string. Cobalah online!
Miles menyimpan satu byte, terima kasih!
Penjelasan
Tidak ada yang terlalu mewah di sini: urutkan berdasarkan urutan kejadian, kedua berdasarkan nilai char.
sumber
Mathematica, 55 byte, tidak bersaing
Edit: Sayangnya, Mathematica ini
sort
adalah tidak dengan kode karakter, tetapi dengan urutan abjad, di mana huruf besar immediatly berikut huruf kecil (yaituHi There
diurutkan ke{ , e, e, h, H, i, r, T}
).Ini bekerja menggunakan pola:
sumber
Rule (->)
harusRuleDelayed (:>)
(tidak ada perubahan dalam jumlah byte) karena kedua sisiRule
memiliki variabel.Rule
dapat menyebabkan konflik dengan definisi yang sudah ada sebelumnya. Misalnya:a=3;5/.{a_->a}
mengembalikan3
, bukan5
. (a_->a
mengevaluasi kea_->3
- jika Anda menggunakannyaa_:>a
, tetap seperti itu dana=3;5/.{a_:>a}
kembali5
).Brainf * ck ,
458226 byteCobalah online! - BF
Numberwang ,
262226 byteCobalah online! - NW
Saya meletakkan keduanya di sini karena mereka adalah kode yang identik.
sumber
PHP, 83 byte
Sayangnya Anda tidak dapat memiliki
unset
di ternary jadi saya harus menggunakan lama yang menggangguarray_filter
.Gunakan seperti:
sumber
Python 2, 70 byte
Cobalah online
Ini sangat tidak efisien. Tautan uji mengubah
i>>7
kei>>5
dan menetapkan batas rekursi menjadi 10.000. Mengasumsikan input hanya memiliki nilai ASCII hingga 126.Menggunakan trik div-mod untuk beralih melalui dua loop: jumlah minimum
i/128
di loop luar dan nilai-nilai ASCIIi%128
di loop dalam. Termasuk karakterc
dengan nilai ASCII yang diberikan jika jumlah kemunculannya dalam string paling tidak jumlah minimumnya.Kode menggunakan trik untuk mensimulasikan tugas
c=chr(i%128)
sehingga dapat direferensikan dalam ekspresi(s.count(c)>i>>7)*c
. Pythonlambda
s tidak mengizinkan tugas karena mereka hanya mengambil ekspresi. Konversi kedef
atau program penuh masih merupakan kerugian bersih di sini.Sebagai gantinya, fungsi mendorong nilai
chr(i%128)
ke panggilan rekursif berikutnya sebagai input opsional. Ini tidak aktif karenai
telah bertambah, tetapi tidak masalah asalkan string tidak mengandung karakter khusus'\x7f'
(kita juga bisa menaikkan 128 hingga 256). Awalc=''
tidak berbahaya.sumber
V ,
3736 byteTerima kasih @DJMcMayhem untuk byte!
Cobalah online!
Tidak yakin saya suka regex pada akhirnya, tetapi saya perlu membuat
ò
istirahat entah bagaimana.Menjelaskan
sumber
Íî
(atau:%s/\n//g
) lebih pendek dariVGgJ
Perl 6 , 68 byte
Saya sedikit terkejut menemukan bahwa tidak ada cara bawaan untuk mengelompokkan elemen seperti dalam daftar. Itulah yang dilakukan oleh bit squish-map.
sumber
a
menjadi@a
(+2 byte). Juga,grep *eq$_,
dapat ditulisgrep $_,
(-3 byte) karena string adalah pencocokan-pintar yang valid.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
- Variasi ini hanya 54 byte.classify
solusi berbasis sebagai jawaban yang terpisah sekarang.JavaScript (ES6),
7775 byteStabil mengurutkan string diurutkan secara leksikografis berdasarkan kemunculan ke- n
sumber
1+~~
sama dengan-~
.Perl 6 , 54 byte
Penjelasan:
{ }
: A lambda yang mengambil satu argumen - mis21211
..comb
: Pisahkan argumen input menjadi daftar karakter - mis(2,1,2,1,1)
..classify(~*)
: Kelompokkan karakter menggunakan perbandingan string sebagai kondisi pengelompokan, kembalikan Hash yang tidak terurut - misalnya{ 2=>[2,2], 1=>[1,1,1] }
.{*}
: Kembalikan daftar semua nilai Hash - misalnya[2,2], [1,1,1]
..sort
: Sortir - mis[1,1,1], [2,2]
.»[*]
: Keluarkan wadah item yang dibungkus oleh array karena berada di hash, sehingga tidak akan dianggap sebagai satu item dalam langkah berikut - mis(1,1,1), (2,2)
.roundrobin |
: Zip sub-daftar sampai semua habis - mis(1,2), (1,2), (1)
.flat
: Ratakan hasilnya - mis1, 2, 1, 2, 1
.[~]
: Menggabungkannya untuk mendapatkan string lagi - mis12121
.(Penghargaan atas
roundrobin
pendekatan ini diberikan untuk jawaban Sean .)sumber
05AB1E , 15 byte
Cobalah online! atau sebagai Test suite
Penjelasan
10 dari 15 byte adalah untuk menyiasati cara 05AB1E dalam menangani string zip dengan panjang yang berbeda.
sumber
FSharp,
194190170140133 byteMenggunakan Seq alih-alih Array menghemat beberapa byte
Menentukan nama yang lebih pendek, dan menggunakan peta lain untuk menghindari a
(fun ->)
blokTernyata F # dapat memetakan char ke dalam, jadi menghapus nama singkat System.Text.Encoding.ASCII, dan menambahkan di peta lain menghemat 20 byte!
Mengembalikan array char bukan string, menyelamatkan saya 30 byte!
Saya tidak perlu lagi memastikan itu adalah string, menghemat 7 byte
sumber
JavaScript (ES6), 114 byte
Dipisahkan dengan baris baru untuk kejelasan, bukan bagian dari jumlah byte:
Demo
sumber
Clojure, 79 byte
Fungsi anonim, mengembalikan urutan karakter. Mendukung pengulangan hingga 10 ^ 9 karakter apa pun, yang seharusnya banyak.
sumber
Retina , 24 byte
Cobalah online!
sumber
Ruby, 59 + 1 = 60 byte
Menambahkan satu byte untuk
-n
bendera. Port of @PatrickRoberts solusi kamus.sumber