Chồng quà Giáng sinh


21

Ai đó đã vội vàng xếp những món quà Giáng sinh, và nó khá lộn xộn:

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

Giống như, nghiêm túc, làm thế nào mà hiện tại hàng đầu thậm chí cân bằng. Nó có lẽ là một cái búa. Để ngăn tháp quà này không bị vỡ vụn, bạn phải sắp xếp lại các món quà để chúng xếp chồng đẹp mắt:

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

Những quy định

  • Mỗi món quà bao gồm một đầu và cuối của các =ký tự, và một hoặc nhiều hàng giữa, bao gồm hai hàng |cách nhau bởi các khoảng trắng. Chiều rộng của hiện tại là giống nhau trong tất cả các hàng của nó.
  • Không có dòng trống.
  • Các món quà liên tiếp sẽ chồng lên nhau trong ít nhất một cột.
  • Quà sẽ được xếp theo thứ tự chiều rộng giảm. Trong trường hợp cà vạt, món quà cao hơn nên đi bên dưới món quà phẳng hơn.
  • Quà nên được tập trung vào hiện tại bên dưới. Nếu hiện tại không thể được đặt chính xác ở trung tâm (vì sự khác biệt về chiều rộng là số lẻ), bạn có thể chọn một trong hai vị trí nằm giữa một nửa ký tự.
  • Bạn có thể hoặc không thể cho rằng đầu vào có một dòng mới duy nhất, nhưng vui lòng nêu giả định của bạn.
  • Giải pháp của bạn không phải làm việc cho một đầu vào trống, nhưng phải có khả năng xử lý một món quà duy nhất.
  • Bạn có thể viết một chương trình hoặc hàm, nhận đầu vào thông qua STDIN hoặc đối số hàm và trả về kết quả hoặc in nó sang STDOUT.
  • Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


15

CJam, 81 70 byte

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

Vì vậy, chúng ta phải xếp những món quà Giáng sinh? Mã này giống như một người thực tế sẽ làm * .

Đầu tiên , chúng tôi xếp tất cả các món quà vào tường để dễ dàng di chuyển chúng lên và xuống bằng mã này:

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

sau đó , chúng tôi xác định mỗi món quà là một mục riêng biệt bằng cách sử dụng mã này:

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

sau đó , chúng tôi sắp xếp các món quà dựa trên chiều cao và chiều rộng của chúng bằng mã này:

$

Cho đến bây giờ , tất cả những món quà đã được xếp chồng lên nhau để có sự liên kết hoàn hảo với nhau. Nhưng vì đây là Giáng sinh, chúng tôi muốn đặt những món quà được căn giữa như một cây thông Noel! Mã này thực hiện điều đó:

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

Đây là một bước đầu ra của mã ví dụ trong câu hỏi:

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

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

* Có thể khác nhau từ người này sang người khác: P


Thật tuyệt vời khi thứ tự từ điển tiêu chuẩn xảy ra để đáp ứng các yêu cầu sắp xếp! Bắt đẹp.
wchargein

@WChargin vâng. Tiết kiệm cho tôi một tấn byte!
Tối ưu hóa

3

Japt , 18 byte

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

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

Tôi sử dụng một chiến lược đủ khác với câu trả lời Japt khác mà tôi nghĩ rằng nó đáng để trả lời. Lấy đầu vào và đầu ra như một mảng các dòng

Giải trình:

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

Tôi không biết chính xác lý do tại sao "sắp xếp mặc định" hoạt động như vậy, nhưng tôi đã kiểm tra rằng hộp cao hơn của hai cái có cùng chiều rộng nằm ở phía dưới bất kể cái nào đến trước trong đầu vào.


1
Hãy tưởng tượng rằng chuỗi ngắn hơn được đệm đúng với một ký tự tưởng tượng có mã điểm -1 đến độ dài của chuỗi dài hơn.
Erik the Outgolfer 18/12/18

1
Thay thế "=="bằng '=²để tiết kiệm một byte.
Xù xì

2

Hồng ngọc, 164

Thử thách gọn gàng! Không thể làm cho nó xuống nhiều hơn nữa.

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

Giải trình

Đầu vào Stringđược cắt nhỏ thành một Arraynơi mà mỗi món quà là một yếu tố. Sau đó, mảng được sắp xếp theo số lượng ký tự ống và được sắp xếp lại theo số lượng dấu bằng.

Sau đó, nó loại bỏ tất cả các khoảng trắng hàng đầu và in từng dòng riêng lẻ, tập trung vào chiều rộng của hiện tại lớn nhất.

Nó hoạt động tương tự có hoặc không có dòng mới trên đầu vào.

Phiên bản dễ đọc

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 byte

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

-3 byte nhờ @ErikTheOutgolfer .

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

Giải trình:

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

Ghi chú:

  • Quà lẻ có chiều rộng được tập trung bên trái. Điều này có thể được thay đổi thành tập trung bên phải bằng cách thay đổi chữ thường cthành chữ hoa C.
  • Hàng đầu |có thể bị loại bỏ nếu chúng ta được phép lấy đầu vào làm danh sách các chuỗi.
  • Giả sử đầu vào không chứa khoảng trắng ở bất kỳ phần quà nào (tương tự như đầu vào trong phần mô tả thử thách); dòng mới theo dõi là tốt, vì |dù sao loại bỏ những cái đó.

1
20 byte . ðδÛcó thể được sử dụng thay vì εðÛ}ở đây, ¶'=.øgiống như …=\n=( \ncó nghĩa là dòng mới), 0'=.øgiống như …=0=.
Erik the Outgolfer 18/12/18

@EriktheOutgolfer Ah, tôi là một thằng ngốc khi sử dụng thay vì chuỗi 3 ký tự .. Và cảm ơn vì ðδÛ. Trên thực tế chưa bao giờ sử dụng δtrước đây và không có ý tưởng rằng nó hoạt động như vậy.
Kevin Cruijssen

1

Tùy viên , 91 byte

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

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

Ung dung

?? 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 byte

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)

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

Yêu cầu một chuỗi trích dẫn mà không theo dõi dòng mới làm đầu vào.

Không tuyệt vời, nhưng đó là điều tốt nhất tôi có thể làm.


0

Japt , 23 20 19 byte

Cách tiếp cận tương tự với giải pháp của Kevin . Byte đầu tiên có thể được loại bỏ nếu chúng ta có thể lấy đầu vào là một mảng các dòng.

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

Thử 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 byte 275 byte

Tôi là một người mới làm quen với môn đánh gôn, và không phải là một chuyên gia về javascript nhưng thử thách này rất thú vị và vui vẻ. Tôi muốn xem những thủ thuật mà một chuyên gia thực sự trong js sẽ sử dụng.

Giả định

  • Đầu vào và đầu ra là các chuỗi của chuỗi
  • Không có dòng trống ở bất cứ đâu
  • Chiều cao của một hộp là <= 99 dòng (điều này có làm tôi bị loại không)?
  • Các biến đầu vào và đầu ra được xác định trước, đầu ra ban đầu là một mảng trống

Đầu vào là trong g[]. Đầu ra trong 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)})});

Mã này hoạt động bởi

  1. xây dựng một mảng các đối tượng, mỗi đối tượng đại diện cho một hộp, có hai thành viên: K, một khóa sắp xếp là (chiều rộng x 100 + chiều cao) và O, một chuỗi các chuỗi (được cắt) tạo thành hộp. Trong khi xây dựng mảng, mã nhớ chiều rộng của hộp rộng nhất.

  2. Mảng các đối tượng hộp được sắp xếp theo thứ tự theo khóa K. Trong đó các hộp có cùng chiều rộng, khóa đảm bảo chúng được sắp xếp theo chiều cao.

  3. Sau khi sắp xếp các hộp, các chuỗi cho mỗi hộp được đẩy vào mảng đầu ra với các khoảng trắng hàng đầu được thêm vào, vị trí của hộp nằm ở giữa ô rộng nhất.

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

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.