क्रिसमस उपहारों का ढेर


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

इसे यहाँ ऑनलाइन आज़माएँ

* व्यक्ति से दूसरे व्यक्ति में भिन्न हो सकते हैं: पी


यह कमाल है कि मानक लेक्सिकोग्राफिक क्रम छँटाई आवश्यकताओं को पूरा करने के लिए होता है! अच्छा पकड़ा।
व्रचिनि

@Chargin हाँ। मुझे बाइट्स का एक टन बचाया!
ऑप्टिमाइज़र

3

जाप , 18 बाइट्स

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

इसे ऑनलाइन आज़माएं!

मैं अन्य जाप उत्तर से पर्याप्त रूप से अलग रणनीति का उपयोग करता हूं जो मुझे लगा कि यह अपने स्वयं के उत्तर के लायक था। एक पंक्ति के रूप में इनपुट और आउटपुट लेता है

स्पष्टीकरण:

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
  • |यदि हम इनपुट को स्ट्रिंग-लाइनों की सूची के रूप में लेने की अनुमति देते हैं तो अग्रणी को गिराया जा सकता है।
  • मान लेता है कि किसी भी प्रस्तुत के लिए कोई अनुगामी स्थान नहीं है (चुनौती विवरण में इनपुट के समान); अनुगामी newlines ठीक है, के बाद से |उन वैसे भी हटा देता है।

1
20 बाइट्स । यहाँ के ðδÛबजाय इस्तेमाल किया जा सकता εðÛ}है, के ¶'=.øरूप में ही है …=\n=( \nमतलब newline), के 0'=.øरूप में ही है …=0=
एरिक आउटोलॉफ़र

@EriktheOutgolfer आह, मैं शाब्दिक 3-चार तार के बजाय उपयोग करने के लिए एक बेवकूफ हूं .. और इसके लिए धन्यवाद ðδÛ। वास्तव में δपहले कभी इस्तेमाल नहीं किया गया था और यह पता नहीं था कि यह इस तरह काम करता है।
केविन क्रूज़सेन

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

पायथन 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)

इसे ऑनलाइन आज़माएं!

इनपुट के रूप में newlines अनुगामी बिना एक उद्धृत स्ट्रिंग की उम्मीद है।

महान नहीं है, लेकिन यह सबसे अच्छा मैं कर सकता हूं।


0

जाप , 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

जावास्क्रिप्ट 279 बाइट्स 275 बाइट्स

मैं कोड-गोल्फ के लिए नौसिखिया कुछ हूं, और जावास्क्रिप्ट में विशेषज्ञ की तरह कुछ भी नहीं, लेकिन चुनौती दिलचस्प और मजेदार है। मैं यह देखना चाहूंगा कि 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. बक्से को छांटने के बाद, प्रत्येक बॉक्स के लिए तार को आउटपुट सरणी में धकेल दिया जाता है, जिसमें प्रमुख स्थान जोड़े जाते हैं, जो बॉक्स को सबसे चौड़े पर केन्द्रित करता है।

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.