Ăn kẹo theo đúng thứ tự


36

Khi nói đến việc ăn kẹo, tôi giữ cho mình những tiêu chuẩn cao hơn so với giáo dân thông thường. Có một sự cân bằng tinh tế giữa "trộn nó lên" và "tiết kiệm tốt nhất cho lần cuối cùng."

Trong thử thách này, bạn sẽ được cung cấp một chuỗi các ký tự trong đó mỗi nhân vật đại diện cho một miếng kẹo. Các ký tự khác nhau (phân biệt chữ hoa chữ thường) đại diện cho các loại kẹo khác nhau. Chương trình của bạn sau đó phải xác định đúng thứ tự tiêu thụ kẹo, dựa trên quy trình dưới đây. Bạn có thể viết một chương trình hoàn chỉnh (STDIN / STDOUT) hoặc một hàm được đặt tên để hoàn thành nhiệm vụ này.

Hãy nói rằng stash kẹo của tôi là oroybgrbbyrorypoprr. Đầu tiên, tôi sắp xếp kẹo thành từng đống cùng loại, với số lượng lớn hơn ở đầu, sử dụng các giá trị ký tự ASCII thấp hơn làm bộ ngắt kết nối.

rrrrrr
oooo
bbb
yyy
pp
g

Sau đó, tôi lấy từng hàng kẹo và cách đều nhau theo không gian. Ví dụ: nếu có 3 miếng kẹo, một miếng được đặt 1/3 đường, 2/3 đường và ở cuối.

.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g

Sau đó, tôi đi xuống từng cột để tạo đơn hàng kẹo cuối cùng của mình rorbyroprbyorrobypg.

Đầu vào

Một chuỗi có chứa kẹo stash. Đầu vào cho ví dụ trên có thể là:

oroybgrbbyrorypoprr

Đầu ra

Một chuỗi chứa kẹo được sắp xếp lại theo đúng thứ tự tiêu thụ.

rorbyroprbyorrobypg

Chấm điểm

Đây là mã golf. Câu trả lời ngắn nhất trong byte thắng. Luật golf tiêu chuẩn được áp dụng.


Bạn chỉ cần thêm một không gian lớn hơn nếu số kẹo không đồng đều? Hãy nói trong trường hợp này nếu bạn có thêm một viên kẹo r thì lưới sẽ trông như thế nào?
Vajura

38
Cuối cùng cũng có người BIẾT cách ăn kẹo.
Michael M.

12
Vì vậy, ... về cơ bản là phối màu kẹo.
COTO

9
Điều này thực sự đến rất gần với cách tôi ăn kẹo của tôi. :)
Emil

3
Làm thế nào một người tham lam có thể nhận được? Có giới hạn về số lượng kẹo được ăn không?
Alchymist

Câu trả lời:


12

CJam, 78 68 61 45 42 39 31 30 byte

l$:L{L\/,~}${:DM+:MD/,LD/,d/}$

Đưa chuỗi đầu vào qua STDIN

Lấy cảm hứng từ cách tiếp cận đệ quy, nhưng một chút khác biệt. Không cần chuyển vị hay hình chữ nhật nào cả!.

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

l$:L                              "Sort the input line and store it in L";
    {     }$                      "Sort the string based on this code block output";
     L\/,~                        "Sort based on number of occurrences of each";
                                  "character in the full string";
            {               }$    "Sort the sorted string again";
             :DM+:M               "Store each character in D, add to M and update M";
                   D/,            "Count occurrences of D in M";
                      LD/,        "Count occurrences of D in L";
                          d/      "Sort string based on the ratio of two occurrences";

(Đáng buồn là CJam không còn có thể hoàn thành với Pyth do cần quá nhiều cú pháp như cú pháp)

Hãy thử nó ở đây


4
Tôi không nghĩ bạn cần LCM; bất kỳ nhiều nên làm việc. Điều này sẽ cho phép bạn thay thế {_@_@{_@\%}h;/*}bằng :.
Dennis

<facepalm> đã không nghĩ về điều đó.
Tối ưu hóa

Chúc mừng bạn đã giảm một nửa chiều dài của bạn!
isaacg

Tôi cảm thấy mỉa mai ở chỗ: D
Trình tối ưu hóa

11

Bình thường , 25

shCoc/NhN/zhNm>o_/zZSzdUz

Sử dụng một thuật toán hoàn toàn mới, lấy cảm hứng từ câu trả lời này .

(implicit)          z = input()
(implicit)          print
s                   combine list of strings into one string
 h                  first list in
  C                 matrix transpose of (e.g. first characters in first list, etc.)
   o                order_by(lambda N:
    c                        float_div(
     /NhN                              N.count(N[0]),
     /zhN                              z.count(N[0])),
    m                        map(lambda d:
     >                           slice_head(
      o                                     order_by(lambda Z:
       _/zZ                                          -1*z.count(Z),
       Sz                                            sorted(z)),
      d                                     d),
     Uz                          range(len(z))

Từng bước một:

  1. Đầu tiên, chúng tôi sắp xếp các ký tự theo mức độ phổ biến của chúng, các mối quan hệ bị phá vỡ theo thứ tự abc. Đây là o_/zZSz. ogiống như của Pythonsorted(<stuff>,key=<stuff>) , với biểu thức lambda cho khóa, ngoại trừ nó giữ nó như một chuỗi.

  2. Sau đó, chúng tôi tạo ra một danh sách các tiền tố của chuỗi đó, từ chiều dài len(z)đến chiều dài 1. >tương đương với python <stuff>[<int>:].

  3. Sau đó, chúng tôi sắp xếp lại danh sách các chuỗi tiền tố này theo vị trí phân số, 0 là cạnh trái và 1 là bên phải, ký tự đầu tiên của tiền tố trên bố cục hình chữ nhật nhìn thấy trong câu hỏi. /NhNđếm số lần ký tự đầu tiên trong tiền tố xảy ra trong tiền tố, trong khi /zhNđưa ra số lần xuất hiện của ký tự đầu tiên trong tiền tố trong chuỗi là một lỗ. Điều này gán cho mỗi tiền tố được dẫn dắt bởi mỗi ký tự trong một nhóm một phân số khác nhau, từ 1/klần xuất hiện bên phải nhất của ký tự đó k/kcho hầu hết bên trái. Sắp xếp lại danh sách tiền tố theo số này sẽ cho vị trí thích hợp trong bố cục. Các mối quan hệ bị phá vỡ bằng cách sử dụng thứ tự trước, lần đầu tiên bằng cách đếm sau đó theo bảng chữ cái, như mong muốn.

  4. Cuối cùng, chúng ta cần trích xuất ký tự đầu tiên từ mỗi chuỗi tiền tố, kết hợp chúng thành một chuỗi và in chúng ra. Trích xuất các ký tự đầu tiên là hC. Cthực hiện một ma trận hoán vị trong danh sách, thực sự zip(*x)trong Python 3. htrích xuất hàng đầu tiên của ma trận kết quả. Đây thực sự là hàng duy nhất, bởi vì sự hiện diện của tiền tố 1 ký tự ngăn không cho bất kỳ hàng hoàn chỉnh nào khác được hình thành. stổng hợp các ký tự trong bộ dữ liệu này thành một chuỗi duy nhất. In ấn là ngầm.

Kiểm tra:

$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg

Phần chương trình tăng dần trên oroybgrbbyrorypoprr:

Sub-Piece                  Output

Sz                         bbbgoooopprrrrrryyy
o_/zNSz                    rrrrrroooobbbyyyppg      (uses N because o uses N on first use.)
m>o_/zNSzdUz               ['rrrrrroooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrroooobbbyyyppg', 'rrroooobbbyyyppg', 'rroooobbbyyyppg', 'roooobbbyyyppg', 'oooobbbyyyppg', 'ooobbbyyyppg', 'oobbbyyyppg', 'obbbyyyppg', 'bbbyyyppg', 'bbyyyppg', 'byyyppg', 'yyyppg', 'yyppg', 'yppg', 'ppg', 'pg', 'g']
oc/NhN/zhNm>o_/zZSzdUz     ['roooobbbyyyppg', 'obbbyyyppg', 'rroooobbbyyyppg', 'byyyppg', 'yppg', 'rrroooobbbyyyppg', 'oobbbyyyppg', 'pg', 'rrrroooobbbyyyppg', 'bbyyyppg', 'yyppg', 'ooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrrrroooobbbyyyppg', 'oooobbbyyyppg', 'bbbyyyppg', 'yyyppg', 'ppg', 'g']
Coc/NhN/zhNm>o_/zZSzdUz    [('r', 'o', 'r', 'b', 'y', 'r', 'o', 'p', 'r', 'b', 'y', 'o', 'r', 'r', 'o', 'b', 'y', 'p', 'g')]
shCoc/NhN/zhNm>o_/zZSzdUz  rorbyroprbyorrobypg

Câu trả lời cũ:

Bình thường , 34

ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z

Chương trình này hoạt động bằng cách tính toán bao nhiêu lần để sao chép một danh sách con nhất định. Danh sách phụ trông như thế ['', '', '', '', ... , 'r']. Tổng chiều dài của danh sách phụ này là sản phẩm của số lần xuất hiện của tất cả các loại kẹo khác u*G/zHS{-zd1. Danh sách con đầy đủ được xây dựng bằng cách sao chép danh sách chuỗi rỗng ]k, nhiều lần, sau đó loại bỏ và phần tử với tvà thêm tên kẹo vào cuối +d.

Sau đó, danh sách phụ này được sao chép nhiều lần số kẹo đó được tìm thấy trong đầu vào /zd, đảm bảo mỗi danh sách của kẹo có độ dài bằng nhau.

Bây giờ, với chức năng này được ánh xạ trên tất cả các loại kẹo duy nhất theo thứ tự được sắp xếp thích hợp ( o_/zNS{z), chúng ta có một hình chữ nhật tương tự như trong câu hỏi, nhưng với các chuỗi trống thay vì dấu chấm. Thực hiện một ma trận hoán vị ( C) theo sau là hai phép tính tổng ( ss) sẽ cho chuỗi cuối cùng.

Xác minh:

$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg

4
Có vẻ như Pyth hỗ trợ mã hóa theo cú pháp ngôn ngữ!
Tối ưu hóa

@Optimizer Mã hóa? Bạn đang nói về cái gì vậy?
isaacg

Tốt đẹp! Tôi có lẽ sẽ không bao giờ nghĩ sẽ thay đổi vòng lặp for thành bản đồ. Sạch sẽ hơn nhiều.
FryAmTheEggman

Nhìn vào mã nguồn. Nó trông giống như một tin nhắn được mã hóa.
Tối ưu hóa

2
Bạn có thể đưa ra một ví dụ từng bước của thuật toán mới nhất? Khá vui lòng :)
Trình tối ưu hóa

6

Perl 5 - 62

61 mã + 1 cờ.

#!perl -n
print map/(.$)/,sort map/(.$)/*$_/$$1.~$_.$1,map++$$_.$_,/./g

Đầu tiên phân chia đầu vào thành mảng ký tự - /./g.

Thêm chỉ số xuất hiện vào mỗi chữ cái để lại số đếm trong các biến $a.. $zvới map++$$_.$_. Bây giờ mảng là:

1o
1r
2o
1y
1b
1g
2r
2b
3b
2y
3r
3o
4r
3y
1p
4o
2p
5r
6r

Sau đó chuyển đổi nó thành một khóa sắp xếp khóa: tỷ lệ $_/$$1, bộ ngắt kết nối đếm ~$_và bộ ngắt giá trị ASCII $_. Điều này sẽ dẫn đến (ở đây có thêm không gian cho rõ ràng).

0.25 18446744073709551614 o
0.166666666666667 18446744073709551614 r
0.5 18446744073709551613 o
0.333333333333333 18446744073709551614 y
0.333333333333333 18446744073709551614 b
1 18446744073709551614 g
0.333333333333333 18446744073709551613 r
0.666666666666667 18446744073709551613 b
1 18446744073709551612 b
0.666666666666667 18446744073709551613 y
0.5 18446744073709551612 r
0.75 18446744073709551612 o
0.666666666666667 18446744073709551611 r
1 18446744073709551612 y
0.5 18446744073709551614 p
1 18446744073709551611 o
1 18446744073709551613 p
0.833333333333333 18446744073709551610 r
1 18446744073709551609 r

Điều này có thể được sắp xếp theo thứ tự từ điển (mặc định). Cuối cùng trích xuất ký tự cuối cùng và in:print map/(.$)/


5

Python 3.x - 124 byte

C=input()
print("".join(s[1]for s in sorted(enumerate(C),key=lambda
t:((C[:t[0]].count(t[1])+1+1e-10)/C.count(t[1]),t[1]))))

Đây là một thuật toán tuyệt vời hơn nhiều so với phương pháp hình chữ nhật!
isaacg

4

Toán học, 123 119 118 byte

f=FromCharacterCode[s=SortBy;#&@@@s[Join@@(s[Tally@ToCharacterCode@#,-Last@#&]/.{x_,n_}:>({x,#/n}&~Array~n)),{Last}]]&

Xác định một hàm được đặt tên f. Ung dung:

f = FromCharacterCode[
   s = SortBy;
   # & @@@ s[
     Join @@ (
       s[
         Tally@ToCharacterCode@#,
         -Last@# &
         ] /. {x_, n_} :> ({x, #/n} &~Array~n)
       ),
     {Last}
     ]
   ] &

Sử dụng các loại hợp lý tích hợp có vẻ như là một ý tưởng tốt cho việc này. Tất nhiên, đây không phải là nơi gần CJam. Về cơ bản, tôi đại diện cho lưới được hiển thị trong thử thách dưới dạng một danh sách các cặp. Điều đầu tiên trong cặp là mã ký tự, thứ hai là vị trí của nó dưới dạng phân số nhỏ hơn hoặc bằng 1 (cột cuối cùng là 1). Đã chắc chắn rằng các ký tự riêng lẻ đã được sắp xếp theo đúng thứ tự, tôi chỉ cần sắp xếp thứ tự ổn định này theo phân số đã nói để có kết quả mong muốn.


3

Pyth 45 47 48 51

Điều này cũng gần như chắc chắn sẽ được đánh gôn hơn nữa;)

Ko_/zNS{zFGK~Y]*+*t/u*GHm/zdK1/zG]k]G/zG)ssCY

Hoạt động bằng cách xây dựng một danh sách các danh sách, trong đó mỗi danh sách bên trong là một chuỗi các chuỗi trống và tên của kẹo. Danh sách này được hoán vị và sau đó các danh sách bên trong được nối theo sau là các danh sách này được nối.

Cảm ơn @isaacg đã nhắc nhở tôi về tổng!


2
strên một danh sách các chuỗi hoạt động như j"".
isaacg

3

APL: 38

v⌷⍨⊂⍋⌽(n/-n),⍪∊+\¨n⍴¨÷n←{≢⍵}⌸v←{⍵[⍋⍵]}

Giải trình:

v←{⍵[⍋⍵]}    orders input string
n←{≢⍵}⌸v     counts how many times each element appears in v
∊+\¨n⍴¨÷n     makes incremental sums in each letter "group" 
⍋⌽(n/-n),⍪   appends number of elements in letter group and orders the obtained matrix
v⌷⍨⊂         orders vector v with computed indices

Có thể được thử nghiệm trên tryapl.org


2

R - 166 ký tự

library("plyr");s=function(a){l=table(strsplit(a,s="")[[1]]);l=ldply(l[order(-l,names(l))],function(n)data.frame(seq_len(n)/n));paste(l[order(l[[2]]),1],collapse="")}

phiên bản vô văn hóa

library("plyr")
s <- function(a) {
    tbl <- table(strsplit(a, split = "")[[1]])
    tbl <- tbl[order(-tbl, names(tbl))]
    tbl <- ldply(tbl, function(n) {data.frame(seq_len(n)/n)})
    paste(tbl[order(tbl[[2]]),1], collapse = "")
}

Giải trình:

  • Chia thành các ký tự riêng lẻ
  • Số lượng bảng của mỗi nhân vật
  • Sắp xếp bảng thành thường xuyên nhất và sau đó theo thứ tự từ vựng
  • Vị trí chỉ mục để lựa chọn ở 1 / n, 2 / n, 3 / n, ... n-1 / n, 1 trong đó n là số kẹo
  • Sắp xếp tên kẹo theo chỉ mục (order ổn định trong việc sắp xếp, do đó sẽ duy trì thứ tự đặt tên thường xuyên / từ vựng nhất khi liên kết trong chỉ mục, đặc biệt quan trọng với các kẹo cuối cùng)
  • Ghép các tên kẹo lại với nhau để tạo chuỗi đầu ra

Bản chất ma trận của vấn đề khiến tôi nghĩ R có thể có một vấn đề, nhưng cách giải thích theo nghĩa đen tốt nhất của thuật toán tôi có thể làm là 211 ký tự:

l=function(a){l=table(strsplit(a,s="")[[1]]);l=l[order(-l,names(l))];o=Reduce(`*`,l);m=matrix("",nc=o,nr=length(l));for(r in seq_along(l)){x=l[r];for(c in seq_len(x)*o/x){m[r,c]<-names(x)}};paste(m,collapse="")}

vô dụng:

l <- function(a) {
    tbl <- table(strsplit(a, split = "")[[1]])
    tbl <- tbl[order(-tbl, names(tbl))]
    o <- Reduce(`*`, tbl)
    m <- matrix("", ncol = o, nrow = length(tbl))
    for (r in seq_along(tbl)) {
        for (c in seq_len(tbl[r])*o/tbl[r]) {
            m[r,c] <- names(tbl[r])
        }
    }
    paste(m, collapse="")
}

2

Bình thường, 29 byte

Đây là bản dịch trực tiếp câu trả lời của tôi về CJam r trong Pyth

oc/|$Y.append(N)$YN/zNo_/zZSz

Dùng thử trực tuyến tại đây


Có một câu chuyện khá dài đằng sau giải pháp này và @isaacg đã giúp tôi rất nhiều trong việc hiểu ngôn ngữ mới này.

Lý tưởng nhất là bản dịch chính xác từng chữ của mã CJam của tôi ( 17 byte ):

oc/~kNN/zNo_/zZSz

nghĩa là:

o         order_by(lambda N:
 c                 div(
  /                    count(
   ~kN                       k+=N,                #Update k (initially ""), add N
   N                         N),                  #Count N in updated k
  /zN                  count(z, N)),
 o                 order_by(lambda Z:
  _                         neg(
   /zZ                          count(z, Z)),
  Sz                        sorted(z)))

Nhưng thật đáng buồn khi Python không trả lại bất cứ thứ gì trong += cuộc gọi, vì vậy đó không phải là mã Python hợp lệ, do đó, mã Pyth không hợp lệ cũng như trong Pyth, lambda chỉ có thể là câu lệnh trả về.

Sau đó, tôi đã xem xét các phương thức khác nhau và cuối cùng thấy rằng Python list.appendtrả về một Nonegiá trị mà tôi có thể sử dụng. Làm cho mã thành ( 19 byte ):

oc/|aYNYN/zNo_/zZSz

nghĩa là:

o         order_by(lambda N:
 c                 div(
  /                    count(
   |aYN                      (Y.append(N) or
    Y                         Y)                 #Update Y (initially []), append N
   N                         N),                 #Count N in updated Y
  /zN                  count(z, N)),
 o                 order_by(lambda Z:
  _                         neg(
   /zZ                          count(z, Z)),
  Sz                        sorted(z)))

Nhưng thật đáng buồn, hỗ trợ của a(append) đã bị xóa khỏi Pyth và phiên bản có hỗ trợ, không có hỗ trợ choo .

Cập nhật: a hỗ trợ đã được thêm lại trong Pyth ngay bây giờ để mã 19 byte ở trên sẽ hoạt động trong trình biên dịch trực tuyến. Nhưng vì đây là một tính năng mới được thêm vào sau OP, nên tôi không đưa nó lên làm điểm số của mình và để mã 29 byte làm giải pháp của mình.

Do đó, tôi đã phải dựa vào Python thô trong trường hợp đó, làm cho mã được

o         order_by(lambda N:
 c                 div(
  /                    count(
   |$Y.append(N)$            (Y.append(N) or
    Y                         Y)                 #Update Y (initially []), append N
   N                         N),                 #Count N in updated Y
  /zN                  count(z, N)),
 o                 order_by(lambda Z:
  _                         neg(
   /zZ                          count(z, Z)),
  Sz                        sorted(z)))
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.