बाउल पाइल की गणना की ऊंचाई


19

बाउल पाइल ऊँचाई

इस पहेली का लक्ष्य कटोरे के ढेर की ऊंचाई की गणना करना है।

कटोरे का एक ढेर

एक कटोरे को मोटाई के बिना रेडियल सममित डिवाइस के रूप में परिभाषित किया गया है। इसका सिल्हूट आकार भी एक बहुपद है। स्टैक को रेडी की एक सूची द्वारा वर्णित किया गया है, प्रत्येक को एक बहुपद के साथ जोड़ा गया है, जिसे गुणांक की सूची के रूप में इनपुट के रूप में दिया गया है (उदाहरण के लिए सूची 3.1 4.2बहुपद 3.1एक्स2+4.2एक्स4 प्रतिनिधित्व करती है )।

बहुपद में मनमानी डिग्री हो सकती है। सादगी के लिए, ढेर की ऊंचाई को शीर्ष-सबसे कटोरे के केंद्र की ऊंचाई के रूप में परिभाषित किया गया है (उदाहरण के लिए उदाहरण 3 की साजिश देखें)।

परीक्षण के मामले प्रारूप में हैं radius:coeff1 coeff2 ...: प्रत्येक पंक्ति कटोरे की त्रिज्या का प्रतिनिधित्व करने वाली एक फ्लोट संख्या से शुरू होती है, इसके बाद बृहदान्त्र और एक अंतरिक्ष-पृथक सूची जिसमें सम शक्तियों के लिए गुणांक होते हैं, शक्ति 2 से शुरू होती है (शून्य स्थिर भाग निहित है) । उदाहरण के लिए, रेखा 2.3:3.1 4.2त्रिज्या का एक कटोरा 2.3और आकृति-बहुपद का वर्णन करती है 3.1 * x^2 + 4.2 * x^4

उदाहरण 1

42:3.141

शून्य ऊंचाई के ढेर का वर्णन करता है क्योंकि किसी भी कटोरे में कोई ऊंचाई नहीं होती है।

उदाहरण 2

1:1 2
1.2:5
1:3

ऊँचाई के ढेर का वर्णन करता है 2.0(भूखंड देखें)।

तीन कटोरे के ढेर का प्लॉट

उदाहरण 3

1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10

0.8 की ऊँचाई के ढेर का वर्णन करता है (भूखंड में हरे तीर देखें)।

तीन कटोरे के ढेर का प्लॉट

यह कोड गोल्फ है, इसलिए सबसे छोटा कोड जीतता है।

मेरे पास है संदर्भ कोड है

संपादित करें:

संदर्भ कार्यान्वयन बहुपत्नी की जड़ों की गणना करने के लिए एक पुस्तकालय पर निर्भर करता है। आप ऐसा कर सकते हैं लेकिन आपको इसकी आवश्यकता नहीं है। चूंकि संदर्भ कार्यान्वयन केवल एक (काफी अच्छा) संख्यात्मक सन्निकटन है, मैं किसी भी कोड को स्वीकार करूंगा जो सामान्य फ्लोटिंग-पॉइंट टॉलरेंस के भीतर सही परिणाम पैदा करता है।

<ε

इस पहेली का एक अन्य प्रकार कटोरे को फिर से व्यवस्थित करके ऊंचाई को कम करना है। मुझे यकीन नहीं है कि अगर कोई तेज़ समाधान है (मुझे लगता है कि यह एनपी-हार्ड है)। अगर किसी के पास एक बेहतर विचार है (या एनपी-पूर्णता साबित कर सकता है), तो कृपया मुझे बताएं!


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मेगो

आपके संदर्भ कोड में, मेरा मानना ​​है कि निकाय is_maximumउदाहरण के लिए होना चाहिए return evaluate(differentiate(shape_0), root) > 0.0। वर्तमान में, यह मूल का उपयोग करके मूल्यांकन करता है dd(आकृतियों के बीच के अंतर का व्युत्पन्न), जिसे हमेशा 0 (जड़ों के लिए) वापस करना चाहिए। फ्लोटिंग पॉइंट त्रुटियों के कारण, परिणाम कभी-कभी 0 के करीब सकारात्मक मूल्य होता है, यही कारण है कि कोड कुछ समय के लिए सही या अधिक सटीक परिणाम उत्पन्न करता है। इनपुट की जाँच करें 1:0.2, 1:0.1 0.2जो आउटपुट होना चाहिए0.0125
अतिरेक

@ नस्ल यह वास्तव में वैसे भी बेमानी है। अधिकतम y मान चुना गया है और 0 हमेशा तुलना मूल्यों में रहेगा।
निक केनेडी

2
उदाहरण 3 में, अंतिम ऊंचाई होनी चाहिए 0.801। अंतिम दो कटोरे त्रिज्या में स्पर्श करते हैं 0.1
अत्तिन

हां, मुझे वही परिणाम मिला।
जोएल

जवाबों:


6

जेली , ५४ 53 बाइट्स

J×$ÆrAƑƇ«⁹;⁹*€J{ḋ⁸ŻṀ
Œcz€0ḢṂç@I0;ⱮFƲƲ€ṚṁL’R€Ɗ;+Ṁ¥¥ƒ0Ṁ

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

एक विवादास्पद लिंक जो अपने तर्क के रूप में प्रारूप में ऊपर से नीचे तक कटोरे की सूची लेता है और शीर्ष कटोरे के नीचे [[b1_radius, b1_coef1, ...], [b2_radius, b2_coef1, ...]]की y स्थिति देता है।

अब सही ढंग से कटोरे को संभालता है जो न्यूनतम त्रिज्या के अलावा अन्य स्थानों पर मिलते हैं।

व्याख्या

सहायक लिंक: बाएं तर्क के रूप में लेता है l के में 1 ऊपर से कटोरे का प्रतिनिधित्व करने वाले बहुपद के गुणांक में अंतर है, और इसका सही तर्क rन्यूनतम त्रिज्या है; अधिकतम y मान लौटाता है जहाँ दो कटोरे मिलते हैं

  $                   | Following as a monad:
J                     | - Sequence from 1..<len(l)>
 ×                    | - Multiply (by l)
   Ær                 | Roots of polynomial
     AƑƇ              | Keep only those invariant when passed through absolute function (excludes negative, imaginary and complex numbers)
        «⁹            | Min of these filtered roots and r
          ;⁹          | Concatenate r to the list
            *€        | Each root/radius to the power of:
              J{      | - Sequence from 1..<len(l)>
                ḋ⁸    | Dot product with l
                  Ż   | Prepend zero
                   Ṁ  | Maximum

मुख्य लिंक, अपने तर्क के रूप में एक कटोरा ढेर लेता है और शीर्ष कटोरे के आधार का y मान देता है

Œc                               | Combinations length 2
  z€0                            | Transpose each using 0 as a filler
               Ʋ€                | For each one, do the following as a monad:
     Ḣ                           | - Take the head (the radii)     
      Ṃ                          | - Minimum
       ç@     Ʋ                  | - Call the helper link with this (min radius) as right argument and the following as left argument:
         I                       |   - Increments (difference between second and first polynomial for each coefficient)
          0;Ɱ                    |   - Prepend each with a zero (odd coefficients are all zero)
             F                   |   - Flatten
                 Ṛ               | Reverse
                  ṁ    Ɗ         | Mould to the following as a monad:
                   L             | Length
                    ’            | Decrease by 1
                     R€          | Range of each (e.g. [1],[1,2],[1,2,3],[1,2,3,4]
                            ¥ƒ0  | Reduce using the following as a dyad and starting with 0
                        ;  ¥     | - Concatenate the following as a dyad
                         +       |   - Add
                          Ṁ      |   - Take the maximum
                               Ṁ | Finally take the overall maximum

अजगर का संदर्भ

अंत में, यहाँ पायथन संदर्भ का एक TIO संस्करण है जिसे @pasbi ने मुख्य समस्या के लिए शामिल किया है। यह स्टड से पढ़ता है।


1
मुझे भाषा बिल्कुल समझ में नहीं आती। स्पष्टीकरण के आधार पर, ऐसा लगता है कि आप केवल प्रत्येक कटोरी जोड़ी (r1, p1)और (r2, p2)बिंदु पर तुलना करते हैं min(r1, r2)? यदि हां, तो यह एक गलत समाधान होगा क्योंकि दो कटोरे के बीच 0और छू सकते हैं min(r1, r2))। इसके लिए आपको max(p1(x)-p2(x), 0)पूरी रेंज [0, min(r1, r2)]ढूंढनी होगी x। यही कारण है कि @ pasbi का संदर्भ समाधान स्थानीय अधिकतम खोजने के लिए डेरिवेटिव की गणना करता है।
जोएल

@Joel अब तय किया गया। मूल परीक्षण मामलों में से सभी को छुआ min(r1, r2)। यह अब @ अटिनाट की अतिरिक्त चुनौती को हल करता है
निक कैनेडी

1
यदि आपके पास समय है तो उन लोगों के लिए कोड का एक टिप्पणी संस्करण देखना अच्छा होगा, जिन्हें गोल्फ भाषा का ज्ञान नहीं है।
जोएल

@Joel जब मुझे समय मिलेगा
निक केनेडी

2

पायथन 3 + सुन्न + स्किपी, 248 240 बाइट्स

from scipy.optimize import*
from numpy import*
def f(b,i=0):
 for r,c in b:p=zeros(2*len(c)+1);p[-3::-2]=c;p[-1]=h=max([0,*(-fminbound(lambda x:polyval(polysub(p,d),x),0,min(s,r),full_output=1)[1]for s,d in b[:i])]);b[i][1]=p;i+=1
 return h

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

-8 बाइट्स @xnor की बदौलत

फ़ंक्शन की सूची लेता है [radius, polynomial] इनपुट के रूप जोड़े और ढेर ऊंचाई देता है।

यह समाधान संदर्भ कोड के रूप में कम या ज्यादा एल्गोरिथ्म का उपयोग करता है सिवाय इसके कि यह अधिकतम उपयोग करने वाले डेरिवेटिव की गणना नहीं करता है। इस बीच, यह पायथन में अंतर्निहित numpyऔर scipyकार्यों का उपयोग करके लिखा गया है। अनलॉक्ड संस्करण को निम्नलिखित में दिखाया गया है। यह उन लोगों के लिए संदर्भ कोड के वैकल्पिक संस्करण के रूप में कार्य करता है जो इस विचार को जल्दी पकड़ने के लिए एक छोटा संस्करण चाहते हैं।

from scipy.optimize import fminbound
import numpy as np

def compute_pile_height(bowl_data):
    for i, (r, curve) in enumerate(bowl_data):
        distances = [0]  # Initialize the distances array with 0 as the lower bound for max
        # Construct a complete polynominal coefficient array
        curve_poly = np.zeros(2 * len(curve) + 1)
        curve_poly[-3::-2] = curve
        
        # Iterate over all bowls under the current bowl
        for j in range(i):
            b_r, b_curve_poly = bowl_data[j]

            # Calculate the difference polynominal between the current bowl and bowl j
            diff = np.polysub(curve_poly, b_curve_poly)

            # Find the maximum height difference between bowl j and the current bowl in the range [0, min(b_r, r)]
            max_height_diff = -fminbound(lambda x:np.polyval(diff, x), 0, min(b_r, r), full_output=True)[1]
            distances.append(max_height_diff)

        # Compute the maximum distance as the height for the current bowl, 
        # update the polynominal using the height as the constant coefficient
        curve_poly[-1] = height = max(distances)

        # Update stored data for the current bowl
        bowl_data[i][1] = curve_poly
    return height

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


व्हॉट्सएप पर सेव करने के लिए, आप कोलन के बाद पूरे लूप को उसकी लाइन पर रख सकते हैं, और i=0वैकल्पिक तर्क के रूप में डाल सकते हैं ।
xnor

@ एक्सनोर आह, धन्यवाद। मैंने इसे गोल्फ के लिए बहुत अधिक प्रयास नहीं किया क्योंकि 200 + बाइट समाधान में बाइट्स के एक जोड़े को बचाने से यह बहुत ज्यादा नहीं बदलेगा। और ऐसा लगता है कि इस के लिए कोई बेहतर एल्गोरिदम नहीं है जो गणना को सरल बना सके।
जोएल

तकनीकी रूप से इसे हेडर में Python3 + numpy + सिम्पी के रूप में वर्णित किया जाना चाहिए क्योंकि न तो आधार Python3 इंस्टॉल का हिस्सा है।
निक कैनेडी

@NickKennedy साभार विवरण अपडेट किया गया।
जोएल

1

वोल्फ्राम भाषा (गणितज्ञ) , 104 93 बाइट्स

FoldPair[{(R=#;F=#2)&@@#2;H=Max[0,{#2-F,0<x<#~Min~R}~MaxValue~x&@@@#],#~Join~{R|H+F}}&,{},#]&

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

{radius, polynomial}एक्स

प्रतीकात्मक आउटपुट के बजाय दशमलव के लिए, इसके बजाय का उपयोग करें NMaxValue(या केवल Nपरिणाम पर कॉल करें )।

(* Step through a list of bowls: *)
(* At each step, calls a function taking {previous-bowls-list},current-bowl *)
(*  which returns {height,{bowls-list}} *)
(* and returns the final height *)
FoldPair[
  (R=#;F=#2)&@@#2;          (*  extract Radius and Function*)
  {
    H=Max[0,                (*  Height - at least zero; the greatest of *)
      MaxValue[{#2-F,       (*   the required heights *)
          0<x<#~Min~R},x]   (*     within the relevant domain *)
      &@@@#]                (*   given all previous bowls *)
  ,
    #~Join~{R|H+F}          (*   append to list of bowls *)
  }&,
  {},                       (* initial list of bowls (empty) *)
  #                         (* list of bowls *)
]&

1

आर , 451 436 बाइट्स

function(x){x=c(x[1],x);a=rev(pmax(0,c(combn(x,2,function(y,z=sapply(y,"length<-",max(lengths(y)))){z[is.na(z)]=0
b=rep(0,2*(n=nrow(z)-1))
b[2*1:n]=e=z[-1,2]-z[-1,1]
b=b*1:(2*n)
while(!c(b,1)[1])b=b[-1]
b=rev(b)
s=`if`(length(b)>1,eigen(rbind(-(b/b[1])[-1],cbind(diag(length(b)-2),0)))$va,0)
max(outer(c(pmin(abs(s[s==abs(s)]),r<-min(z[1,])),r),2*1:n,`^`)%*%e)}))))
o={}
for(i in seq(a=x[-1])){o=c(o,max(c(0,o)+a[1:i+F]));F=F+i}
max(o)}

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

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

मोटे तौर पर मेरे जेली उत्तर के आर पोर्ट को बोलते हुए, हालांकि बेस आर के पास बहुपदों की जड़ों को खोजने के लिए कोई कार्य नहीं है, यह इस पद्धति का उपयोग करके पाया गया है polynom::solve.polynomial

ढेर के ऊपर से नीचे तक संख्यात्मक वैक्टर की सूची लेने वाला एक फ़ंक्शन।

15 बाइट बंद करने के लिए @RobinRyder का धन्यवाद!


मुझे यह सब समझ में नहीं आ रहा है कि यहाँ क्या हो रहा है (स्पष्टीकरण अच्छा होगा!), लेकिन यहाँ एक 436 बाइट संस्करण है
रॉबिन राइडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.