Tampilan string yang meledak

39

Tidakkah Anda menyukai diagram tampilan meledak di mana mesin atau objek dipisahkan menjadi bagian terkecil?

masukkan deskripsi gambar di sini

Mari kita lakukan itu untuk sebuah string!

Tantangan

Tulis program atau fungsi itu

  1. memasukkan string yang hanya berisi karakter ASCII yang dapat dicetak ;
  2. membedah string menjadi kelompok karakter yang sama tanpa spasi ("bagian" dari string);
  3. 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 Adan amerupakan 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
    
Luis Mendo
sumber
1
Jika kita menggunakan simbol non-ASCII seperti "¬" sebagai pemisah, dapatkah itu dihitung sebagai 1 byte?
Leaky Nun
5
@ LeakyNun Tidak, itu akan dihitung karena sesuai tergantung pada pengkodean yang digunakan untuk kode sumber, seperti biasa
Luis Mendo
Apakah baris baru setelah grup terakhir dapat diterima?
JustinM
Apakah baris baru keluaran dapat diterima?
DJMcMayhem
1
@RohanJhunjhunwala Bagus sekali! :-) Ya, beberapa baris baru sebagai pemisah baik
Luis Mendo

Jawaban:

11

Jelly , 5 byte

ḟ⁶ṢŒg

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

ḟ⁶ṢŒg
ḟ⁶      filter out spaces
  Ṣ     sort
   Œg   group
Biarawati Bocor
sumber
23

Python 3.5+, 77 46 44 41 byte

lambda s:[a*s.count(a)for a in{*s}-{' '}]

Cukup 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 lambdadengan f=.

Cobalah di Ideone! Ideone menggunakan Python 3.4, yang tidak mencukupi.

Contoh penggunaan:

>>> f=lambda s:[a*s.count(a)for a in{*s}-{' '}]
>>> f('Ah, abracadabra!')
[',', 'A', 'aaaaa', 'd', '!', 'bb', 'h', 'c', 'rr']

Disimpan 3 byte berkat @shooqie!

Tembaga
sumber
3
Selamat atas 1k!
Luis Mendo
2
Di Python> 3,5 yang dapat Anda lakukan {*s}untuk set(s).
shooqie
11

Retina, 13 byte

O`.
!`(\S)\1*

Penyortirannya sangat mudah (ini adalah builtin), memisahkan huruf yang membutuhkan 9 byte. Cobalah online!

Baris pertama adalah Osemua 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.

NinjaBearMonkey
sumber
Apa yang dilakukan! Melakukan?
Downgoat
8

Perl 6 , 28 byte

*.comb(/\S/).Bag.kv.map(*x*)

Perhatikan bahwa Bag like Hash atau Set tidak berurutan sehingga urutan hasil tidak dijamin.

Penjelasan:

# Whatever lambda 「*」


# grab the characters
*.comb(
  # that aren't white-space characters
  /\S/
)
# ("A","h",",","a","b","r","a","c","a","d","a","b","r","a","!")


# Turn into a Bag ( weighted Set )
.Bag
# {"!"=>1,","=>1,"A"=>1,"a"=>5,"b"=>2,"c"=>1,"d"=>1,"h"=>1,"r"=>2}


# turn into a list of characters and counts
.kv
# ("!",1,",",1,"A",1,"a",5,"b",2,"c",1,"d",1,"h",1,"r",2)


# map over them 2 at a time
.map(
  # string repeat the character by the count
  * x *
)
# ("!",",","A","aaaaa","bb","c","d","h","rr")
Brad Gilbert b2gills
sumber
7

Vim, 50 , 46 byte

i <esc>:s/./&\r/g
:sor
qq:%s/\v(.)\n\1/\1\1
@qq@qD

Penjelasan / gif akan datang nanti.

DJMcMayhem
sumber
1
Untuk sekali ini, solusi Emacs & vim terlihat serupa.
YSC
7

Pyth, 6

.gk-zd

Coba di sini atau jalankan a Test Suite .

Cukup sederhana, -zdmenghapus spasi dari input, dan .gkmengelompokkan 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 a jke awal kode.

FryAmTheEggman
sumber
7

Haskell, 38 byte

f s=[filter(==c)s|c<-['!'..],elem c s]

Pada dasarnya solusi nimi , tetapi secara eksplisit memeriksa hanya huruf yang muncul dalam string.

Tidak
sumber
6

2sable , 7 byte

Kode:

Úð-vyÃ,

Penjelasan:

Ú       # Uniquify the string, aabbcc would result into abc
 ð-     # Remove spaces
   vy   # For each character...
     Ã  #   Keep those in the string, e.g. 'aabbcc', 'a' would result into 'aa'
      , #   Pop and print with a newline

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
3
Itu sama sekali tidak terdengar seperti Dennis :-P
Luis Mendo
6

JavaScript (ES6), 41 byte

s=>[...s].sort().join``.match(/(\S)\1*/g)
Neil
sumber
Bukankah ini juga menyebabkan entri " "ada di array yang dikembalikan, juga? Tidak yakin apakah itu diizinkan
Value Ink
@ NilaiInk Bah, saya memikirkan hal itu ketika saya mulai, tetapi segera lupa. Diperbaiki sekarang
Neil
Umm, bagaimana join()dipanggil dengan double backkticks itu?
Tejas Kale
1
@TejasKale Itu adalah string template ES6. Ketika Anda awalan suatu metode ke string template, itu meneruskan template sebagai array ke metode, jadi dalam kasus ini, itu akhirnya memanggil.join(['']) . joinkemudian 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.
Neil
5

Haskell, 40 byte

f x=[v:w|d<-['!'..],v:w<-[filter(==d)x]]

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:

import Data.List
group.sort.filter(>' ')
nimi
sumber
@ThreeFx: Tapi groupjuga dari Data.List. Bagaimanapun, saya pikir sintaks ini ghcihanya dan membutuhkan REPL, jadi itu adalah bahasa itu sendiri . Saya ingin tetap dengan Haskell standar.
nimi
4

Ruby, 41 + 1 = 42 byte

+1 byte untuk -nbendera.

gsub(/(\S)(?!.*\1)/){puts$1*$_.count($1)}

Mengambil input pada stdin, misalnya:

$ echo 'Ah, abracadabra!' | ruby -ne 'gsub(/(\S)(?!.*\1)/){puts$1*$_.count($1)}'
A
h
,
c
d
bb
rr
aaaaa
!
Jordan
sumber
4

C # 125 98 Bytes

using System.Linq;s=>s.GroupBy(c=>c).Where(g=>g.Key!=' ').Select(g=>new string(g.Key,g.Count())));

Penjelasan

//Using anonymous function to remove the need for a full signature 
//And also allow the implicit return of an IEnumerable
s =>

    //Create the groupings
    s.GroupBy(c => c)

    //Remove spaces
    .Where(g=> g.Key!=' ')

    //Generate a new string using the grouping key (the character) and repeating it the correct number of times
    .Select(g => new string(g.Key, g.Count()));
  • Terima kasih kepada @TheLethalCoder yang menyarankan penggunaan fungsi anonim, yang juga memungkinkan saya untuk menghapus ToArraypanggilan dan secara implisit mengembalikan IEnumerable yang secara kolektif menghemat 27 byte
JustinM - Pasang kembali Monica
sumber
Anda dapat menyimpan 18 byte (jika saya hitung dengan benar) dengan mengompilasinya menjadi Func<string, string[]>yaitus=>s.GroupBy....
TheLethalCoder
@ TheLethalCoder apakah Anda yakin itu dapat diterima sebagai pengganti fungsi, saya selalu waspada akan hal itu karena ia menambahkan sedikit tambahan boilerplate untuk dapat menjalankannya, dan dengan argumen untuk memerlukan Linq menggunakannya sepertinya ... salah juga.
JustinM
Inilah contoh baru-baru ini di mana saya melakukannya ... codegolf.stackexchange.com/a/91075/38550 itu akan menghapus semua boilerplate Anda, asalkan fungsinya diizinkan
TheLethalCoder
@TheLethalCoder OK itu cukup baik untuk saya. :) Itu juga memungkinkan saya untuk menghapus panggilan ToArray
JustinM - Reinstate Monica
4

R, 198 189 96 95 byte

for(i in unique(a<-strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")

Tidak Disatukan:

a<-strsplit(gsub(" ","",readline()),"")[[1]] #Takes the input from the console

for(i in unique(a)) #loop over unique characters found in variable a

cat(rep(i,sum(a==i)),"\n",sep="") # print that character n times, where n was the number of times it appeared

Solusi ini saat ini tidak sepenuhnya berfungsi, ketika \terlibat.
Sekarang!

Terima kasih banyak kepada @JDL untuk bermain golf 102 byte!

Frédéric
sumber
@JDL: Silakan sarankan suntingan di komentar. Perubahan Anda sangat menarik, tetapi agak kasar untuk mengubah kode orang lain seperti itu.
Frédéric
1
maaf untuk itu, tetapi saya tidak memiliki 50 reputasi pada saat itu dan tidak dapat memberikan komentar. Akan dilakukan di masa depan!
JDL
@JDL: Cukup adil!
Frédéric
Coba tetapkan variabel di dalam fungsi: for(i in unique(a=strsplit(gsub(" ","",readline()),"")[[1]]))cat(rep(i,sum(a==i)),"\n",sep="")- menyimpan 2 byte.
Andreï Kostyrka
@ AndreïKostyrka: Tidak menyimpan byte dalam formulir ini karena Anda harus meletakkan seluruh bagian a = strsplit (...) di antara tanda kurung: pada dasarnya perbedaan -2 + 2. Namun, menggunakan <-akan menghemat 1 byte!
Frédéric
4

Swift, 105 91 byte

Terima kasih kepada @NobodyNada selama 14 byte :)

Ya, saya cukup baru untuk Swift ...

func f(a:[Character]){for c in Set(a){for d in a{if c==d && c != " "{print(c)}}
print("")}}

Karakter dalam grup dipisahkan oleh satu baris baru. Grup dipisahkan oleh dua baris baru.

Jrich
sumber
Anda dapat menyimpan 13 byte dengan mengambil input sebagai [Character]ganti a String, karena aturan mengatakan "Input harus berupa string atau array karakter." Juga, print("")bisa diganti dengan adil print().
NobodyNada
@NobodyNada printtanpa argumen tidak berhasil karena beberapa alasan tetapi [Character]saran itu solid. Terima kasih!
jrich
3

Oktaf , 61 byte

@(x)mat2cell(y=strtrim(sort(x)),1,diff(find([1 diff(+y) 1])))

Ini adalah fungsi anoymous yang mengambil string sebagai input dan output array sel string.

Coba di Ideone .

Bagaimana itu bekerja

  • sortmengurutkan string input. Secara khusus, ruang akan berada di awal.
  • strtrim menghapus ruang utama.
  • diff(+y) menghitung perbedaan berurutan antara karakter (untuk mendeteksi batas grup) ...
  • ... jadi diff(find([1 diff(+y) 1])berikan vektor ukuran grup.
  • mat2cell lalu pisahkan string yang diurutkan menjadi potongan dengan ukuran tersebut.
Luis Mendo
sumber
3

Mathematica, 36 byte

Fungsi bawaan Gatherdan Charactersmelakukan sebagian besar pekerjaan di sini.

Gather@Select[Characters@#,#!=" "&]&
Greg Martin
sumber
3

> <> , 49 byte

i:0(?v
84}0~/&{!*
v!?: <}/?=&:&:<
>&1+&}aol1-?!;^

Sangat boros dalam output, tetapi saya berasumsi masih diizinkan mengingat kelonggaran aturan

Penjelasan:

i:0(?v           Collects text from input
84}0~/&{!*       adds 32 (first ascii starting at space) to register and 0 to stack
v!?: <}/?=&:&:<  checks all characters to the current register, if equal:
       o         prints the character and continues looping
>&1+&}aol1-?!;^  when all characters are checked, adds 1 to register, prints a newline,
                 checks the stack length to halt the program if 0, and starts looping again

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

torcado
sumber
3

Pyth, 5 byte

.gksc

Coba di sini!

Mengambil input sebagai string Python (yaitu dibungkus dengan tanda kutip, lolos dari tanda kutip dan garis miring seperlunya).

Penjelasan:

    c    Split (implied) input on whitespace
   s     Sum together
.gk      Group by value

Jika Anda menjamin setidaknya satu ruang dalam input, ada solusi 4-byte:

t.gk

Coba di sini!

Penjelasan:

 .gk (Q)  groups the characters in the string by their value
           this sorts them by their value, which guarantees that spaces are first
t         Remove the first element (the spaces)
Steven H.
sumber
3

PowerShell v2 +, 44 byte

[char[]]$args[0]-ne32|group|%{-join$_.Group}

Mengambil input $args[0]sebagai argumen literal baris perintah. charMembuang itu sebagai -array, dan menggunakan-ne 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 .Groupbersama-sama ke sebuah string tunggal. String yang dihasilkan dibiarkan dalam pipa, dan output tersirat pada penyelesaian program.

Contoh

PS C:\Tools\Scripts\golfing> .\exploded-view-of-substrings.ps1 'Programming Puzzles and Code Golf'
PP
rr
ooo
gg
aa
mm
i
nn
u
zz
ll
ee
s
dd
C
G
f
AdmBorkBork
sumber
3

Dyalog APL , 11 byte

Berfungsi mengembalikan daftar string.

(⊂∩¨∪)~∘' '

(⊂∩¨∪) persimpangan keseluruhan dan karakter uniknya

~∘' ' kecuali spasi

TryAPL online!

Adám
sumber
2

Memproses, 109 byte

void s(char[] x){x=sort(x);char l=0;for(char c:x){if(c!=l)println();if(c!=' '&&c!='\n'&&c!='\t')print(c);l=c;}}

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.

Cody
sumber
2

Javascript (menggunakan Library eksternal - Enumerable) ( 78 67 byte)

 n=>_.From(n).Where(y=>y!=' ').GroupBy(x=>x).WriteLine(y=>y.Write())

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.

masukkan deskripsi gambar di sini

applejacks01
sumber
2

Perl6, 48 47 45

slurp.comb.Bag.kv.map:{$^a.trim&&say $a x$^b}

Berkat manatwork untuk perbaikannya.

bb94
sumber
1
Bukan perbaikan besar, tetapi $a.trimtampaknya melakukannya untuk kondisi tersebut.
manatwork
Tampaknya operator logis masih tidak membutuhkan ruang di sekitar mereka, jadi $^a.trim&&say $a x$^bberfungsi. (Maaf untuk menambahkan petunjuk byte demi byte, tetapi ini adalah percobaan pertama saya di Perl6.)
manatwork
Sedikit kesalahan ketik, Anda tidak sengaja menghapus pembukaan {.
manatwork
1

Ruby, 46 byte

Cobalah online!

->s{(s.chars-[' ']).uniq.map{|c|c*s.count(c)}}

Versi program lengkap asli saya, 48 byte setelah menambahkan nbendera:

p gsub(/\s/){}.chars.uniq.map{|c|c*$_.count(c)}
Nilai Tinta
sumber
Bisakah Anda ganti .count(c)dengan .count c?
Cyoce
@Cyoce no, karena *operator ada di dekatnya sehingga parser akan mengeluh.
Value Ink
s.chars- [''] | [] di dalam kurung akan menghindari uniq
GB
@ GB Memang, tapi jika kita menggunakannya untuk mapitu perlu parens tambahan, dan ((s.chars-[' '])|[]).mapmemiliki 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 lain
Value Ink
Ia bekerja di dalam tanda kurung, Anda tidak perlu tanda kurung tambahan karena diutamakan '-' lebih tinggi.
GB
1

Python, 107

Bisa disingkat oleh lambda, tapi nanti

x=sorted(input())
i=0
while i<len(x):x[i:]=['  '*(x[i]!=x[i-1])]+x[i:];i-=~(x[i]!=x[i-1])
print("".join(x))
Lemon dirusak
sumber
1

CJam, 10 byte

{S-$e`::*}

Blok tanpa nama yang mengharapkan string di atas tumpukan dan menggantinya dengan daftar string.

Cobalah online!

Penjelasan

S-  Remove spaces.
$   Sort.
e`  Run-length encode, gives pairs [R C], where R is the run-length and
    C is the character.
::* Repeat the C in each pair R times.
Martin Ender
sumber
1

Common Lisp, 123

(lambda(s &aux(w(string-trim" "(sort s'char<))))(princ(elt w 0))(reduce(lambda(x y)(unless(char= x y)(terpri))(princ y))w))

Tidak Disatukan:

(lambda (s &aux (w (string-trim " " (sort s 'char<))))
  (princ (elt w 0))
  (reduce
    (lambda (x y) 
      (unless (char= x y) (terpri))
      (princ y))
  w))

Bukan bahasa yang paling ramah golf. Ini mungkin dapat dimodifikasi untuk mengembalikan daftar daftar alih-alih mencetak string.

MatthewRock
sumber
1

Emacs, 36 penekanan tombol

C-SPACE C-EM-xsort-rTABRETURN.RETURN.RETURNC-AC-M-S-%\(\(.\)\2*\)RETURN\1C-QC-JRETURN!

Hasil

A man, a plan, a canal: Panama! ->

!
,,
:
A
P
aaaaaaaaa
c
ll
mm
nnnn
p

Penjelasan

  1. C-SPACE C-E
  2. M-x sort-rTAB RETURN .RETURN .RETURN
  3. C-A
  4. C-M-S-% \(\(.\)\2*\)RETURN\1 C-Q C-JRETURN !

  1. Pilih jalur input;
  2. Panggil sort-regexp-fieldsdengan argumen .dan. ;
    • Argumen # 1: Regexp scpecifying catatan untuk disortir
    • Argumen # 2: Regp menentukan kunci dalam catatan
  3. Kembali di garis awal;
  4. Terapkan substitusi regexp \(\(.\)\2*\)-> \1\ndi semua pertandingan.
YSC
sumber