กองของขวัญคริสต์มาส


21

ใครบางคนกำลังนำของขวัญวันคริสต์มาสมาวางซ้อนกันและมันค่อนข้างยุ่งเหยิง:

           ========================
           |                      |
           ========================
     =============
     |           |
     |           |
     |           |
     |           |
     |           |
     |           |
     =============
        =======
        |     |
        |     |
        |     |
        =======
  ===================
  |                 |
  |                 |
  |                 |
  ===================
=================
|               |
|               |
|               |
|               |
=================
   =======
   |     |
   |     |
   =======

เช่นเดียวกับที่จริงจังยอดนิยมในปัจจุบันมีความสมดุลอย่างไร อาจเป็นค้อน เพื่อป้องกันไม่ให้หอคอยของขวัญร่วนคุณต้องจัดลำดับของขวัญใหม่เพื่อที่จะได้จัดเรียงอย่างสวยงาม:

        =======
        |     |
        |     |
        =======
        =======
        |     |
        |     |
        |     |
        =======
     =============
     |           |
     |           |
     |           |
     |           |
     |           |
     |           |
     =============
   =================
   |               |
   |               |
   |               |
   |               |
   =================
  ===================
  |                 |
  |                 |
  |                 |
  ===================
========================
|                      |
========================

กฎระเบียบ

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

คำตอบ:


15

CJam, 81 70 ไบต์

'"qN/{__Sm0=#>}%N*"=
="/"=\"\"="*'"++~]$_W='=/,f{1$'=/,m4/\N/\f{S*\N}}

ดังนั้นเราต้องซ้อนของขวัญคริสต์มาส? รหัสนี้ไม่ได้เหมือนคนจริงจะทำ*

ก่อนอื่นเรานำของขวัญทั้งหมดมาวางติดกับกำแพงเพื่อเลื่อนขึ้นลงได้อย่างง่ายดายโดยใช้รหัสนี้:

'"qN/{__Sm0=#>}%N*

จากนั้นเราระบุแต่ละรายการเป็นรายการแยกต่างหากโดยใช้รหัสนี้:

"=
="/"=\"\"="*'"++~]

จากนั้นเราจัดเรียงของขวัญตามความสูงและความกว้างโดยใช้รหัสนี้:

$

จนถึงตอนนี้ของขวัญทั้งหมดได้ถูกเรียงซ้อนกับกำแพงเพื่อให้มีการจัดเรียงที่สมบูรณ์แบบซึ่งกันและกัน แต่เนื่องจากนี่คือคริสต์มาสเราต้องการวางของขวัญไว้ตรงกลางเหมือนต้นคริสต์มาส! รหัสนี้ทำอย่างนั้น:

_W=Af{1$Am4/\N/\f{S*\N}}

นี่คือตัวอย่างผลลัพธ์ของรหัสทีละขั้นตอนในคำถาม:

"Step 1 - Stack the presents against a wall";
========================
|                      |
========================
=============
|           |
|           |
|           |
|           |
|           |
|           |
=============
=======
|     |
|     |
|     |
=======
===================
|                 |
|                 |
|                 |
===================
=================
|               |
|               |
|               |
|               |
=================
=======
|     |
|     |
=======

"Step 2 - Identify the presents as a collection of presents";
["========================
|                      |
========================" "=============
|           |
|           |
|           |
|           |
|           |
|           |
=============" "=======
|     |
|     |
|     |
=======" "===================
|                 |
|                 |
|                 |
===================" "=================
|               |
|               |
|               |
|               |
=================" "=======
|     |
|     |
======="]

"Step 3 - Sort on height & width, with presents stacked against a wall to help sort them";
=======
|     |
|     |
=======
=======
|     |
|     |
|     |
=======
=============
|           |
|           |
|           |
|           |
|           |
|           |
=============
=================
|               |
|               |
|               |
|               |
=================
===================
|                 |
|                 |
|                 |
===================
========================
|                      |
========================

"Final step - stack them like a Christmas Tree";
        =======
        |     |
        |     |
        =======
        =======
        |     |
        |     |
        |     |
        =======
     =============
     |           |
     |           |
     |           |
     |           |
     |           |
     |           |
     =============
   =================
   |               |
   |               |
   |               |
   |               |
   =================
  ===================
  |                 |
  |                 |
  |                 |
  ===================
========================
|                      |
========================

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

* อาจแตกต่างจากคนสู่คนแม้ว่า:


มันยอดเยี่ยมมากที่คำสั่งพจนานุกรมมาตรฐานเกิดขึ้นเพื่อตอบสนองความต้องการในการเรียงลำดับ! รับได้สวย.
wchargin

@WChargin ใช่ บันทึกฉันทีละหนึ่งไบต์!
เครื่องมือเพิ่มประสิทธิภาพ

3

Japt , 18 ไบต์

mx óÈíY b'=²Ãn c û

ลองออนไลน์!

ฉันใช้กลยุทธ์ที่แตกต่างอย่างเพียงพอจากคำตอบ Japt อื่น ๆ ที่ฉันคิดว่ามันคุ้มค่ากับคำตอบของตัวเอง รับอินพุตและเอาต์พุตเป็นอาร์เรย์ของบรรทัด

คำอธิบาย:

mx                    #Trim leading whitespace from each line
   ó        Ã         #Split the array between lines where:
    ÈíY               # The lines interleaved (e.g. "abc","def" => "adbecf")
        b'=²          # starts with "=="
             n        #Default sorting for "array of arrays of strings"
               c      #Flatten to a single array of lines
                 û    #Pad each line so they are centered

ฉันไม่รู้ว่าทำไม "การจัดเรียงเริ่มต้น" จึงเป็นเช่นนั้น แต่ฉันได้ทดสอบว่ากล่องที่สูงกว่าของทั้งสองที่มีความกว้างเท่ากันนั้นอยู่ที่ด้านล่าง


1
ลองนึกภาพว่าสตริงที่สั้นกว่านั้นถูกทับด้วยอักขระจินตภาพที่มีรหัสจุด -1 ถึงความยาวของสตริงที่ยาวกว่า
Erik the Outgolfer

1
แทนที่"=="ด้วย'=²เพื่อบันทึกไบต์
Shaggy

2

ทับทิม, 164

ท้าทายมาก! ไม่สามารถทำให้มันลดลงไปอีกมาก

f=->x{y=x.scan(/\s+=+[\s|]+\s+=+/).sort_by{|p|-p.count(?|)}.sort_by{|p|p.count ?=}
y.map{|p|p.gsub(/^\s+/,'').each_line{|l|puts l.strip.center(y[-1].count(?=)/2)}}}

คำอธิบาย

อินพุตStringจะถูกสับเข้าไปในArrayตำแหน่งที่แต่ละปัจจุบันเป็นองค์ประกอบ จากนั้นอาร์เรย์จะถูกจัดเรียงตามจำนวนของอักขระไปป์และเรียงลำดับอีกครั้งตามจำนวนเครื่องหมายเท่ากับ

จากนั้นจะลบช่องว่างนำทั้งหมดและพิมพ์แต่ละบรรทัดแยกกันโดยมีศูนย์กลางอยู่ที่ความกว้างของของขวัญที่ใหญ่ที่สุด

มันจะทำงานแบบเดียวกันโดยมีหรือไม่มีบรรทัดใหม่ต่อท้ายบนอินพุต

เวอร์ชันที่อ่านได้

f = lambda do |x|
  y = x.scan(/\s+=+[\s|]+\s+=+/)
       .sort_by { |p| -p.count("|") }
       .sort_by { |p|  p.count("=") }

  y.map do |p|
    p.gsub(/^\s+/,'').each_line do |l|
      puts l.strip.center(y.last.count("=") / 2 )
    end
  end
end

1

05AB1E , 23 20 ไบต์

|ðδÛ»…=
=…=0=:0¡{».c

-3 ไบต์ขอบคุณที่@ErikTheOutgolfer

ลองออนไลน์

คำอธิบาย:

|         # Take the input split by newlines
 ðδÛ      # Remove leading spaces from each line
    »     # And join everything back together again with a newline delimiter
…=
=         # Push string "=\n="
 …=0=     # Push string "=0="
     :    # Replace all "=\n=" with "=0="
0¡        # Now split on "0"
          # (We now have our list of presents without any leading spaces)
  {       # Sort this list (with default string-wise sorting)
   »      # Join the list of presents by newlines
    .c    # Left-focused centralize the string (and output implicitly)

หมายเหตุ:

  • ของขวัญที่มีความกว้างแปลก ๆ จะเน้นที่ศูนย์กลางจากด้านซ้าย นี้สามารถเปลี่ยนแปลงไปทางขวาที่มุ่งเน้นโดยการเปลี่ยนเป็นตัวพิมพ์เล็กลากไปยังตัวพิมพ์ใหญ่cC
  • ส่วนนำ|สามารถถูกดร็อปถ้าเราได้รับอนุญาตให้รับอินพุตเป็นรายการของสายอักขระ
  • ถือว่าอินพุตไม่มีช่องว่างต่อท้ายสำหรับของขวัญใด ๆ (คล้ายกับอินพุตในคำอธิบายการท้าทาย); การขึ้นบรรทัดใหม่นั้นไม่เป็นไรเนื่องจาก|จะลบบรรทัดเหล่านั้นออกไป

1
20 ไบต์ ðδÛสามารถใช้แทนของεðÛ}ที่นี่¶'=.øเป็นเช่นเดียวกับ…=\n=( \nวิธีการขึ้นบรรทัดใหม่) เป็นเช่นเดียวกับ0'=.ø …=0=
Erik the Outgolfer

@EriktheOutgolfer อาผมเป็นคนบ้าที่ใช้แทนตัวอักษรสตริง 3 ถ่าน .. ðδÛและขอบคุณสำหรับ จริงๆแล้วไม่เคยใช้มาδก่อนและไม่รู้ว่ามันใช้งานได้จริง
Kevin Cruijssen

1

ผู้ช่วยทูต , 91 ไบต์

Join&lf@{Center&#(_@-1@0)@>_}@{SortBy[&{#_'#__},Strip@>Lines=>Split[_,/"(?<==)\\s+(?==)"]]}

ลองออนไลน์!

Ungolfed

?? returns [length of first entry, number of entries]
revDim := &{#_'#__}

?? regex
SPLIT_ON_BARRIERS := /"(?<==)\\s+(?==)"

splitPresents[str] := (
    chopped .= Split[str, SPLIT_ON_BARRIERS];;
    normalized .= Strip @> Lines => chopped
)

orderPresents[presents] :=
    SortBy[revDim, presents]

fixPresents[ordered] := (
    ?? number of columns of bottom-most present
    pad_size .= Size[Last[ordered][0]];;
    ?? center each line of each present
    Center&pad_size @> _
)

joinNewlines := Join&lf

stackPresents := joinNewlines@fixPresents@orderPresents@splitPresents


0

Python 2 , 221 196 ไบต์

s,a,b,i=[c.strip()for c in input().split("\n")]+["="],[],[],0
exec"a+=[s[i].center(max(map(len,s)))]\nif s[i][0]==s[i+1][0]=='=':b+=[a];a=[]\ni+=1;"*(len(s)-1)
for c in sorted(b):print"\n".join(c)

ลองออนไลน์!

คาดหวังสตริงที่เสนอราคาโดยไม่มีการขึ้นบรรทัดใหม่เป็นอินพุต

ไม่ดี แต่เป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้


0

Japté , 23 20 19 ไบต์

วิธีการคล้ายกับวิธีการแก้ปัญหาของเควิน ไบต์แรกสามารถลบได้ถ้าเราสามารถรับอินพุตเป็นอาร์เรย์ของเส้น

·mx ·r¥¬·È·Ãq, n ·û

ลองมัน

·mx ·r¥¬·È·Ãq, n ·û     :Implicit input of string
·                       :Split on newlines
 m                      :Map
  x                     :  Trim
    ·                   :Join with newlines
     r                  :Global replace
      ¥                 :  Shortcut for the == operator. Passing an operator as the first argument of a method in Japt implicitly converts it to a string
       ¬                :  Split
        ·               :  Join with newlines, giving the string "=\n=" to be replaced
         È              :  Pass each match through a function
          ·             :    Split on newlines. As we're working within a string, the resulting array gets cast to a string (i.e., "=\n=" -> ["=","="] -> "=,="
           Ã            :End replace
            q,          :Split on ","
               n        :Sort
                 ·      :Join with newlines
                  û     :Centre pad each line with spaces to the length of the longest

0

Javascript 279 ไบต์ 275 bytes

ฉันเป็นนักเล่นกอล์ฟมือใหม่ที่ไม่ได้เป็นผู้เชี่ยวชาญในจาวาสคริปต์ แต่ความท้าทายก็น่าสนใจและสนุก ฉันต้องการจะดูว่าเทคนิคจริงของผู้เชี่ยวชาญใน js จะใช้อะไร

สมมติฐาน

  • อินพุตและเอาต์พุตเป็นอาร์เรย์ของสตริง
  • ไม่มีบรรทัดว่างที่ใดก็ได้
  • ความสูงของกล่องคือ <= 99 บรรทัด (สิ่งนี้ทำให้ฉันไม่เหมาะสม) หรือไม่?
  • ตัวแปรอินพุตและเอาต์พุตถูกกำหนดไว้ล่วงหน้าโดยเอาต์พุตเป็นอาร์เรย์ว่างในตอนแรก

รหัส

g[]การป้อนข้อมูลที่อยู่ใน m[]เอาท์พุท

a=[];s='';b=0;c=0;o=[];g.forEach((t,x)=>{t=t.trim(),c=Math.max(c,t.length);o.push(t);if(s==''){s=t;b=x}else{if(t==s){a.push({"K":s.length*100+x-b,"O":o});s='';o=[]}}});a.sort((p,q)=>{return p.K-q.K});a.forEach((t)=>{t.O.forEach((q)=>{m.push(" ".repeat((c-q.length)/2)+q)})});

รหัสทำงานโดย

  1. การสร้างอาร์เรย์ของวัตถุแต่ละวัตถุที่เป็นตัวแทนหนึ่งกล่องโดยมีสมาชิกสองคนคือ K คีย์การเรียงลำดับคือ (ความกว้าง x 100 + ความสูง) และ O ซึ่งเป็นอาร์เรย์ของสตริง (ตัดแต่ง) ที่ประกอบขึ้นเป็นกล่อง ในขณะที่สร้างอาร์เรย์รหัสจะจดจำความกว้างของกล่องที่กว้างที่สุด

  2. อาร์เรย์ของวัตถุกล่องถูกจัดเรียงตามลำดับโดยคีย์ K โดยที่กล่องมีความกว้างเท่ากันคีย์จะตรวจสอบให้แน่ใจว่าเรียงลำดับตามความสูง

  3. หลังจากเรียงลำดับกล่องสตริงสำหรับแต่ละกล่องจะถูกส่งไปยังอาร์เรย์เอาต์พุตโดยเพิ่มช่องว่างนำหน้าซึ่งวางตำแหน่งของกล่องไว้ตรงกลางที่กว้างที่สุด

ลองออนไลน์!

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