Noel Hediyelerini Yığın


21

Birisi acımasızca Noel hediyelerini istifliyor ve bu oldukça karışık.

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

Cidden, bu üst dengeyi nasıl sağlıyor? Muhtemelen bir çekiç. Bu hediye kulesinin çökmesini önlemek için, hediyeleri yeniden düzenleyerek güzel bir şekilde istiflenmelerini sağlayın:

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

Kurallar

  • Her hediye bir üst ve alt =karakterden ve iki |boşlukla ayrılmış bir veya daha fazla orta satırdan oluşur . Şimdiki genişlikte tüm satırlarda aynıdır.
  • Boş satır yok.
  • Ardışık hediyeler, en az bir sütunda üst üste binecektir.
  • Sunumlar azalan genişliğe göre istiflenmelidir. Beraberlik durumunda, uzun olan mevcut bülbülün altına düşmelidir.
  • Sunumlar, şimdiki zamanda ortalanmalıdır. Eğer hediye tam olarak merkeze yerleştirilemiyorsa (genişliklerdeki fark tuhaf olduğu için), merkezden yarım karakter uzakta olan herhangi bir pozisyonu seçebilirsiniz.
  • Girdide tek bir izleyen yeni satır olduğunu varsayabilir veya kabul edemezsiniz, ancak lütfen varsayımınızı belirtin.
  • Çözümünüz boş bir giriş için çalışmak zorunda değildir, ancak tek bir hediyeyi idare edebilmelidir.
  • STDIN veya function argümanı yoluyla giriş alan ve sonucu döndüren veya STDOUT'a yazdıran bir program veya işlev yazabilirsiniz.
  • Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

Yanıtlar:


15

CJam, 81 70 bayt

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

Yani Noel hediyelerini istiflemeliyiz? Bu kod gerçek bir kişinin yapacağı gibi yapar * .

Öncelikle , bu kodu kullanarak kolayca yukarı ve aşağı hareket ettirmek için tüm hediyeleri bir duvara yığıyoruz:

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

Daha sonra , bu kodu kullanarak her birimizi ayrı bir ürün olarak tanımlıyoruz:

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

sonra hediyeleri bu kodu kullanarak yükseklik ve genişliklerine göre sıralarız:

$

Şimdiye kadar , tüm hediyeler birbirleriyle mükemmel uyum sağlamak için bir duvara istiflendi. Ama bu Noel olduğu için, hediyeleri bir Noel ağacı gibi ortalanmış olarak yerleştirmek istiyoruz! Bu kod şunu yapar:

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

İşte soruda örneğin kodun çıktısını adım adım:

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

Burada çevrimiçi deneyin

* Yine de kişiden kişiye farklılık gösterebilir: P


Standart sözlükbilim sırasının sıralama koşullarını yerine getirmesi harika! İyi yakaladın.
wchargin

@WChargin evet. Bana bir sürü bayt kurtardı!
Doktor

3

Japt , 18 bayt

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

Çevrimiçi deneyin!

Diğer Japt cevabından yeterince farklı bir strateji kullanıyorum, kendi cevabına değeceğini düşündüm. Satır dizisi olarak girdi ve çıktıyı alır

Açıklama:

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

Tam olarak neden "varsayılan sıralama" nın böyle çalıştığını tam olarak bilmiyorum, ancak aynı genişlikte olan iki uzun boylu kutunun, girişte hangisinin önce geldiğine bakılmaksızın altta olduğunu test ettim .


1
Daha kısa olan dizginin, -1 olan kod uzunluğunun uzunluğuna kadar hayali bir karakterle sağ tarafa geldiğini hayal edin.
Outgolfer Erik

1
Bir bayt kaydetmek için "=="ile değiştirin '=².
Shaggy

2

Ruby, 164

Güzel bir meydan okuma! Daha fazla aşağı alamadım.

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

açıklama

Giriş String, Arrayher bir öğenin bir element olduğu bir parçaya bölünür . Ardından dizi, boru karakter sayısına göre sıralanır ve tekrar eşit işaret sayısına göre sıralanır .

Daha sonra tüm önde gelen boşlukları kaldırır ve her bir çizgiyi ayrı ayrı yazdırır, mevcut olan en geniş genişliğin ortasıyla.

Girişte izleyen yeni satır ile veya satırsız aynı şekilde davranır.

Okunabilir sürüm

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 bayt

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

@ErikTheOutgolfer sayesinde -3 bayt .

Çevrimiçi deneyin.

Açıklama:

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

Notlar:

  • Tuhaf genişlikteki hediyeler merkezde sol odaklı. Bu, takip eden küçük charfleri büyük harfe dönüştürerek sağ odaklı olarak değiştirilebilir C.
  • |Girdiyi dizge satırları listesi olarak almamıza izin verilirse, öncü bırakılabilir.
  • Girişin, hiçbir hediye için takip eden boşluk içermediğini varsayar (meydan okuma tanımındaki girişe benzer); Sondaki yeni satırlar gayet iyi, çünkü |bunları yine de siliyoruz.

1
20 bayt . burada ðδÛyerine kullanılabilir εðÛ},¶'=.ø aynıdır …=\n=( \n, aracı yeni satır) 0'=.øile aynıdır …=0=.
Outgolfer Erik

@EriktheOutgolfer Ah, değişmez 3 karakterli dizeler yerine kullanmak için aptalım .. Ve teşekkürler ðδÛ. Aslında daha δönce hiç kullanılmamış ve bu şekilde çalıştığını bilmiyordum.
Kevin Cruijssen

1

Ataşesi , 91 bayt

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

Çevrimiçi deneyin!

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 bayt

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)

Çevrimiçi deneyin!

Girdi olarak yeni satırları izlemeden alıntı bir dize bekler

Harika değil, ama yapabileceğimin en iyisi.


0

Japt , 23 20 19 bayt

Kevin'in çözümüne benzer bir yaklaşım . Girdiyi bir satır dizisi olarak alabilirsek, ilk bayt kaldırılabilir.

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

Dene

·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 bayt 275 bayt

Ben kod-golf acemi bir şey ve javascript bir uzman gibi bir şey değil ama zorluk ilginç ve eğlenceli. Js'de gerçek bir uzmanın hangi numaraları kullanacağını görmek istiyorum.

Varsayımlar

  • Girdi ve çıktı dizge dizileridir
  • Hiçbir yerde boş satır yok
  • Bir kutunun yüksekliği <= 99 satır (bu beni diskalifiye ediyor)?
  • Giriş ve çıkış değişkenleri önceden tanımlanmıştır, çıkış başlangıçta boş bir dizidir

kod

Giriş girildi g[]. Çıktı 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)})});

Kod ile çalışır

  1. bir nesneler dizisi oluşturmak, her biri bir kutuyu temsil etmek, iki üyeli: K, bir sıralama anahtarı (genişlik x 100 + yükseklik) ve O, kutuyu oluşturan (kesilmiş) dizelerin bir dizisidir. Dizi oluşturulurken kod en geniş kutunun genişliğini hatırlar.

  2. Kutu nesneleri dizisi K tuşu ile sıralanır. Kutuların aynı genişliğe sahip olması durumunda, anahtar yüksekliklerine göre sıralanmasını sağlar.

  3. Kutuları sıraladıktan sonra, her kutu için dizeler, kutuyu en geniş olanın üzerinde merkezi olarak konumlandıran ön boşluklar eklenmiş olarak çıktı dizisine itilir.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.