Tidakkah Anda menyukai diagram tampilan meledak di mana mesin atau objek dipisahkan menjadi bagian terkecil?
Mari kita lakukan itu untuk sebuah string!
Tantangan
Tulis program atau fungsi itu
- memasukkan string yang hanya berisi karakter ASCII yang dapat dicetak ;
- membedah string menjadi kelompok karakter yang sama tanpa spasi ("bagian" dari string);
- mengeluarkan grup-grup tersebut dalam format yang mudah, dengan beberapa pemisah antar grup .
Misalnya diberi string
Ah, abracadabra!
output akan menjadi kelompok-kelompok berikut:
! , SEBUAH aaaaa bb c d h rr
Setiap grup dalam output berisi karakter yang sama, dengan spasi dihapus. Baris baru telah digunakan sebagai pemisah antar kelompok. Lebih lanjut tentang format yang diizinkan di bawah.
Aturan
The masukan harus string atau array karakter. Ini hanya akan berisi karakter ASCII yang dapat dicetak (rentang inklusif dari ruang hingga tilde). Jika bahasa Anda tidak mendukung hal itu, Anda dapat mengambil input dalam bentuk angka yang mewakili kode ASCII.
Anda dapat mengasumsikan bahwa input berisi setidaknya satu karakter non-spasi .
The Output harus terdiri dari karakter (bahkan jika input adalah dengan cara kode ASCII). Harus ada pemisah yang jelas antara kelompok-kelompok , berbeda dari karakter non-spasi yang mungkin muncul dalam input.
Jika output melalui fungsi kembali, itu juga bisa berupa array atau string, atau array array chars, atau struktur serupa. Dalam hal ini struktur menyediakan pemisahan yang diperlukan.
Pemisah antara karakter masing-masing grup adalah opsional . Jika ada, aturan yang sama berlaku: tidak boleh berupa karakter non-spasi yang mungkin muncul dalam input. Juga, itu tidak bisa menjadi pemisah yang sama seperti yang digunakan antar kelompok.
Selain itu, formatnya fleksibel. Berikut ini beberapa contohnya:
Grup mungkin dipisahkan oleh string baris baru, seperti yang ditunjukkan di atas.
Grup dapat dipisahkan oleh karakter non-ASCII, seperti
¬
. Output untuk input di atas adalah string:!¬,¬A¬aaaaa¬bb¬c¬d¬h¬rr
Grup dapat dipisahkan oleh n > 1 spasi (bahkan jika n adalah variabel), dengan karakter di antara masing-masing grup dipisahkan oleh satu ruang:
! , A a a a a a b b c d h r r
Outputnya juga bisa berupa array atau daftar string yang dikembalikan oleh suatu fungsi:
['!', 'A', 'aaaaa', 'bb', 'c', 'd', 'h', 'rr']
Atau larik array arang:
[['!'], ['A'], ['a', 'a', 'a', 'a', 'a'], ['b', 'b'], ['c'], ['d'], ['h'], ['r', 'r']]
Contoh format yang tidak diizinkan, sesuai aturan:
- Koma tidak dapat digunakan sebagai pemisah (
!,,,A,a,a,a,a,a,b,b,c,d,h,r,r
), karena input mungkin mengandung koma. - Tidak diterima untuk menjatuhkan pemisah antar grup (
!,Aaaaaabbcdhrr
) atau menggunakan pemisah yang sama antara grup dan di dalam grup (! , A a a a a a b b c d h r r
).
Grup dapat muncul dalam urutan apa pun dalam output. Sebagai contoh: urutan abjad (seperti dalam contoh di atas), urutan penampilan pertama dalam string, ... Urutan tidak perlu konsisten atau bahkan deterministik.
Perhatikan bahwa input tidak dapat berisi karakter baris baru, dan A
dan a
merupakan karakter yang berbeda (pengelompokan bersifat case-sentitive ).
Kode terpendek dalam byte menang.
Uji kasus
Dalam setiap kasus uji, baris pertama adalah input, dan baris yang tersisa adalah output, dengan masing-masing kelompok di baris yang berbeda.
Uji kasus 1:
Ah, abracadabra! ! , SEBUAH aaaaa bb c d h rr
Uji kasus 2:
\ o / \ o / \ o / /// \\\ ooo
Uji kasus 3:
Seorang pria, sebuah rencana, sebuah kanal: Panama! ! ,, : SEBUAH P aaaaaaaaa c ll mm nnnn hal
Uji kasus 4:
"Tunjukkan padaku bagaimana kamu melakukan trik itu, yang membuatku menjerit," katanya "" , S aaaaa cc DD eeeeeee hhhhhh ii kk mmmm n ooooo rr ssss tttttt kamu ww y
Jawaban:
Jelly , 5 byte
Cobalah online!
Itu mengembalikan sebuah array, hanya saja ketika itu dicetak ke STDOUT, pemisah hilang.
Ini memang fungsi yang bisa disebut demikian (dalam Jelly, setiap baris adalah fungsi).
sumber
Python 3.5+,
77464441 byteCukup mudah. Telusuri karakter unik dalam string dengan mengonversinya menjadi himpunan (menggunakan pembongkaran iterable diperpanjang Python 3.5), kemudian menggunakan pemahaman daftar untuk membangun diagram yang meledak dengan menghitung berapa kali setiap karakter muncul dalam string dengan
str.count
. Kami menyaring ruang dengan menghapusnya dari set.Urutan output dapat bervariasi dari satu menjalankan ke menjalankan; set tidak berurutan, sehingga urutan item mereka diproses, dan dengan demikian jawaban ini keluar, tidak dapat dijamin.
Ini adalah ungkapan lambda; untuk menggunakannya, awali
lambda
denganf=
.Cobalah di Ideone!Ideone menggunakan Python 3.4, yang tidak mencukupi.Contoh penggunaan:
Disimpan 3 byte berkat @shooqie!
sumber
{*s}
untukset(s)
.Retina, 13 byte
Penyortirannya sangat mudah (ini adalah builtin), memisahkan huruf yang membutuhkan 9 byte. Cobalah online!
Baris pertama adalah
O
semua kecocokan dari regex.
(yang merupakan setiap karakter), memberi kita!,Aaaaaabbcdhrr
.Match adalah tahap default untuk baris terakhir suatu program, dan
!
membuatnya mencetak daftar kecocokan yang dipisahkan baris-feed dari regex. Regex mencari satu atau lebih contoh karakter non-spasi dalam satu baris.sumber
Perl 6 , 28 byte
Perhatikan bahwa Bag like Hash atau Set tidak berurutan sehingga urutan hasil tidak dijamin.
Penjelasan:
sumber
Vim,
50, 46 bytePenjelasan / gif akan datang nanti.
sumber
Pyth, 6
Coba di sini atau jalankan a Test Suite .
Cukup sederhana,
-zd
menghapus spasi dari input, dan.gk
mengelompokkan setiap elemen yang tersisa berdasarkan nilainya. Sayangnya, saya belum menemukan cara untuk menggunakan variabel isi-otomatis. Perhatikan bahwa output ditampilkan sebagai string Python, sehingga karakter tertentu (baca: garis miring terbalik) diloloskan. Jika Anda ingin lebih mudah dibaca, tambahkan aj
ke awal kode.sumber
Haskell, 38 byte
Pada dasarnya solusi nimi , tetapi secara eksplisit memeriksa hanya huruf yang muncul dalam string.
sumber
2sable , 7 byte
Kode:
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
JavaScript (ES6), 41 byte
sumber
" "
ada di array yang dikembalikan, juga? Tidak yakin apakah itu diizinkanjoin()
dipanggil dengan double backkticks itu?.join([''])
.join
kemudian mengubahnya menjadi string (kosong) dan menggunakannya untuk bergabung dengan elemen array. Tidak semua metode mengonversi parameternya menjadi string, tetapi teknik ini berguna bagi mereka yang melakukannya.Brachylog ,
147 byte7 byte berkat Fatalize.
Cobalah online!
sumber
x
untuk menghapus@S
(spasi). Saya percaya format output ini (daftar string) validHaskell, 40 byte
Contoh penggunaan:
f "Ah, abracadabra!"
->["!",",","A","aaaaa","bb","c","d","h","rr"]
.Pola
v:w
hanya cocok dengan daftar dengan setidaknya satu elemen, sehingga semua karakter yang tidak ada dalam input diabaikan.Juga 40 byte:
sumber
group
juga dariData.List
. Bagaimanapun, saya pikir sintaks inighci
hanya dan membutuhkan REPL, jadi itu adalah bahasa itu sendiri . Saya ingin tetap dengan Haskell standar.Ruby, 41 + 1 = 42 byte
+1 byte untuk
-n
bendera.Mengambil input pada stdin, misalnya:
sumber
C #
12598 BytesPenjelasan
ToArray
panggilan dan secara implisit mengembalikan IEnumerable yang secara kolektif menghemat 27 bytesumber
Func<string, string[]>
yaitus=>s.GroupBy....
R,
1981899695 byteTidak Disatukan:
Solusi ini saat ini tidak sepenuhnya berfungsi, ketika\
terlibat.Sekarang!
Terima kasih banyak kepada @JDL untuk bermain golf 102 byte!
sumber
for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")
- menyimpan 2 byte.<-
akan menghemat 1 byte!Swift,
10591 byteTerima kasih kepada @NobodyNada selama 14 byte :)
Ya, saya cukup baru untuk Swift ...
Karakter dalam grup dipisahkan oleh satu baris baru. Grup dipisahkan oleh dua baris baru.
sumber
[Character]
ganti aString
, karena aturan mengatakan "Input harus berupa string atau array karakter." Juga,print("")
bisa diganti dengan adilprint()
.print
tanpa argumen tidak berhasil karena beberapa alasan tetapi[Character]
saran itu solid. Terima kasih!Oktaf , 61 byte
Ini adalah fungsi anoymous yang mengambil string sebagai input dan output array sel string.
Coba di Ideone .
Bagaimana itu bekerja
sort
mengurutkan string input. Secara khusus, ruang akan berada di awal.strtrim
menghapus ruang utama.diff(+y)
menghitung perbedaan berurutan antara karakter (untuk mendeteksi batas grup) ...diff(find([1 diff(+y) 1])
berikan vektor ukuran grup.mat2cell
lalu pisahkan string yang diurutkan menjadi potongan dengan ukuran tersebut.sumber
Mathematica, 36 byte
Fungsi bawaan
Gather
danCharacters
melakukan sebagian besar pekerjaan di sini.sumber
> <> , 49 byte
Sangat boros dalam output, tetapi saya berasumsi masih diizinkan mengingat kelonggaran aturan
Penjelasan:
pas beberapa hal dalam cukup ketat, bahkan menggunakan melompat untuk berkeliling beberapa fungsi sehingga saya bisa menjalankan pointer secara vertikal.
Pada dasarnya ini menempatkan setiap karakter ASCII di barisnya sendiri, dan jika tidak ada karakter yang ada, garis tersebut akan kosong
Cobalah online
Sunting: saya salah ada kesalahan dalam kode apa yang menyebabkannya tidak pernah selesai jika ada ruang di input
sumber
Pyth, 5 byte
Coba di sini!
Mengambil input sebagai string Python (yaitu dibungkus dengan tanda kutip, lolos dari tanda kutip dan garis miring seperlunya).
Penjelasan:
Jika Anda menjamin setidaknya satu ruang dalam input, ada solusi 4-byte:
Coba di sini!
Penjelasan:
sumber
PowerShell v2 +, 44 byte
Mengambil input
$args[0]
sebagai argumen literal baris perintah.char
Membuang itu sebagai -array, dan menggunakan-n
e
operator ot qual untuk mengeluarkan spasi (ASCII32
). Ini berfungsi karena casting memiliki urutan yang lebih tinggi, dan ketika sebuah array digunakan sebagai operator sisi kiri dengan skalar sebagai tangan kanan, ia berfungsi seperti filter.Kami meneruskan array karakter tersebut ke
Group-Object
, yang melakukan persis seperti yang dikatakannya. Perhatikan bahwa sejak kita melewati karakter , bukan string, ini dengan benar dikelompokkan dengan sensitivitas huruf besar-kecil.Sekarang, kita punya objek khusus yang memiliki nama grup, jumlah, dll. Jika kita hanya mencetak bahwa kita akan memiliki sejumlah output asing. Jadi, kita perlu menyalurkannya ke loop
|%{...}
dan setiap iterasi-join
yang.Group
bersama-sama ke sebuah string tunggal. String yang dihasilkan dibiarkan dalam pipa, dan output tersirat pada penyelesaian program.Contoh
sumber
Dyalog APL , 11 byte
Berfungsi mengembalikan daftar string.
(⊂∩¨∪)
persimpangan keseluruhan dan karakter uniknya~∘' '
kecuali spasiTryAPL online!
sumber
Memproses, 109 byte
Ini adalah pendekatan brute force, mengurutkan array, lalu memutarnya. Jika tidak cocok dengan karakter terakhir yang dicetak, cetak terlebih dahulu baris baru. Jika spasi, lewati langkah pencetakan.
sumber
Javascript (menggunakan Library eksternal - Enumerable) (
7867 byte)Tautan ke lib: https://github.com/mvegh1/Enumerable
Penjelasan kode: Inilah yang harus dilakukan Enumerable! Muat string ke perpustakaan, yang mengubahnya menjadi array char. Memfilter entri ruang putih. Kelompokkan oleh char. Tulis setiap kelompok ke baris, sesuai dengan predikat yang ditentukan. Predikat itu mengatakan untuk menggabungkan semua elemen dari grup saat ini ke dalam string, tanpa pembatas.
sumber
MATL, 7 byte
Demo Online MATL
sumber
Perl6,
484745Berkat manatwork untuk perbaikannya.
sumber
$a.trim
tampaknya melakukannya untuk kondisi tersebut.$^a.trim&&say $a x$^b
berfungsi. (Maaf untuk menambahkan petunjuk byte demi byte, tetapi ini adalah percobaan pertama saya di Perl6.){
.Ruby, 46 byte
Cobalah online!
Versi program lengkap asli saya, 48 byte setelah menambahkan
n
bendera:sumber
.count(c)
dengan.count c
?*
operator ada di dekatnya sehingga parser akan mengeluh.map
itu perlu parens tambahan, dan((s.chars-[' '])|[]).map
memiliki jumlah karakter yang sama(s.chars-[' ']).uniq.map
. Dan cara lain yang lebih pendek untuk memeriksa karakter unik (melalui regex) sudah dicakup oleh @Jordan dalam jawaban lainPython, 107
Bisa disingkat oleh lambda, tapi nanti
sumber
CJam, 10 byte
Blok tanpa nama yang mengharapkan string di atas tumpukan dan menggantinya dengan daftar string.
Cobalah online!
Penjelasan
sumber
Common Lisp, 123
Tidak Disatukan:
Bukan bahasa yang paling ramah golf. Ini mungkin dapat dimodifikasi untuk mengembalikan daftar daftar alih-alih mencetak string.
sumber
Emacs, 36 penekanan tombol
C-SPACE C-EM-x
sort-r
TABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)
RETURN\1
C-QC-JRETURN!Hasil
A man, a plan, a canal: Panama!
->Penjelasan
sort-r
TAB RETURN .RETURN .RETURN\(\(.\)\2*\)
RETURN\1
C-Q C-JRETURN !sort-regexp-fields
dengan argumen.
dan.
;\(\(.\)\2*\)
->\1\n
di semua pertandingan.sumber