Складіть різдвяні подарунки


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

Спробуйте його онлайн тут

* Можливо, люди залежать від людини: P


Це дивовижно, що стандартний лексикографічний порядок відповідає вимогам сортування! Гарний улов.
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 до довжини довшої.
Ерік Атголфер

1
Замініть "=="на, '=²щоб зберегти байт.
Кудлатий

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)

Примітки:

  • Подарунки непарної ширини централізовано ліворуч. Це можна змінити на правий фокус, змінивши нижній регістр cна верхній C.
  • Ведучі |можуть бути відхилені, якщо нам дозволено сприймати дані як список рядків рядків.
  • Припускає, що вхід не містить пробілів для жодного подарунка (подібний до входу в описі виклику); трейлінг нових рядків прекрасний, оскільки |видаляє їх все одно.

1
20 байт . ðδÛможе використовуватися замість εðÛ}тут, ¶'=.øте саме, що …=\n=( \nозначає новий рядок), 0'=.øте саме, що …=0=.
Ерік Аутгольфер

@EriktheOutgolfer О, я ідіот за використання замість буквальних 3-х рядкових рядків .. І спасибі за ðδÛ. Насправді ніколи δраніше не використовувався і не мав уявлення, що це працює так.
Кевін Круїссен

1

Attache , 91 байт

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

Спробуйте в Інтернеті!

Безумовно

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

Пітон 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 байт

Я - новачок, кодовий гольф, і не що інше, як експерт у JavaScript, але завдання цікаве та веселе. Я хотів би побачити, які трюки використає справжній експерт у 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, сортуючим ключем є (ширина х 100 + висота) та O, масив (обрізаних) рядків, що складають поле. Під час побудови масиву код запам'ятовує ширину самого широкого поля.

  2. Масив об’єктів коробки сортується за порядком за допомогою клавіші K. Якщо поля мають однакову ширину, ключ гарантує, що вони сортуються за висотою.

  3. Після сортування вікон рядки для кожного вікна висуваються у вихідний масив із доданими провідними пробілами, які розміщують поле центрально над самим широким.

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.