Sắp xếp một chuỗi, sắp xếp


29

Nếu bạn sắp xếp một chuỗi, bạn thường sẽ nhận được một cái gì đó như:

         ':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy

Vâng, đó là câu đầu tiên được sắp xếp.

Như bạn có thể thấy, có rất nhiều nhân vật lặp đi lặp lại, aa, eee, ttttt, 9 chỗ và vân vân.

Nếu chúng ta thêm 128vào giá trị ASCII của lần lặp đầu tiên, 256vào lần thứ hai, 384lần thứ ba, v.v., hãy sắp xếp lại và xuất chuỗi mới (mô đun 128 để lấy lại các ký tự giống nhau), chúng ta sẽ nhận được chuỗi:

 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    

(Lưu ý không gian hàng đầu duy nhất và 4 không gian dấu).

Chuỗi là "tuần tự sắp xếp" <space>':I....uy, <space>aeg....uy, <space>egi....ty, <space>iloty, <space>lt, <space>, <space>, <space>, <space>.

Có thể dễ hình dung hơn nếu chúng ta sử dụng một chuỗi có các chữ số trong đó. Chuỗi 111222334sẽ khi "được sắp xếp" là : 123412312.

Thử thách:

Không có gì ngạc nhiên, thách thức là viết một mã sắp xếp một chuỗi theo mô tả ở trên.

Bạn có thể giả sử rằng chuỗi đầu vào sẽ chỉ chứa các ký tự ASCII có thể in trong phạm vi 32-126 (khoảng trắng đến dấu ngã).


Các trường hợp thử nghiệm:

**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(),()()()()

Đây là , vì vậy mã ngắn nhất trong mỗi ngôn ngữ được tính bằng byte sẽ giành được ref .


Tiêu đề hơi khó hiểu, dẫn đến tôi nghĩ về điều này và bỏ qua phần mô tả: tio.run/nexus/05ab1e#@1@td2jh4ZVe//. Nếu không, tôi sẽ làm việc để mở rộng điều đó để đáp ứng ngắn gọn.
Bạch tuộc ma thuật Urn

Chúng ta có thể xuất ra một danh sách các ký tự thay vì một chuỗi không?
Thuật sĩ lúa mì

Nếu bạn có thể nhập một chuỗi, thì đầu ra cũng phải là một chuỗi. Nếu một danh sách các ký tự là cách thông thường để nhập và xuất các chuỗi trong ngôn ngữ của bạn thì không sao. Ví dụ, bạn có thể không xuất ra {'S', 'g', 'i', 'n', 'r', 't'}bằng Python, vì cách "thông thường" để làm điều đó là "String".
Stewie Griffin

Tôi sẽ sửa nhận xét của tôi ở trên: một chuỗi là danh sách các ký tự , vì vậy một danh sách các ký tự được chấp nhận đầu ra. Tuy nhiên, một danh sách các chuỗi không được chấp nhận. Điều này có nghĩa là, nếu có thể thêm một ký tự thứ hai vào một thành phần trong danh sách của bạn thì nó không được chấp nhận. Ví dụ: {'a','b'}không được chấp nhận trong Matlab vì bạn có thể thêm một ký tự cho mỗi ký tự như thế này : {'aa','b'}. Đầu vào và đầu ra của bạn phải ở cùng một định dạng.
Stewie Griffin

@StewieGriffin Khi bạn nói sắp xếp theo mô tả ở trên. Ý bạn là thuật toán sắp xếp của tôi phải tuân theo quy trình sửa đổi các giá trị ASCII hay nó chỉ phải tạo ra cùng một đầu ra như thuật toán đó?
George Reith

Câu trả lời:


15

Bình thường, 5 byte

s.T.g

Bộ kiểm tra

Rất đơn giản: Nhóm và sắp xếp, chuyển vị, nối.

s.T.g
s.T.gkQ    Implicit variables
   .gkQ    Group the input input lists of elements whose values match when the
           identity function is applied, sorted by the output value.
 .T        Transpose, skipping empty values. This puts all first characters into
           a list, then all second, etc.
s          Concatenate.

Pyth có mọi thứ để trở thành J mới, thật tuyệt vời
shabunc

3
@shabunc Nếu bạn muốn xem J mới, hãy xem github.com/DennisMitchell/jelly
isaacg

13

Thạch , 3 byte

ĠZị

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Oh boy, thử thách này là tất cả nhưng được thực hiện cho Jelly.

Nguyên tử nhóm ( Ġ) lấy một mảng 1 làm đầu vào và các chỉ số nhóm tương ứng với các phần tử giống hệt nhau của mảng. Mảng các nhóm chỉ mục được sắp xếp với các yếu tố tương ứng là các khóa, đây chính xác là thứ tự chúng tôi yêu cầu cho thử thách này.

Tiếp theo, nguyên tử zip ( Z) hoán chuyển các hàng và cột của ma trận được tạo (ragged) của các chỉ mục. Điều này chỉ đơn giản bao gồm đọc các cột của ma trận, bỏ qua các phần tử không có trong cột đó. Kết quả là chúng ta có được chỉ số đầu tiên của ký tự có điểm mã thấp nhất, tiếp theo là chỉ số đầu tiên của ký tự có điểm mã thấp thứ hai, theo sau là chỉ số thứ hai của ký tự có điểm mã thấp nhất, v.v.

Cuối cùng, nguyên tử unindex ( ) lấy các phần tử của mảng đầu vào tại tất cả các chỉ số của nó theo thứ tự được tạo. Kết quả là một mảng ký tự 2D, mà Jelly làm phẳng trước khi in nó.


1 Jelly không có kiểu chuỗi , chỉ là mảng các ký tự.


"Oh boy, thử thách này là tất cả nhưng được tạo ra cho Jelly." -> 3 byte câu trả lời
geisterfurz007 Dừng sự hỗn loạn này

Như tôi đã nói, gần như được làm cho Jelly. :)
Dennis

10

Python 3, 109 105 104 103 99 93 90 88 81 79 69 byte

2 byte được lưu nhờ FlipTack

7 byte được lưu vì flornquake bắt lỗi của tôi

2 byte được lưu nhờ xnor

10 byte được lưu nhờ Dennis

a=[*input()]
while a:
    for c in sorted({*a}):print(end=c);a.remove(c)

Giải trình

Chúng tôi bắt đầu bằng cách chuyển đổi chuỗi của chúng tôi thành một danh sách bằng cách sử dụng một splat và lưu trữ danh sách đó trong một biến a. Sau đó, trong khi chúng tôi akhông phải là danh sách trống, chúng tôi đi qua từng thành viên duy nhất atheo thứ tự được sắp xếp, in nó và xóa một bản sao của ký tự đó khỏi danh sách.

Mỗi lần lặp in sẽ in một bản sao của mỗi ký tự hiện diện a.


1
@StewieGriffin setlà một bộ chưa được sắp xếp.
FlipTack

2
@StewieGriffin khi được in chúng được sắp xếp nhưng không chính xác theo giá trị ASCII của chúng. Nó thường xuất hiện nhưng tôi tin rằng chúng được sắp xếp theo một số loại băm.
Thuật sĩ lúa mì

1
Bạn có thể tạo fmột chuỗi thay vì một danh sách để lưu một vài byte.
flornquake

1
Nếu bạn lấy a=list(input()), bạn có thể làm a.remove(c), đó là một khoản tiết kiệm ròng.
xnor

1
Chuyển sang Python 3 sẽ tiết kiệm rất nhiều byte. tio.run/nexus/ Kẻ
Dennis

6

Haskell, 44 byte

import Data.List
concat.transpose.group.sort

Ví dụ sử dụng:

Prelude Data.List> concat.transpose.group.sort $ "If you sort a string you'll typically get something like:"
" ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    "

Sắp xếp, nhóm các ký tự bằng nhau vào một danh sách các chuỗi (ví dụ "aabbc"-> ["aa","bb","c"]), hoán vị và làm phẳng thành một chuỗi, một lần nữa.


6

Python 2 , 75 byte

lambda s:`zip(*sorted((s[:i].count(c),c)for i,c in enumerate(s)))[1]`[2::5]

Hãy thử trực tuyến!


1
Không biết nó có hợp lệ không nhưng lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]hoạt động với các chuỗi có độ dài tối đa 9e9.
xnor

@xnor bạn có thể thả []và thay đổi 18để 17cứu hai byte. lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
Phù thủy lúa mì

@xnor Ít nhất, đây phải là một gôn Python 32 bit hợp lệ. Tôi đã cố gắng để thoát khỏi zip, nhưng tôi không nghĩ rằng việc thêm 1e9sẽ xảy ra với tôi ... Cảm ơn!
Dennis

@WheatWizard Mắt tốt. Cảm ơn!
Dennis

Điều này không thành công nếu chuỗi có dấu gạch chéo ngược trong đó.
Lynn

4

APL Dyalog , 21 ký tự = 39 byte

t[0~⍨∊⍉(⊢⌸t)[⍋∪t←⍞;]]

t[... ] chỉ mục t (sẽ được xác định sớm) với ...

0~⍨ số không được loại bỏ khỏi

 người nhập ngũ (làm phẳng)

 chuyển

(⊢⌸t)[... đã ;] khóa * t , được lập chỉ mục bởi ...

   các chỉ số sẽ sắp xếp

   các chữ cái duy nhất của

  t←t , có giá trị của

   nhập văn bản nhắc

Dùng thử trực tuyến!


⊢⌸ttạo một bảng trong đó các hàng (được đệm bằng số 0 cho bảng hình chữ nhật) liệt kê từng chỉ số của các chữ cái duy nhất trong t .


1
Những glyphs đắt hơn?
ren

1
@wptreanor gây ra toàn bộ điều là UTF-8 thay vì một byte cho mỗi char.
Adám

4

C, 109 106 105 104 102 100 97 98 96 91 byte

Sao lưu tới 98 byte, cần thiết để khởi tạo j để làm cho f (n) có thể sử dụng lại

Xuống tới 96 Byte bằng cách sử dụng đặt thay cho strlen B-)

Thật kỳ lạ khi tôi phải quay lại strlen nhưng tôi đã thoát khỏi vòng lặp for (; i ++;) để bây giờ giảm xuống còn 91 Byte. Rõ ràng trang người đàn ông để đặt đọc;

"RETURNS
   If successful, the result is a nonnegative integer; otherwise, the result is `EOF'."

... Tôi đã may mắn khi nó được làm việc ở nơi đầu tiên

char*c,i,j;f(m){for(j=strlen(m);j;++i)for(c=m;*c;c++)if(*c==i){*c=7,putchar(i),j--;break;}}

mã kiểm tra...

main(c,v)char**v;
{
    char test[] = "If you sort a string you'll typically get something like: ";
    char test2[] = "Hello, World!";

    f(test);puts("");    
    f(test2);puts("");    
}

Dưới đây là một vài trường hợp thử nghiệm, bây giờ đã đến lúc đánh golf này xuống

C:\eng\golf>a.exe
 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
 !,HWdelorlo

Là không gian dấu còn lại trong trường hợp thử nghiệm đầu tiên?
Stewie Griffin

Tôi có ba dấu cách trong trường hợp thử nghiệm đầu tiên ... Đó là vì tôi không bao gồm khoảng trắng ở chuỗi đầu vào ;-)
cleblanc

4

Toán học, 68 60 59 byte

Split[Characters@#~SortBy~ToCharacterCode]~Flatten~{2}<>""&

Chấp nhận một chuỗi. Xuất ra một chuỗi.

Nếu danh sách các ký tự được cho phép (46 byte):

Split[#~SortBy~ToCharacterCode]~Flatten~{2,1}&

Phiên bản sử dụng Sort(40 byte):

Split@Sort@Characters@#~Flatten~{2}<>""&

Phiên bản này không thể là câu trả lời của tôi vì Sortkhông thể sử dụng ở đây; Sortsắp xếp theo thứ tự chính tắc, không phải theo mã ký tự.


Tôi không biết toán học vì vậy điều này có thể tốt, nhưng bạn đã đọc bình luận này chưa?
Stewie Griffin

@StewieGriffin Welp, không. Tôi có thể khắc phục điều đó, nhưng điều đó không mang lại lợi thế không công bằng cho các ngôn ngữ không có sự khác biệt giữa String và Char []? Thảo luận meta liên quan
JungHwan Min

Điểm tốt. Tôi đã sửa, xem bình luận bên dưới bản gốc. Hội chợ? Tôi không chắc điều này có làm cho câu trả lời của bạn hợp lệ hay không.
Stewie Griffin

@StewieGriffin Mathematica không có sự phân biệt giữa các ký tự và chuỗi. Ngay cả Characterslệnh kỹ thuật cũng xuất ra một danh sách các chuỗi có độ dài-1.
JungHwan Min

1
@StewieGriffin Tôi nghĩ điều này cũng có liên quan . Tôi nghĩ tốt hơn là cho phép đầu vào ở bất kỳ định dạng hợp lý nào, có thể là chuỗi, danh sách độ dài 1 chuỗi, mảng ký tự, mảng byte, v.v.
ngenisis

3

Python 2, 77 76 byte

d={}
def f(c):d[c]=r=d.get(c,c),;return r
print`sorted(input(),key=f)`[2::5]

Lấy một chuỗi trích dẫn làm đầu vào từ stdin.

Hãy thử trực tuyến!


Tôi nghĩ điều này không được phép vì các chức năng phải được sử dụng lại . Bạn có thể làm cho nó một chương trình.
xnor

Tôi thực sự thích phương pháp này, sắp xếp với một hàm đột biến. Việc làm tổ của tuples cũng rất thông minh.
xnor

@xnor Cảm ơn, đã sửa.
flornquake

3

JavaScript (ES6), 79 byte

f=s=>s&&(a=[...new Set(s)]).sort().join``+f(a.reduce((s,e)=>s.replace(e,``),s))
<input oninput=o.textContent=f(this.value)><pre id=o>

Hoạt động bằng cách trích xuất tập hợp các ký tự duy nhất, sắp xếp nó, loại bỏ chúng khỏi chuỗi ban đầu và tính toán đệ quy loại phần còn lại của chuỗi. Giải pháp 81 byte mà tôi thấy thú vị:

f=s=>s&&(s=[...s].sort().join``).replace(r=/(.)(\1*)/g,"$1")+f(s.replace(r,"$2"))

3

J , 16 15 byte

/:+/@(={:)\;"0]

Đây là một động từ mất và trả về một chuỗi. Hãy thử trực tuyến!

Miles lưu một byte, cảm ơn!

Giải trình

Không có gì quá lạ mắt ở đây: sắp xếp chủ yếu theo thứ tự xuất hiện, thứ hai theo giá trị char.

/:+/@(={:)\;"0]  Input is y.
          \      Map over prefixes:
  +/              Sum
    @(   )        of
      =           bit-array of equality
       {:         with last element.
                 This gives an array of integers whose i'th element is k
                 if index i is the k'th occurrence of y[i].
           ;     Pair this array
            "0   element-wise
              ]  with y
/:               and sort y using it as key.

Tôi nghĩ rằng bạn có thể tiết kiệm một byte di chuyển tổng kết ra bên ngoài của các ngoặc `+ / @ (= {:) '
dặm

@Miles Oh yeah, bởi vì một chuyến tàu có thứ hạng vô hạn. Rất vui, cảm ơn!
Zgarb

3

Mathicala, 55 byte, không cạnh tranh

(Sort@Characters@#//.{a___,b_,b_,c___}:>{a,b,c,b})<>""&

Chỉnh sửa: Thật không may, Mathicala sort không theo mã nhân vật, nhưng bởi thứ tự chữ cái, chữ hoa nơi immediatly sau chữ thường (tức là Hi Theređược sắp xếp để{ , e, e, h, H, i, r, T} ).

Điều này hoạt động bằng cách sử dụng các mẫu:

//.{a___,b_,b_,c___}:>{a,b,c,b}
    a___       c___              (Three _) a zero or more members, named a and c
         b_,b_                   exactly one member, repeated twice (since they have the same name)
                    :>           Delayed Rule (replace left hand side with right hand side.)
                                 Delayed Rule evaluate on each substitution, avoiding conflicts with predefined variables
                      {a,b,c,b}  put one of the b-named member after all other sequences
//.                              repeat until no change (aka Replace Repeated)

1
Một điều nhỏ: Rule (->)nên RuleDelayed (:>)(không thay đổi số byte) vì cả hai mặt của Ruleđều có biến. Rulecó thể gây ra xung đột với các định nghĩa đã có từ trước. Ví dụ: a=3;5/.{a_->a}trả về 3, không 5. ( a_->ađánh giá a_->3- nếu bạn sử dụng a_:>a, nó vẫn giữ nguyên như vậy và a=3;5/.{a_:>a}trả về 5).
JungHwan Min

Tôi đã đánh dấu câu trả lời của bạn không cạnh tranh vì nó không thực hiện những gì câu hỏi chỉ định (sắp xếp theo mã ký tự, không theo thứ tự chính tắc).
JungHwan Min

@JungHwanMin đã sửa thành RuleDelayed. cảm ơn.
tàu vũ trụ

2

Brainf * ck , 458 226 byte

,[>>>>>>,]<<<<<<[[-<<<+<<<]>>>[>>>[>>>>>>]<<<[>>--[<->--]<-<[>->+<[>]>[<+>-]<<[<]>-]>>.[[-]<]<<<[[>>>>>>+<<<<<<-]<<<]>>>>>>]>>>[>>>[>>>>>>]<<<[>>--[<->--]<-<[>->+<[>]>[<+>-]<<[<]>-]>>[-<+<+>>]<[->>+<<]<[<<<<<<]>>>]>>>]]<<<<<<]

Hãy thử trực tuyến! - BF

Numberwang , 262 226 byte

8400000087111111442111911170004000400000071114002241202271214020914070419027114170270034427171114400000091111112711170000007000400040000007111400224120227121402091407041902711417027004219190071420091171411111170007000771111117

Hãy thử trực tuyến! - Tây Bắc

Tôi đặt cả hai thứ này ở đây vì chúng là mã giống hệt nhau.


2

PHP, 83 byte

for($s=count_chars($argv[1]);$s=array_filter($s);$c%=128)echo$s[++$c]--?chr($c):'';

Thật không may, bạn không thể có unsetmột ternary vì vậy tôi cần phải sử dụng lâu dài khó chịu array_filter.
Sử dụng như:

php -r "for($s=count_chars($argv[1]);$s=array_filter($s);$c%=128)echo$s[++$c]--?chr($c):'';" "If you sort a string you'll typically get something like:"

2

Python 2, 70 byte

f=lambda s,i=0,c='':s[i>>7:]and(s.count(c)>i>>7)*c+f(s,i+1,chr(i%128))

Dùng thử trực tuyến

Điều này rất không hiệu quả. Liên kết kiểm tra thay đổi i>>7thànhi>>5 và đặt giới hạn đệ quy thành 10000. Giả sử các đầu vào chỉ có giá trị ASCII tối đa 126.

Sử dụng thủ thuật div-mod để lặp qua hai vòng: số lượng tối thiểu i/128ở vòng ngoài và giá trị ASCII i%128trong vòng lặp bên trong. Bao gồm một ký tự ccó giá trị ASCII đã cho nếu số lần nó xuất hiện trong chuỗi ít nhất là số lượng tối thiểu của nó.

Mã sử ​​dụng một mẹo để mô phỏng bài tập c=chr(i%128)để nó có thể được tham chiếu trong biểu thức (s.count(c)>i>>7)*c. Python lambdakhông cho phép gán vì chúng chỉ lấy biểu thức. Chuyển đổi sang một defhoặc toàn bộ chương trình vẫn là một mất mát ròng ở đây.

Thay vào đó, hàm sẽ đẩy giá trị chr(i%128)tới cuộc gọi đệ quy tiếp theo dưới dạng đầu vào tùy chọn. Điều này bị tắt bởi vì iđã được tăng lên, nhưng không quan trọng miễn là chuỗi không chứa ký tự đặc biệt '\x7f'(chúng tôi cũng có thể tăng 128 lên 256). Ban đầu c=''là vô hại.


2

V , 37 36 byte

Cảm ơn @DJMcMayhem cho byte!

Í./&ò
dd:sor
Íî
òͨ.©¨±«©±À!¨.«©/±³²

Hãy thử trực tuyến!

Không chắc chắn tôi thích regex ở cuối, nhưng tôi cần phải òphá vỡ bằng cách nào đó.

Giải thích

Í./&ò                    #All chars on their own line
dd:sor                   #Delete empty line, sort chars
Íî                       #Join all lines together s/\n//
òͨ.©¨±«©±À!¨.«©/±³² #until breaking s/\v(.)(\1+)\1@!(.+)/\3\2\1

Íî(hoặc :%s/\n//g) ngắn hơnVGgJ
DJMcMayhem

1

Perl 6 , 68 byte

{my \a=.comb.sort;[~] flat roundrobin |a.squish.map({grep *eq$_,a})}

Tôi hơi ngạc nhiên khi thấy rằng không có cách tích hợp nào để nhóm các thành phần như trong danh sách. Đó là những gì bản đồ squish bit làm.


1
Tôi nhận được "Seq này đã được lặp lại" trừ khi tôi đổi tên athành @a(+2 byte). Ngoài ra, grep *eq$_,có thể được viết grep $_,(-3 byte) vì một chuỗi là trình so khớp thông minh hợp lệ.
cười vào

1
{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}- Biến thể này chỉ có 54 byte.
cười vào

@smis Tôi không thấy lỗi đó. Có lẽ chúng ta đang sử dụng các phiên bản khác nhau? Tôi đang ở rakudo-star-2016.10. Dù sao, giải pháp của bạn khiến tôi xấu hổ, bạn nên đăng nó như một câu trả lời riêng biệt.
Sean

Tôi đang sử dụng một Rakudo cạnh chảy máu được biên soạn từ nhánh chính của repo git tuần này. Dù sao, tôi đã đăng classifygiải pháp dựa trên cơ sở như một câu trả lời riêng biệt bây giờ.
cười vào

1

JavaScript (ES6), 77 75 byte

s=>(a=[],x={},[...s].sort().map(c=>a[x[c]=n=-~x[c]]=(a[n]||'')+c),a).join``

Ổn định sắp xếp chuỗi từ vựng theo thứ tự xảy ra lần thứ n

F=s=>(a=[],x={},[...s].sort().map(c=>a[x[c]=n=-~x[c]]=(a[n]||'')+c),a).join``

const update = () => {
  console.clear();
  console.log(F(input.value));
};
input.oninput = update;
update();
#input {
  width: 100%;
  box-sizing: border-box;
}
<input id="input" type="text" value="         ':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy" length=99/>
<div id="output"></div>


1+~~cũng giống như -~.
Neil

@Neil Cảm ơn tuyệt vời -2 byte
George Reith

1

Perl 6 , 54 byte

{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}

Giải trình:

  • { }: Một lambda có một đối số - ví dụ: 21211 .
  • .comb: Chia đối số đầu vào thành một danh sách các ký tự - vd (2,1,2,1,1) .
  • .classify(~*): Nhóm các ký tự sử dụng so sánh chuỗi làm điều kiện nhóm, trả về Hash không có thứ tự - ví dụ: { 2=>[2,2], 1=>[1,1,1] } .
  • {*}: Trả về danh sách tất cả các giá trị của Hash - vd [2,2], [1,1,1] .
  • .sort: Sắp xếp nó - ví dụ: [1,1,1], [2,2] .
  • »[*]: Tách các thùng chứa vật phẩm mà các mảng được bọc do nằm trong hàm băm, do đó chúng sẽ không được coi là một mục duy nhất trong bước sau - ví dụ: (1,1,1), (2,2) .
  • roundrobin |: Zip danh sách phụ cho đến khi tất cả đã hết - ví dụ: (1,2), (1,2), (1) .
  • flat: Làm phẳng kết quả - ví dụ: 1, 2, 1, 2, 1 .
  • [~]: Nối chuỗi để lấy lại chuỗi - vd 12121 .

(Tín dụng cho roundrobincách tiếp cận đi đến câu trả lời của Sean .)


1

05AB1E , 15 byte

{.¡"ä"©¹g׫øJ®K

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

{                # sort input
 .¡              # group by equal elements
   "ä"©          # push "ä" and store a copy in the register
       ¹g×       # repeat the "ä" input-nr times
          «      # concatenate the result to each string in the grouped input
           ø     # zip
            J    # join to string
             ®K  # remove all instances of "ä" in the string

10 trong số 15 byte dành cho cách xử lý các chuỗi nén có độ dài khác nhau của 05AB1E.


1

FSharp, 194 190 170 140 133 byte

let f=Seq.map
let(@)=(>>)
f int@Seq.groupBy id@f(snd@Seq.mapi((*)128@(+)))@Seq.concat@Seq.sort@f((%)@(|>)128@byte)@Array.ofSeq@f char

Sử dụng Seq thay vì Array giúp tiết kiệm một vài byte

Xác định tên ngắn hơn và sử dụng bản đồ khác để tránh (fun ->) khối

Hóa ra F # có thể ánh xạ một char thành một, vì vậy việc xóa tên rút gọn của System.Text.Encoding.ASCII và thêm vào một bản đồ khác giúp tôi tiết kiệm 20 byte!

Trả về một mảng char thay vì một chuỗi, giúp tôi tiết kiệm 30 byte!

Tôi không còn cần phải đảm bảo đó là một chuỗi, tiết kiệm cho tôi 7 byte


0

JavaScript (ES6), 114 byte

Được phân tách bằng dòng mới để rõ ràng, không phải là một phần của số byte:

s=>[...s].map(a=>(m[a]=-~m[a])*128+a.charCodeAt(),m={})
.sort((a,b)=>a-b).map(a=>String.fromCharCode(a%128)).join``

Bản giới thiệu

`**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(),()()()()`.split`\n\n`.map(s=>(p=s.split`\n`,console.log(`${p[0]}\n\n${r=f(p[0])}\n\nmatch: ${r==p[1]}`)),
f=s=>[...s].map(a=>(m[a]=-~m[a])*128+a.charCodeAt(),m={}).sort((a,b)=>a-b).map(a=>String.fromCharCode(a%128)).join``)


Mã số tương tự như mã Matlab của tôi và cách tiếp cận chính xác. Chưa cố gắng để khai thác golf mặc dù. Tôi có thể sẽ nâng cấp sau nếu bạn thêm một lời giải thích :-) (Tôi đã đưa ra một nguyên tắc từ việc không nêu lên câu trả lời mà không cần giải thích, ngay cả khi tôi hiểu nó) :-)
Stewie Griffin

0

Clojure, 79 byte

#(for[V[(group-by(fn[s]s)%)]i(range 1e9)k(sort(keys V))c[(get(V k)i)]:when c]c)

Một hàm ẩn danh, trả về một chuỗi các ký tự. Hỗ trợ tối đa 10 ^ 9 lần lặp lại của bất kỳ ký tự nào, rất nhiều.



0

Ruby, 59 + 1 = 60 byte

Thêm một byte cho -ncờ. Giải pháp từ điển của cảng @PatrickRoberts.

d={};print *$_.chars.sort_by{|c|d[c]||=0;c.ord+128*d[c]+=1}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.