सुपरसेट की गणना करें


18

यहां आपका कार्य सरल है:

पूर्णांक सेटों की एक सूची को देखते हुए, सेट यूनियन ढूंढें। दूसरे शब्दों में, पूर्णांक सेटों की सबसे छोटी सूची पाते हैं जिसमें सेट की मूल सूची में सभी तत्व होते हैं (लेकिन कोई अन्य तत्व नहीं)। उदाहरण के लिए:

[1,5] and [3,9] becomes [1,9] as it contains all of the elements in both [1,5] and [3,9]
[1,3] and [5,9] stays as [1,3] and [5,9], because you don't want to include 4

रेंज नोटेशन का उपयोग करके सेट को नोट किया जाता है: [1,4]मतलब पूर्णांक 1,2,3,4। सेट अनबाउंड भी हो सकते हैं: [3,]सभी पूर्णांकों >= 3का [,-1]अर्थ है , और सभी पूर्णांकों का अर्थ है <= -1। यह गारंटी दी जाती है कि सीमा का पहला तत्व दूसरे से अधिक नहीं होगा।

आप स्ट्रिंग संकेतन में सेट लेने का विकल्प चुन सकते हैं, या आप 2-तत्व टुपल्स का उपयोग कर सकते हैं, "अनंत" मान के रूप में एक निरंतर गैर-पूर्णांक का उपयोग कर सकते हैं। आप अनंत ऊपरी सीमा और अनंत निचली सीमा का प्रतिनिधित्व करने के लिए दो अलग-अलग स्थिरांक का उपयोग कर सकते हैं। उदाहरण के लिए, जावास्क्रिप्ट में, आप [3,{}]सभी पूर्णांक को नोट करने के लिए उपयोग कर सकते हैं >= 3, जब तक कि आप {}सभी परीक्षण मामलों में लगातार उपयोग करते हैं।

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

[1,3]                     => [1,3]
[1,]                      => [1,]
[,9]                      => [,9]
[,]                       => [,]
[1,3],[4,9]               => [1,9]
[1,5],[8,9]               => [1,5],[8,9]
[1,5],[1,5]               => [1,5]
[1,5],[3,7]               => [1,7]
[-10,7],[1,5]             => [-10,7]
[1,1],[2,2],[3,3]         => [1,3]
[3,7],[1,5]               => [1,7]
[1,4],[8,]                => [1,4],[8,]
[1,4],[-1,]               => [-1,]
[1,4],[,5]                => [,5]
[1,4],[,-10]              => [1,4],[,-10]
[1,4],[,]                 => [,]
[1,4],[3,7],[8,9],[11,20] => [1,9],[11,20]

यह , इसलिए अपना उत्तर यथासंभव छोटा बनाएं!



1
क्या मैं Infinityइसके बजाय उपयोग कर सकता हूं {}?
लुइस फेलिप डी जेउस मुनोज

क्या हम फ्लोट वैल्यू के रूप में इनपुट ले सकते हैं, जैसे, के [1.0, 3.0]बजाय [1, 3]?
AdmBorkBork

जब तक आप उन्हें पूर्णांक मानते हैं, हाँ। दूसरे शब्दों में [1.0, 3.0], [4.0, 5.0]अभी भी बनना चाहिए[1.0, 5.0]
नाथन मेरिल

अपनी भाषा नहीं लेते हैं तो कर सकते हैं Infinityऔर -Infinityइनपुट के रूप में, यह लेने की अनुमति दी है -999999और 999999(या यहां तक कि बड़े / छोटे) के बजाय?
केविन क्रूज़सेन

जवाबों:


7

आर + intervals, 90 87 81 बाइट्स

function(...)t(reduce(Intervals(rbind(...),type="Z")))+c(1,-1)
library(intervals)

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

इनपुट अंतराल की एक सूची है। -Infऔर Infमाइनस / प्लस इन्फिनिटी के लिए आर बिल्ट-इन हैं। आउटपुट अंतराल के स्तंभों का एक मैट्रिक्स है।

आमतौर पर गैर-मानक पुस्तकालयों का उपयोग करने का प्रशंसक नहीं था लेकिन यह मजेदार था। टीआईओ ने intervalsस्थापित नहीं किया है। आप इसे अपनी स्थापना या https://rdrr.io/snippets/ पर आज़मा सकते हैं

intervalsपैकेज का समर्थन करता है वास्तविक और पूर्णांक ( type = "Z") अंतराल और reduceसमारोह है एक अंतर्निहित क्या चुनौती चाहता है, लेकिन उत्पादन हां, खुला अंतराल के लिए डिफ़ॉल्ट लगता है के लिए वांछित परिणाम प्राप्त करने के लिए की जरूरत है।close_intervals +c(1,-1)

पुराने संस्करण में सूचियों की सूची में उदाहरण थे जो सुविधाजनक हो सकते हैं इसलिए मैंने यहां लिंक छोड़ दिया है।


मुझे लगता है कि आप कुछ बाइट्स बचा सकते हैं function(...)close_intervals(reduce(Intervals(rbind(...),type="Z"))):। या इससे भी बेहतर आप ऑप से जांच कर सकते हैं कि क्या वे मैट्रिक्स को इनपुट के रूप में अनुमति देते हैं।
जेसीई

1
मैं सचमुच कल रात बिस्तर पर लेटा हुआ सोच रहा था "इनपुट वैक्टर से एक मैट्रिक्स बनाने का एक बेहतर तरीका होना चाहिए"। मुझे लगता है कि इनपुट के रूप में चुनौती बेहतर है। लेकिन इसमें reduceऔर Reduceवहां के लिए मजेदार था ।
एनसीएम

मुझे "डबल कम" चीज पसंद है! सिर्फ गोल्फ इतना ही नहीं;) इस तरह के खुले अंतराल को संशोधित करने के बारे में क्या f=function(...)t(reduce(Intervals(rbind(...),type="Z")))+c(1,-1):?
JayCe

6

जावास्क्रिप्ट (ईएस 6), 103 बाइट्स

@ बाइट के लिए 1 बाइट का धन्यवाद सहेजा @ केविनक्रूजसेन को
1 बाइट का धन्यवाद

+/-Infinityअनंत मूल्यों की अपेक्षा करता है।

a=>(a.sort(([p],[P])=>p-P).map(m=M=([p,q])=>p<M+2?M=q>M?q:M:(b.push([m,M]),m=p,M=q),b=[]),b[0]=[m,M],b)

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

कैसे?

हम सबसे पहले अंतराल को उनकी निचली सीमा से, सबसे कम से उच्चतम तक क्रमबद्ध करते हैं। ऊपरी सीमा की अनदेखी की जाती है।

हम तब छांटे गए अंतरालों [पीn,क्षn] पर पुनरावृत्ति करते हैं, जबकि क्रमशः निचले और ऊपरी सीमा मीटर और एम नज़र रखते हुए , क्रमशः पी1 और क्ष1 से प्रारंभ किया जाता है।

प्रत्येक अंतराल के लिए [पीn,क्षn] :

  • पीnएम+1एमअधिकतम(एम,क्षn)
  • [मीटर,एम]मीटरएमपीnक्षn

[मीटर,एम]

टिप्पणी की गई

a => (                  // a[] = input array
  a.sort(([p], [P]) =>  // sort the intervals by their lower bound; we do not care about
    p - P)              // the upper bounds for now
  .map(m = M =          // initialize m and M to non-numeric values
    ([p, q]) =>         // for each interval [p, q] in a[]:
    p < M + 2 ?         //   if M is a number and p is less than or equal to M + 1:
      M = q > M ? q : M //     update the maximum M to max(M, q)
    : (                 //   else (we've found a gap, or this is the 1st iteration):
      b.push([m, M]),   //     push the interval [m, M] in b[]
      m = p,            //     update the minimum m to p
      M = q             //     update the maximum M to q
    ),                  //
    b = []              //   start with b[] = empty array
  ),                    // end of map()
  b[0] = [m, M], b      // overwrite the 1st entry of b[] with the last interval [m, M]
)                       // and return the final result

p<=M+1हो सकता है p<M+2?
केविन क्रूज़सेन

@ केविनक्रूजसेन मुझे याद आया कि एक पूरी तरह से ... धन्यवाद!
अरनुलद

4

अजगर 2 , 118 113 112 111 106 105 104 101 बाइट्स

x=input()
x.sort();a=[];b,c=x[0]
for l,r in x:
 if l>c+1:a+=(b,c),;b,c=l,r
 c=max(c,r)
print[(b,c)]+a

Mr.Xcoder के लिए एक बाइट के लिए धन्यवाद, एक जोनाथन फ्रीच के लिए धन्यवाद, और तीन डेड पॉसम के लिए धन्यवाद।
इसे ऑनलाइन आज़माएं!


(b,c),एक बाइट बचाता है।
श्री Xcoder

हुह, सोचा था कि मैं पहले से ही कोशिश करूँगा।

क्या gइसका मतलब यह नहीं है कि आपका कार्य fपुन: प्रयोज्य नहीं है और इसलिए अमान्य है?
नील

@ नील शायद, लेकिन यह पहले के प्रयास से सिर्फ एक पकड़ था।

1
आप यह भी कर सकता है returnहो जाता हैprint एक और बाइट के लिए।
जोनाथन फ्रैच

2

रूबी , 89 76 बाइट्स

->a{[*a.sort.reduce{|s,y|s+=y;y[0]-s[-3]<2&&s[-3,3]=s.max;s}.each_slice(2)]}

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

सरणी को क्रमबद्ध करें, फिर पहले सभी श्रेणियों को जोड़कर समतल करें: यदि कोई सीमा पिछले एक को ओवरलैप करती है, तो पिछले 3 से 2 तत्वों को छोड़ दें (केवल अधिकतम रखते हुए)।

अंत में सब कुछ अनफ़्लैट करें।


1

पास्कल (एफपीसी) , 367 362 357 बाइट्स

uses math;type r=record a,b:real end;procedure d(a:array of r);var i,j:word;t:r;begin for i:=0to length(a)-1do for j:=0to i do if a[i].a<a[j].a then begin t:=a[i];a[i]:=a[j];a[j]:=t;end;j:=0;for i:=1to length(a)-1do if a[j].b>=a[i].a-1then begin a[j].a:=min(a[i].a,a[j].a);a[j].b:=max(a[i].b,a[j].b)end else j:=j+1;for i:=0to j do writeln(a[i].a,a[i].b)end;

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

एक प्रक्रिया जो 2 रेंज बाउंड्स से युक्त एक गतिशील सरणी रिकॉर्ड लेती है , वह जगह में सरणी को संशोधित करती है और फिर इसे मानक आउटपुट, प्रति पंक्ति एक सीमा पर लिखती है। (उस मुड़ वाक्य के लिए क्षमा करें।) 1/0ubounded के लिए उपयोग करता है और अनबाउंड के -1/0लिए।

पठनीय संस्करण

तत्वों की सही संख्या के साथ सरणी को वापस करना अच्छा होगा, लेकिन फ़ंक्शन / प्रक्रिया के लिए पारित गतिशील सरणी अब गतिशील सरणी नहीं है ... पहले मुझे यह मिला , फिर यह उत्कृष्ट, मन की व्याख्या है

यह सबसे अच्छा डेटा स्ट्रक्चर है जो मुझे कोड को छोटा करने के लिए मिला है। यदि आपके पास बेहतर विकल्प हैं, तो सुझाव देने के लिए स्वतंत्र महसूस करें।


1

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

List@@(#-{0,1}&/@IntervalUnion@@(Interval[#+{0,1}]&/@#))&

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

{a,b}अंतराल का प्रतिनिधित्व करने वाली सूचियों की सूची के रूप में इनपुट लेता है [a,b], जहां aहो सकता है -Infinityऔर bहो सकता है Infinity

बिल्ट-इन का उपयोग करता है IntervalUnion, लेकिन निश्चित रूप से हमें अंतराल को पहले आकार में मालिश करना होगा। यह बताने के लिए कि अंतराल पूर्णांक हैं, हम ऊपरी सीमा में 1 जोड़ते हैं (यह सुनिश्चित करना कि संघ [1,3]और [4,9]है [1,9])। अंत में, हम इस ऑपरेशन को पूर्ववत करते हैं, और परिणाम को सूची की सूची में बदल देते हैं।

वहाँ भी एक पूरी तरह से अलग दृष्टिकोण है, जो 73 बाइट्स में देखता है :

NumericalSort@#//.{x___,{a_,b_},{c_,d_},y___}/;b+1>=c:>{x,{a,b~Max~d},y}&

यहाँ, अंतरालों को छाँटने के बाद, हम बस दो बार के अंतराल को उनके संघ द्वारा प्रतिस्थापित करते हैं जब भी एक ही अंतराल होता है, और तब तक दोहराते हैं जब तक कि ऐसा कोई ऑपरेशन नहीं किया जाता है।


1

05AB1E (विरासत) , 88 79 78 बाइट्स

g≠i˜AKïDW<UZ>VIøεAXY‚Nè:}ïø{©˜¦2ôíÆ1›.œʒíεćsO_*}P}н€g®£εø©θàDYQiA}V®нßDXQiA}Y‚

इन्फिनिटी लोअरकेस वर्णमाला ( 'abcdefghijklmnopqrstuvwxyz') के रूप में इनपुट है ।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

महत्वपूर्ण नोट: यदि कोई वास्तविक Infinityऔर होता -Infinity, तो उसके बदले ४३ ४२ बाइट्स होते। तो थोड़ा 50 से अधिक% 30% के आसपास की कमी के लिए के रूप में काम के आसपास है Infinity..

{©Dg≠i˜¦2ôíÆ1›.œʒíεćsO_*}P}н€g®£εø©θàV®нßY‚

यह ऑनलाइन की कोशिश करो (साथ Infinityसाथ बदल दिया 9999999999और -Infinityसाथ प्रतिस्थापित -9999999999)।

निश्चित रूप से काफी हद तक गोल्फ हो सकता है। अंत में यह बहुत बदसूरत निकला, बहुत बदसूरत वर्कअराउंड से भरा। लेकिन अभी के लिए मुझे खुशी है कि यह काम कर रहा है।

स्पष्टीकरण:

Dgi          # If the length of the implicit input is NOT 1:
              #   i.e. [[1,3]] → length 1 → 0 (falsey)
              #   i.e. [[1,4],["a..z",-5],[3,7],[38,40],[8,9],[11,20],[25,"a..z"],[15,23]]
              #    → length 8 → 1 (truthy)
    ˜         #  Take the input implicit again, and flatten it
              #   i.e. [[1,4],["a..z",-5],[3,7],[38,40],[8,9],[11,20],[25,"a..z"],[15,23]]
              #    → [1,4,"a..z",-5,3,7,38,40,8,9,11,20,25,"a..z",15,23]
     AK       #  Remove the alphabet
              #   i.e. [1,4,"a..z",-5,3,7,38,40,8,9,11,20,25,"a..z",15,23]
              #    → ['1','4','-5','3','7','38','40','8','9','11','20','25','15','23']
       ï      #  Cast everything to an integer, because `K` turns them into strings..
              #   i.e. ['1','4','-5','3','7','38','40','8','9','11','20','25','15','23']
              #    → [1,4,-5,3,7,38,40,8,9,11,20,25,15,23]
        D     #  Duplicate it
         W<   #  Determine the min - 1
              #   i.e. [1,4,-5,3,7,38,40,8,9,11,20,25,15,23] → -5
           U  #  Pop and store it in variable `X`
         Z>   #  Determine the max + 1
              #   i.e. [1,4,-5,3,7,38,40,8,9,11,20,25,15,23] → 40
           V  #  Pop and store it in variable `Y`
Iø            #  Take the input again, and transpose/zip it (swapping rows and columns)
              #   i.e. [[1,4],["a..z",-5],[3,7],[38,40],[8,9],[11,20],[25,"a..z"],[15,23]]
              #    → [[1,'a..z',3,38,8,11,25,15],[4,-5,7,40,9,20,'a..z',23]]
  ε       }   #  Map both to:
   A          #   Push the lowercase alphabet
    XY       #   Push variables `X` and `Y`, and pair them into a list
       Nè     #   Index into this list, based on the index of the mapping
         :    #   Replace every alphabet with this min-1 or max+1
              #   i.e. [[1,'a..z',3,38,8,11,25,15],[4,-5,7,40,9,20,'a..z',23]]
              #    → [['1','-6','3','38','8','11','25','15'],['4','-5','7','40','9','20','41','23']]
ï             #  Cast everything to integers again, because `:` turns them into strings..
              #   i.e. [['1','-6','3','38','8','11','25','15'],['4','-5','7','40','9','20','41','23']]
              #    → [[1,-6,3,38,8,11,25,15],[4,-5,7,40,9,20,41,23]]
 ø            #  Now zip/transpose back again
              #   i.e. [[1,-6,3,38,8,11,25,15],[4,-5,7,40,9,20,41,23]]
              #    → [[1,4],[-6,-5],[3,7],[38,40],[8,9],[11,20],[25,41],[15,23]]
  {           #  Sort the pairs based on their lower range (the first number)
              #   i.e. [[1,4],[-6,-5],[3,7],[38,40],[8,9],[11,20],[25,41],[15,23]]
              #    → [[-6,-5],[1,4],[3,7],[8,9],[11,20],[15,23],[25,41],[38,40]]
   ©          #  Store it in the register (without popping)
˜             #  Flatten the list
              #   i.e. [[-6,-5],[1,4],[3,7],[8,9],[11,20],[15,23],[25,41],[38,40]]
              #    → [-6,-5,1,4,3,7,8,9,11,20,15,23,25,41,38,40]
 ¦            #  And remove the first item
              #   i.e. [-6,-5,1,4,3,7,8,9,11,20,15,23,25,41,38,40]
              #    → [-5,1,4,3,7,8,9,11,20,15,23,25,41,38,40]
  2ô          #  Then pair every two elements together
              #   i.e. [-5,1,4,3,7,8,9,11,20,15,23,25,41,38,40]
              #    → [[-5,1],[4,3],[7,8],[9,11],[20,15],[23,25],[41,38],[40]]
    í         #  Reverse each pair
              #   i.e. [[-5,1],[4,3],[7,8],[9,11],[20,15],[23,25],[41,38],[40]]
              #    → [[1,-5],[3,4],[8,7],[11,9],[15,20],[25,23],[38,41],[40]]
     Æ        #  Take the difference of each pair (by subtracting)
              #   i.e. [[1,-5],[3,4],[8,7],[11,9],[15,20],[25,23],[38,41],[40]]
              #    → [6,-1,1,2,-5,2,-3,40]
      1      #  Determine for each if they're larger than 1
              #   i.e. [6,-1,1,2,-5,2,-3,40] → [1,0,0,1,0,1,0,1]
            #  Create every possible partition of these values
              #   i.e. [1,0,0,1,0,1,0,1] → [[[1],[0],[0],[1],[0],[1],[0],[1]],
              #                             [[1],[0],[0],[1],[0],[1],[0,1]],
              #                             ...,
              #                             [[1,0,0,1,0,1,0],[1]],
              #                             [[1,0,0,1,0,1,0,1]]]
  ʒ         } #  Filter the partitions by:
   í          #   Reverse each inner partition
              #    i.e. [[1],[0,0,1],[0,1],[0,1]] → [[1],[1,0,0],[1,0],[1,0]]
    ε     }   #   Map each partition to:
     ć        #    Head extracted
              #     i.e. [1,0,0] → [0,0] and 1
              #     i.e. [1] → [] and 1
              #     i.e. [1,0,1] → [1,0] and 1
      s       #    Swap so the rest of the list is at the top of the stack again
       O      #    Take its sum
              #     i.e. [0,0] → 0
              #     i.e. [] → 0
              #     i.e. [1,0] → 1
        _     #    And check if it's exactly 0
              #     i.e. 0 → 1 (truthy)
              #     i.e. 1 → 0 (falsey)
         *    #    And multiply it with the extracted head
              #    (is only 1 when the partition has a single trailing 1 and everything else a 0)
              #     i.e. 1 and 1 → 1 (truthy)
              #     i.e. 1 and 0 → 0 (falsey)
           P  #   And check if all mapped partitions are 1
н             #  Take the head (there should only be one valid partition left)
              #   i.e. [[[1],[0,0,1],[0,1],[0,1]]] → [[1],[0,0,1],[0,1],[0,1]]
 g           #  Take the length of each inner list
              #   i.e. [[1],[0,0,1],[0,1],[0,1]] → [1,3,2,2]
   ®          #  Push the sorted pairs we've saved in the register earlier
    £         #  Split the pairs into sizes equal to the partition-lengths
              #   i.e. [1,3,2,2] and [[-6,-5],[1,4],[3,7],[8,9],[11,20],[15,23],[25,41],[38,40]]
              #    → [[[-6,-5]],[[1,4],[3,7],[8,9]],[[11,20],[15,23]],[[25,41],[38,40]]]
ε             #  Map each list of pairs to:
 ø            #   Zip/transpose (swapping rows and columns)
              #    i.e. [[1,4],[3,7],[8,9]] → [[1,3,8],[4,7,9]]
              #    i.e. [[25,41],[38,40]] → [[25,38],[41,40]]
  ©           #   Store it in the register
   θ          #   Take the last list (the ending ranges)
              #    i.e. [[25,38],[41,40]] → [41,40]
    à         #   And determine the max
              #    i.e. [41,40] → 41
     DYQi }   #   If this max is equal to variable `Y`
              #     i.e. 41 (`Y` = 41) → 1 (truthy)
         A    #    Replace it back to the lowercase alphabet
           V  #   Store this max in variable `Y`
  ®           #   Take the zipped list from the register again
   н          #   This time take the first list (the starting ranges)
              #    i.e. [[25,38],[41,40]] → [25,38]
    ß         #   And determine the min
              #    i.e. [25,38] → 25
     DXQi }   #   If this min is equal to variable `X`
              #     i.e. 25 (`X` = -6) → 0 (falsey)
         A    #    Replace it back to the lowercase alphabet
           Y #   And pair it up with variable `Y` (the max) to complete the mapping
              #    i.e. 25 and 'a..z' → [25,'a..z']
              #  Implicitly close the mapping (and output the result)
              #   i.e. [[[-6,-5]],[[1,4],[3,7],[8,9]],[[11,20],[15,23]],[[25,41],[38,40]]]
              #    → [['a..z',-5],[1,9],[11,23],[25,'a..z']]
              # Implicit else (only one pair in the input):
              #  Output the (implicit) input as is
              #   i.e. [[1,3]]

1

सी (क्लैंग) , 346 342 बाइट्स

संकलक झंडे -DP=printf("(%d,%d)\n", -DB=a[i+1]और-DA=a[i]

typedef struct{int a,b;}t;s(t**x,t**y){if((*x)->a>(*y)->a)return 1;else if((*x)->a<(*y)->a)return -1;}i;f(t**a){for(i=0;A;)i++;qsort(a,i,sizeof(t*),s);for(i=0;B;i++){if(B->a<=A->b+1){A->b=B->b;if(B->a<A->a)A->a=B->a;else B->a=A->a;}}for(i=0;A;i++){if(!B)break;if(A->a!=B->a)P,A->a,A->b);}P,A->a,A->b);}

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


मुझे लगता है कि आप iवैश्विक मूल्य पर भरोसा कर रहे हैं ।
जोनाथन फ्रीच

@JonathanFrech का अर्थ यह है कि वैश्विक स्तर पर इसके डिफ़ॉल्ट मान का उपयोग करने के बजाय, लूप में उपयोग करने से पहले इसे स्पष्ट रूप से सेट while(A)i++;किया जाना चाहिए । अब निश्चित रूप से क्यों नहीं, लेकिन यह मेटा नियमों के अनुसार आवश्यक है। मुख्य रूप से, क्योंकि विधि कॉल, IIRC के बीच वैश्विक मूल्यों को रीसेट करने के बिना तरीके आत्म-निहित / पुन: प्रयोज्य होने चाहिए। for(i=0;A;)i++;i=00
केविन क्रूज़सेन

वैश्विक iमूल्य पर निश्चित निर्भरता
लोगर्न सेप



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