크리스마스 선물 쌓기


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 예. 많은 바이트를 절약했습니다!
Optimizer

3

apt , 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이고 더 긴 문자열의 길이가있는 가상의 문자로 오른쪽이 채워 진다고 상상해보십시오.
Outgolfer Erik

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

설명

입력 StringArray각각의 존재가 요소 인 곳 으로 잘립니다 . 그런 다음 배열은 파이프 문자 수로 정렬되고 등호 수로 다시 정렬 됩니다 .

그런 다음 모든 선행 공백을 제거하고 가장 큰 현재 너비를 중심으로 각 줄을 개별적으로 인쇄합니다.

입력에 후행 줄 바꿈이 있거나없는 것과 동일하게 작동합니다.

읽을 수있는 버전

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

@ErikTheOutgolfer 덕분에 -3 바이트 .

온라인으로 사용해보십시오.

설명:

|         # 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=.
Erik the Outgolfer

@EriktheOutgolfer 아, 나는 문자 그대로 3 문자 문자열 대신 사용하는 바보입니다 . 그리고 감사합니다 ðδÛ. 실제로 δ이전에는 사용 된 적이 없으며 그렇게 작동하는지 전혀 몰랐습니다.
Kevin Cruijssen

1

첨부 , 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 바이트

Kevin의 솔루션에 대한 비슷한 접근 방식 . 입력 배열을 행으로 가져올 수 있으면 첫 번째 바이트를 제거 할 수 있습니다.

·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

자바 스크립트 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, (너비 x 100 + 높이) 정렬 키인 K, 상자를 구성하는 (잘린) 문자열의 배열 인 O입니다. 배열을 작성하는 동안 코드는 가장 넓은 상자의 너비를 기억합니다.

  2. 상자 객체의 배열은 키 K를 기준으로 정렬됩니다. 상자의 너비가 같은 경우 키의 높이를 기준으로 정렬합니다.

  3. 상자를 정렬 한 후 각 상자의 문자열이 선행 공백이 추가 된 출력 배열로 푸시되어 상자가 가장 넓은 가운데에 배치됩니다.

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.