2 डी मुद्रित वस्तुओं की क्षमता का पता लगाएं


23

एक काल्पनिक 2D दुनिया में, किसी वस्तु के लिए 2 डी प्रिंटिंग निर्देशों का एक सेट पूर्णांक की सूची द्वारा प्रस्तुत किया जा सकता है:

1 4 2 1 1 2 5 3 4

प्रत्येक संख्या उस विशेष बिंदु पर वस्तु की ऊंचाई का प्रतिनिधित्व करती है। उपरोक्त सूची मुद्रित होने पर निम्न वस्तु का अनुवाद करती है:

      #
 #    # #
 #    ###
 ##  ####
#########

हम इसके बाद जितना हो सके उतना पानी भरते हैं, जिसके परिणामस्वरूप:

      #
 #~~~~#~#
 #~~~~###
 ##~~####
#########

हम वस्तु की क्षमता को परिभाषित करते हैं कि पानी की इकाइयाँ पूरी तरह से पूर्ण होने पर वस्तु को पकड़ सकती हैं; इस मामले में, 11।

सख्ती से बोलना, पानी की एक इकाई ( ~) एक स्थान पर मौजूद हो सकती है यदि और केवल अगर यह एक #ही पंक्ति में दो ठोस ब्लॉकों ( ) से घिरा हो ।

चुनौती

इनपुट (किसी भी प्रारूप में) के रूप में सकारात्मक पूर्णांक की एक सूची लें, और सूची के निर्देशों के रूप में उपयोग किए जाने पर छपी हुई वस्तु की क्षमता का उत्पादन करें।

आप मान सकते हैं कि सूची में कम से कम एक तत्व है और सभी तत्व 1 और 255 के बीच हैं।

परीक्षण के मामलों

+-----------------+--------+
|      Input      | Output |
+-----------------+--------+
| 1               |      0 |
| 1 3 255 1       |      0 |
| 6 2 1 1 2 6     |     18 |
| 2 1 3 1 5 1 7 1 |      7 |
| 2 1 3 1 7 1 7 1 |      9 |
| 5 2 1 3 1 2 5   |     16 |
| 80 80 67 71     |      4 |
+-----------------+--------+

जवाबों:


15

हास्केल, 54 बाइट्स

f l=(sum$zipWith min(scanl1 max l)$scanr1 max l)-sum l

भाव scanl1 max lऔर scanr1 max lगणना सूची के चल रहे अधिकतम आगे और पीछे की पढ़ने, यानी पानी के साथ साथ देश के प्रोफाइल अगर पानी एक ही दिशा प्रवाह जाना होगा।

orig:

      #
 #    # #
 #    ###
 ##  ####
#########

बाएं:

      #~~
 #~~~~#~#
 #~~~~###
 ##~~####
#########

सही:

~~~~~~#
~#~~~~#~#
~#~~~~###
~##~~####
#########

फिर, समग्र चित्र का प्रोफाइल इनमें से न्यूनतम है, जो उस दिशा में मेल खाता है जहां पानी या तो दिशा में लीक नहीं करता है।

न्यूनतम:

      #
 #~~~~#~#
 #~~~~###
 ##~~####
#########

अंत में, पानी की मात्रा इस सूची का योग है, जिसमें पानी और जमीन दोनों शामिल हैं, मूल सूची का योग शून्य है, जो केवल भूमि है।


9

जेली, 10 बाइट्स

U»\U«»\S_S

जबकि APL को कई कोष्ठक, और J दो-वर्ण प्रतीकों की आवश्यकता होती है, एल्गोरिथ्म जेली में सुंदर है।

     »\          Scan maximums left to right
U»\U             Scan maximums right to left
    «            Vectorized minimum
       S_S       Sum, subtract sum of input.

इसे यहाँ आज़माएँ ।


4

MATL , 14

मेरे मतलूब ने MATL का अनुवाद किया। xnor का एल्गोरिथ्म।

Y>GPY>P2$X<G-s

व्याख्या

Y>: cummax()(इनपुट स्टैक पर निहित है)

G: पुश इनपुट (फिर से)

P: flip()

Y>: cummax()

P: flip()

2$X<: min([],[])(दो-तर्क न्यूनतम)

G: पुश इनपुट (फिर से)

-: -

s: sum()


क्या MATL Matlab की प्रतिस्थापन भाषा है? क्या आप शीर्ष लेख में एक लिंक प्रदान कर सकते हैं?
Addison Crump

1
@FlagAsSpam मुझे लगता है कि यह उससे थोड़ा अधिक है: esolangs.org/wiki/MATL
मार्टिन

@ MartinBüttner क्या इसके लिए छद्मकोड मतलूब स्यूडोकोड के समान होगा? मैं सोच रहा था कि यह एक सीधे अनुवाद की बात है, बजाय एक चीज़ के आधार पर।
Addison Crump

1
@FlagAsSpam MATL स्टैक-आधारित है, इसलिए यह निश्चित रूप से एक सादा प्रतिस्थापन नहीं है।
मार्टिन एंडर

हां, यह सीधा अनुवाद है। MATLAB ऑपरेटरों और कार्यों के लिए एक से तीन चरित्र शॉर्टहैंड के साथ MATL स्टैक आधारित (रिवर्स पॉलिश नोटेशन) है । [ Github.com/lmendo/MATL/blob/master/doc/MATL_spec.ndf] देखें ।
रेनर पी।

3

डायलॉग एपीएल, 17 बाइट्स

+/⊢-⍨⌈\⌊⌽∘(⌈\⌽)

यह एक मोनैडिक ट्रेन है जो दाईं ओर इनपुट सरणी लेती है।

एल्गोरिथ्म बहुत हद तक एक्सनोर के समान है, हालांकि मैंने इसे स्वतंत्र रूप से पाया। यह दोनों दिशाओं में अधिकतम के लिए स्कैन करता है (पीछे की ओर सरणी को उल्टा करके, स्कैन करके, और फिर से उलट कर), और उन लोगों के वेक्टरयुक्त न्यूनतम को खोजता है। फिर यह मूल सरणी और रकम को घटाता है।

ऐसा करने का दूसरा तरीका प्रत्येक स्थान पर सरणी को विभाजित करना होगा, लेकिन यह अधिक लंबा है।

इसे यहाँ आज़माएँ ।


1
बिल्कुल वही जो मैं यहां लिखने आया था। :-) जब हमें डुअल (उर्फ अंडर) ऑपरेटर मिलता है, तो आप 3 बाइट बचा सकते हैं +/⊢-⍨⌈\⌊⌈\⍢⌽
आदम

2

मतलूब, ४l

इसके अलावा xnor के एल्गोरिथ्म का उपयोग करना।

@(x)sum(min(cummax(x),flip(cummax(flip(x))))-x)

1

MATLAB, 116 113 109 106 बाइट्स

n=input('');s=0;v=0;l=nnz(n);for i=1:l-1;a=n(i);w=min([s max(n(i+1:l))]);if a<w;v=v+w-a;else s=a;end;end;v

यह बाईं ओर उच्च बिंदु को संग्रहीत करके काम करता है, और प्रत्येक अगले बिंदु के माध्यम से पुनरावृत्ति करते हुए, उच्चतम बिंदु को दाईं ओर पाता है। यदि वर्तमान बिंदु दोनों उच्च बिंदुओं से कम है, तो यह संचयी मात्रा में न्यूनतम अंतर जोड़ता है।

अघोषित कोड:

inputArray = input('');
leftHighPoint = inputArray(1);
volume = 0;
numPoints = nnz(inputArray);

for i = 1:numPoints-1
    currentPoint = inputArray(i); % Current value
    lowestHigh = min([max(inputArray(i+1:numPoints)) leftHighPoint]);

    if currentPoint < lowestHigh
        volume = volume + lowestHigh - currentPoint;
    else 
        leftHighPoint = currentPoint;
    end
end
volume

पहली बार मैंने कुछ भी करने की कोशिश की है, MATLAB इसे करने के लिए सबसे अच्छा नहीं लगता ...।


0

ईएस 6, 101 बाइट्स

a=>(b=[],a.reduceRight((m,x,i)=>b[i]=m>x?m:x,0),r=m=0,a.map((x,i)=>r+=((m=x>m?x:m)<b[i]?m:b[i])-x),r)

@ Xnor's alghorithm का एक और पोर्ट।



0

पिप -l , 19 बाइट्स

$+J(ST0XgZD1`0.*0`)

कमांड-लाइन तर्कों के रूप में इनपुट नंबर लेता है। या, -rउन्हें स्टड की लाइनों के रूप में लेने के लिए ध्वज जोड़ें : इसे ऑनलाइन आज़माएं!

व्याख्या

अन्य सभी उत्तरों के विपरीत, पिप में वास्तव में ASCII- कला का निर्माण (संशोधित संस्करण) और जल इकाइयों की गणना करने के लिए कम था।

हम शुरुआत करते हैं g, तर्कों की सूची से।

[1 4 2 1 5 2 3]

0Xgके तार की एक सूची एन प्रत्येक के लिए शून्य n में g

[0 0000 00 0 00000 00 000]

ZD1फिर इन तारों को एक साथ जोड़ते हैं, 1जिसके परिणामस्वरूप आयताकार नेस्टेड सूची में किसी भी अंतराल को भरने के लिए:

[[0 0 0 0 0 0 0] [1 0 0 1 0 0 0] [1 0 1 1 0 1 0] [1 0 1 1 0 1 1] [1 1 1 1 0 1 1]]

STइस सूची को एक स्ट्रिंग में परिवर्तित करता है। -lध्वज को निर्दिष्ट है कि सूची के रूप में स्वरूपित हैं इस प्रकार है: हर नेस्टेड सूची एक विभाजक के बिना एक साथ शामिल हो गए है, और शीर्ष स्तर पर विभाजक न्यू लाइन है। तो हम इस बहुस्तरीय स्ट्रिंग को प्राप्त करते हैं - अनिवार्य रूप से, वस्तु का आरेख, लेकिन उल्टा:

0000000
1001000
1011010
1011011
1111011

हम तब रेगेक्स के सभी मैच पाते हैं `0.*0`। यह दो सबसे बाहरी दीवारों और उनके बीच की प्रत्येक रेखा पर मेल खाता है।

[0000000 001000 011010 0110]

Jइन तारों को एक साथ एक बड़ी स्ट्रिंग में जोड़ देता है, और $+इसे sums करता है, जिससे s की संख्या मिलती है 1- जो कि उस पानी की मात्रा के बराबर है जो वस्तु धारण कर सकती है।

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