กินขนมหวานในลำดับที่ถูกต้อง


36

เมื่อพูดถึงการกินขนมฉันยึดมั่นในมาตรฐานที่สูงกว่าคนธรรมดาทั่วไป มีความสมดุลที่ละเอียดอ่อนระหว่าง "การมิกซ์มัน" และ "การประหยัดสิ่งที่ดีที่สุด"

ในการท้าทายนี้คุณจะได้รับสายอักขระที่แต่ละตัวละครแทนชิ้นส่วนของขนม อักขระที่แตกต่างกัน (คำนึงถึงตัวอักษรพิมพ์เล็ก - ใหญ่) เป็นตัวแทนของขนมประเภทต่างๆ โปรแกรมของคุณจะต้องกำหนดลำดับการบริโภคลูกอมที่ถูกต้องตามขั้นตอนด้านล่าง คุณสามารถเขียนโปรแกรมที่สมบูรณ์ (STDIN / STDOUT) หรือฟังก์ชั่นที่มีชื่อเพื่อให้งานนี้สำเร็จ

oroybgrbbyrorypoprrสมมติว่าซ่อนลูกอมของฉันคือ ก่อนอื่นฉันจัดเรียงขนมเป็นกองประเภทเดียวกันโดยมีปริมาณมากขึ้นที่ด้านบนโดยใช้ค่าอักขระ ASCII ที่ต่ำกว่าเป็นตัวแบ่งไทเบรก

rrrrrr
oooo
bbb
yyy
pp
g

จากนั้นฉันก็หยิบลูกอมแต่ละแถวและแบ่งเท่า ๆ กันตามช่วงเวลา ตัวอย่างเช่นหากมีขนม 3 ชิ้นหนึ่งจะถูกวาง 1/3 ของวิธี 2/3 ของทางและในตอนท้าย

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

จากนั้นฉันลงแต่ละคอลัมน์เพื่อสร้างคำสั่งลูกกวาดสุดท้ายของฉัน, rorbyroprbyorrobypg.

อินพุต

สตริงที่มีที่เก็บลูกอม อินพุตสำหรับตัวอย่างด้านบนอาจเป็น:

oroybgrbbyrorypoprr

เอาท์พุต

สตริงที่มีการจัดระเบียบขนมใหม่เป็นลำดับที่ถูกต้องของการบริโภค

rorbyroprbyorrobypg

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ คำตอบที่สั้นที่สุดเป็นไบต์ชนะ ใช้กฎมาตรฐานของกอล์ฟ


คุณเพียงแค่เพิ่มช่องว่างที่ใหญ่กว่านี้ถ้าตัวเลขขนมไม่เท่ากัน? ให้พูดในกรณีนี้ถ้าคุณมีขนมอีกหนึ่งตัวตารางจะเป็นอย่างไร
Vajura

38
ในที่สุดใครบางคนที่รู้วิธีกินขนม
Michael M.

12
ดังนั้น ... โดยทั่วไปการทำขนมหวาน
COTO

9
อันที่จริงแล้วมันใกล้เคียงกับวิธีที่ฉันกินขนมของฉัน :)
Emil

3
คนคนหนึ่งโลภแค่ไหนที่ได้มา? มีการ จำกัด จำนวนลูกอมที่จะรับประทานหรือไม่?
เล่นแร่แปรธาตุ

คำตอบ:


12

CJam, 78 68 61 45 42 39 31 30 ไบต์

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

รับสตริงอินพุตผ่าน STDIN

แรงบันดาลใจจากวิธีการแบบเรียกซ้ำ แต่แตกต่างกันเล็กน้อย ไม่จำเป็นต้องเปลี่ยนหรือสี่เหลี่ยมผืนผ้าเลย!

มันทำงานอย่างไร:

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";

(น่าเศร้าที่ CJam ไม่สามารถดำเนินการกับ Pyth ได้อีกต่อไปเนื่องจากจำเป็นต้องมีการขยายตัวเป็นไวยากรณ์มาก)

ลองที่นี่


4
ฉันไม่คิดว่าคุณต้องการ LCM; ใด ๆ ที่หลายควรจะทำงาน นี้จะช่วยให้คุณสามารถแทนที่ด้วย{_@_@{_@\%}h;/*} :
เดนนิส

<ใบหน้า> ไม่ได้คิดอย่างนั้น
เครื่องมือเพิ่มประสิทธิภาพ

ขอแสดงความยินดีกับการลดความยาวของคุณลงครึ่งหนึ่ง!
isaacg

ฉันรู้สึกถากถางว่า: D
เครื่องมือเพิ่มประสิทธิภาพ

11

Pyth , 25

shCoc/NhN/zhNm>o_/zZSzdUz

ใช้อัลกอริทึมใหม่ทั้งหมดโดยได้แรงบันดาลใจจากคำตอบนี้

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

เป็นขั้นเป็นตอน:

  1. ก่อนอื่นเราจัดเรียงตัวละครตามความธรรมดาของพวกเขา o_/zZSzนี่คือ oเหมือนกับ Python sorted(<stuff>,key=<stuff>)โดยมีการแสดงออกแลมบ์ดาสำหรับคีย์ยกเว้นมันจะเก็บไว้เป็นสตริง

  2. จากนั้นเราสร้างรายการคำนำหน้าของสตริงว่าจากความยาวlen(z)ความยาว 1. เทียบเท่ากับของงูหลาม><stuff>[<int>:]

  3. จากนั้นเราเรียงลำดับรายการของสายอักขระนำหน้าอีกครั้งโดยตำแหน่งที่เป็นเศษส่วน 0 เป็นขอบซ้ายและ 1 เป็นอักขระทางขวาของอักขระตัวแรกของคำนำหน้าบนเค้าโครงสี่เหลี่ยมที่เห็นในคำถาม /NhNนับว่าอักขระตัวแรกในคำนำหน้าเกิดขึ้นกี่ครั้งในส่วนนำหน้าในขณะที่/zhNให้จำนวนการปรากฏตัวของอักขระตัวแรกในคำนำหน้าในสตริงเป็นรู สิ่งนี้จะกำหนดคำนำหน้าแต่ละตัวที่นำโดยตัวละครแต่ละตัวในกลุ่มที่แตกต่างกันออกไป1/kสำหรับการเกิดส่วนใหญ่ของตัวละครนั้นไปk/kทางซ้ายสุด การเรียงลำดับรายการคำนำหน้าด้วยหมายเลขนี้จะให้ตำแหน่งที่เหมาะสมในโครงร่าง ความสัมพันธ์จะถูกทำลายโดยใช้การสั่งซื้อก่อนซึ่งเป็นครั้งแรกโดยนับแล้วตามตัวอักษรตามที่ต้องการ

  4. สุดท้ายเราต้องแยกอักขระตัวแรกจากแต่ละคำนำหน้าสตริงรวมมันเป็นสตริงเดียวแล้วพิมพ์ออกมา hCการแยกตัวอักษรตัวแรกเป็น Cดำเนินการแปลงเมทริกซ์ในรายการจริงzip(*x)ใน Python 3 hแยกแถวแรกของเมทริกซ์ผลลัพธ์ นี่เป็นแถวเดียวเท่านั้นเนื่องจากการมีคำนำหน้าอักขระ 1 ตัวจะป้องกันไม่ให้เกิดแถวที่สมบูรณ์อื่น ๆ sผลรวมตัวละครใน tuple นี้เป็นสตริงเดียว การพิมพ์โดยปริยาย

ทดสอบ:

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

โปรแกรมส่วนเพิ่มเมื่อ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

คำตอบเก่า:

Pyth , 34

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

โปรแกรมนี้ทำงานโดยการคำนวณจำนวนครั้งในการทำซ้ำรายการย่อยที่แน่นอน ['', '', '', '', ... , 'r']ย่อยรายการลักษณะเช่น ความยาวทั้งหมดของย่อยนี้รายการเป็นผลิตภัณฑ์ของจำนวนของการเกิดขึ้นทั้งหมดของลูกอมอื่น ๆ u*G/zHS{-zd1ซึ่งเป็น รายการย่อยเต็มรูปแบบที่สร้างขึ้นโดยจำลองรายชื่อของสตริงที่ว่างเปล่าที่]kว่าหลายต่อหลายครั้งแล้วถอดและองค์ประกอบที่มีและเพิ่มชื่อขนมที่จะจบลงด้วยการt+d

จากนั้นรายการย่อยนี้จะถูกทำซ้ำหลาย ๆ ครั้งเท่าที่พบใน/zdลูกอมเพื่อให้แน่ใจว่ารายการขนมแต่ละรายการมีความยาวเท่ากัน

ตอนนี้ฟังก์ชั่นนี้แมปกับลูกอมที่ไม่ซ้ำกันทั้งหมดในการเรียงลำดับที่เหมาะสม ( o_/zNS{z) เรามีรูปสี่เหลี่ยมผืนผ้าคล้ายกับที่อยู่ในคำสั่งคำถาม แต่มีสตริงว่างแทนที่จะเป็นจุด การทำเมทริกซ์ทรานสโพเรน ( C) ตามด้วยการสรุปสองครั้ง ( ss) จะให้สตริงสุดท้าย

ยืนยัน:

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

4
ดูเหมือนว่า Pyth รองรับการเข้ารหัสในรูปแบบภาษาเอง!
เครื่องมือเพิ่มประสิทธิภาพ

@ การเข้ารหัส Optimizer คุณกำลังพูดเรื่องอะไร
isaacg

ดี! ฉันอาจไม่เคยคิดที่จะเปลี่ยน for for loop เป็นแผนที่ ทำความสะอาดมาก
FryAmTheEggman

ดูซอร์สโค้ด ดูเหมือนข้อความที่เข้ารหัส
เครื่องมือเพิ่มประสิทธิภาพ

2
คุณสามารถให้ตัวอย่างทีละขั้นตอนของอัลกอริทึมล่าสุดได้หรือไม่? โปรดได้เลย :)
เครื่องมือเพิ่มประสิทธิภาพ

6

Perl 5 - 62

61 รหัส + 1 ธง

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

ก่อนอื่นแบ่งอินพุตเป็นอาร์เรย์อักขระ - /./g.

เพิ่มดัชนีที่เกิดขึ้นกับตัวอักษรออกจากการนับในแต่ละตัวแปร$a.. กับ$z map++$$_.$_ตอนนี้อาร์เรย์คือ:

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

จากนั้นแปลงเป็นเชื่อมโยงที่สำคัญเรียงลำดับตาม: อัตราส่วน$_/$$1นับเบรกผูก~$_และค่า ASCII $_เบรกผูก ซึ่งจะส่งผลให้ (ที่นี่มีช่องว่างเพิ่มเพื่อความชัดเจน)

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

สิ่งนี้สามารถจัดเรียงด้วยคำสั่งพจนานุกรม (เริ่มต้น) ในตอนท้ายแยกอักขระตัวสุดท้ายและพิมพ์:print map/(.$)/


5

Python 3.x - 124 ไบต์

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

นี่เป็นอัลกอริทึมที่เย็นกว่าวิธีสี่เหลี่ยมผืนผ้า!
isaacg

4

Mathematica, 123 119 118 ไบต์

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

fกำหนดฟังก์ชันการตั้งชื่อ Ungolfed:

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

การใช้ประเภทเหตุผลที่มีอยู่ภายในดูเหมือนว่าความคิดที่ดีสำหรับสิ่งนี้ แน่นอนว่าไม่มีที่ไหนใกล้กับ CJam โดยทั่วไปฉันเป็นตัวแทนของตารางที่แสดงในความท้าทายเป็นรายการคู่ สิ่งแรกในคู่คือรหัสตัวอักษรที่สองคือตำแหน่งเป็นเศษส่วนน้อยกว่าหรือเท่ากับ 1 (คอลัมน์สุดท้ายเป็น 1) ต้องทำให้แน่ใจว่าตัวละครแต่ละตัวนั้นอยู่ในลำดับที่ถูกต้องแล้วฉันแค่ต้องเรียงลำดับเสถียรนี้ด้วยเศษส่วนที่กล่าวมาเพื่อให้ได้ผลลัพธ์ที่ต้องการ


3

Pyth 45 47 48 51

นี่อาจจะเป็นสนามกอล์ฟอีกแน่นอน;)

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

ทำงานโดยการสร้างรายการของรายการที่แต่ละรายการภายในเป็นแถวของสตริงว่างและชื่อของขนม รายการนี้ถูกย้ายจากนั้นรายการภายในจะเข้าร่วมแล้วตามด้วยรายการเหล่านี้ที่เข้าร่วม

ขอบคุณ @isaacg สำหรับเตือนฉันเกี่ยวกับผลรวม!


2
sj""ในรายการของสตริงทำงานเป็น
isaacg

3

APL: 38

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

คำอธิบาย:

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

สามารถทดสอบได้ที่ tryapl.org


2

R - 166 ตัวอักษร

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="")}

รุ่นที่ไม่ได้ถูกดัดแปลง

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 = "")
}

คำอธิบาย:

  • แบ่งออกเป็นอักขระแต่ละตัว
  • กำหนดจำนวนอักขระแต่ละตัว
  • จัดเรียงตารางลงในความถี่ที่พบบ่อยที่สุดและตามลำดับคำศัพท์
  • ดัชนีตำแหน่งสำหรับการเลือกที่ 1 / n, 2 / n, 3 / n, ... n-1 / n, 1 โดยที่ n คือจำนวนลูกอม
  • เรียงชื่อขนมตามดัชนี ( orderมีความเสถียรในการเรียงลำดับดังนั้นจะรักษาลำดับการตั้งชื่อ / คำศัพท์ที่บ่อยที่สุดเมื่อการผูกในดัชนีโดยเฉพาะอย่างยิ่งสิ่งสำคัญกับลูกอมล่าสุด)
  • เชื่อมต่อชื่อขนมเข้าด้วยกันเพื่อสร้างสตริงเอาต์พุต

ธรรมชาติของเมทริกซ์ของปัญหาทำให้ฉันคิดว่า R อาจมีช็อตที่นี่ แต่การตีความอัลกอริทึมที่ดีที่สุดที่ฉันทำได้คือ 211 ตัวอักษร:

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="")}

ungolfed:

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

Pyth, 29 ไบต์

นี้คือการแปลโดยตรงของฉันCJam answe R ใน Pyth

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

ลองออนไลน์ได้ที่นี่


มีเรื่องค่อนข้างยาวที่อยู่เบื้องหลังโซลูชันนี้และ @isaacg ช่วยฉันในการทำความเข้าใจภาษาใหม่นี้เป็นอย่างมาก

เป็นการดีที่นี่เป็นคำที่แน่นอนในการแปลคำศัพท์ของรหัส CJam ของฉัน ( 17 ไบต์ ):

oc/~kNN/zNo_/zZSz

ซึ่งหมายความว่า:

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

แต่น่าเศร้าที่ Python ไม่ส่งคืนสิ่งใดในการ+=โทรดังนั้นนั่นไม่ใช่รหัส Python ที่ถูกต้องดังนั้นรหัส Pyth ที่ไม่ถูกต้องเช่นเดียวกับใน Pyth แลมบ์ดาสามารถเป็นข้อความสั่งการส่งคืนได้เท่านั้น

จากนั้นฉันค้นหาวิธีการต่าง ๆ และในที่สุดก็พบว่า Python list.appendคืนNoneค่าซึ่งฉันสามารถใช้ได้ ทำให้รหัสเป็น ( 19 ไบต์ ):

oc/|aYNYN/zNo_/zZSz

ซึ่งหมายความว่า:

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

แต่เศร้าการสนับสนุนของa(ผนวก) ถูกลบออกจาก Pyth oและรุ่นที่ไม่ได้รับการสนับสนุนที่ไม่ได้มีการสนับสนุนสำหรับ

อัปเดต: aมีการเพิ่มการสนับสนุนใน Pyth แล้วดังนั้นโค้ด 19 ไบต์ด้านบนจะทำงานในคอมไพเลอร์ออนไลน์ แต่เนื่องจากนี่เป็นฟีเจอร์ใหม่ที่เพิ่มเข้ามาหลังจาก OP ฉันจึงไม่ใส่คะแนนของฉันและปล่อยให้ 29 byte code เป็นโซลูชันของฉัน

ดังนั้นฉันต้องพึ่งพา Python แบบดิบในกรณีนั้นทำให้รหัสเป็น

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)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.