एक बनाने के लिए एक ले लो


23

चुनौती

सकारात्मक पूर्णांकों की सूची को देखते हुए, यह पता लगाएं कि क्या एक क्रमपरिवर्तन मौजूद है जहां पूर्णांक के प्रत्येक से एक बिट तक ले जा रहा है, सभी 1एस से मिलकर एक द्विआधारी संख्या बनाई जा सकती है।

परिणामी बाइनरी संख्या में बिट्स की संख्या पूर्णांक की सूची में उच्चतम एमएसबी के बराबर है ।

उत्पादन

यदि आपके पास इस तरह का क्रमपरिवर्तन मौजूद है, तो आपके कोड को एक सत्य / गलत मूल्य को आउटपुट या वापस करना होगा ।

उदाहरण

Truthy:

सूची [4, 5, 2], और इसके बाइनरी प्रतिनिधित्व के साथ [100, 101, 10], हम बनाने के लिए क्रमशः तीसरे, पहले और दूसरे बिट्स का उपयोग कर सकते हैं 111:

4  ->  100  ->  100  ->  1
5  ->  101  ->  101  ->    1
2  ->  010  ->  010  ->   1
Result                   111

सूची के साथ [3, 3, 3], सभी संख्याओं में पहले और दूसरे दोनों बिट्स सेट होते हैं 1, इसलिए हम अपनी संख्या को अतिरिक्त संख्या में ले जा सकते हैं:

3  ->  11  ->  11  ->  1
3  ->  11  ->  11  ->   1
3  ->  11  ->  11  ->
Result                 11

Falsey:

सूची के साथ [4, 6, 2], किसी भी संख्या में पहला बिट सेट नहीं है 1, इसलिए बाइनरी नंबर नहीं बनाया जा सकता है:

4  ->  100
6  ->  110
2  ->  010

सूची के साथ [1, 7, 1], केवल एक संख्या में दूसरे और तीसरे बिट सेट हैं 1, और संख्या नहीं बनाई जा सकती है:

1  ->  001
7  ->  111
1  ->  001

जाहिर है, यदि सेट बिट्स की अधिकतम संख्या पूर्णांक की संख्या से अधिक है, तो परिणाम संख्या कभी भी नहीं बनाई जा सकती है।

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

Truthy:

[1]
[1, 2]
[3, 3]
[3, 3, 3]
[4, 5, 2]
[1, 1, 1, 1]
[15, 15, 15, 15]
[52, 114, 61, 19, 73, 54, 83, 29]
[231, 92, 39, 210, 187, 101, 78, 39]

Falsey:

[2]
[2, 2]
[4, 6, 2]
[1, 7, 1]
[15, 15, 15]
[1, 15, 3, 1]
[13, 83, 86, 29, 8, 87, 26, 21]
[154, 19, 141, 28, 27, 6, 18, 137]

नियम

मानक खामियों को मना किया जाता है। जैसा कि यह , सबसे छोटी प्रविष्टि जीतती है!


वहाँ एक प्रमेय है कि इस के साथ मदद कर सकता है ...
एक पेड़

PPCG में आपका स्वागत है! अच्छी पहली चुनौती!
मिस्टर एक्सकोडर

@नोट्री: अच्छा, कितना अच्छा। मुझे पत्नी खोजने के लिए मैं सबसे छोटे कोड का उपयोग कर सकता हूं।
एंटि .29

Bipartite मिलान के रूप में ग्राफ की समस्याओं के मेरे सूचकांक में जोड़ा गया।
पीटर टेलर

जवाबों:


8

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

BUT€ŒpṬz0PẸ

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

यह काम किस प्रकार करता है

BUT€ŒpṬz0PẸ  Main link. Argument: A (array)

             Example: A = [4, 5, 2]
B            Binary; convert each n in A to base 2.
                      [[1, 0, 0], [1, 0, 1], [1, 0]]
 U           Upend; reverse all arrays of binary digits.
                      [[0, 0, 1], [1, 0, 1], [0, 1]]
  T€         Truth each; for each binary array, get all indices of 1's.
                      [[3], [1, 3], [2]]
    Œp       Take the Cartesian product of all index arrays.
                      [[3, 1, 2], [3, 3, 2]
      Ṭ      Untruth; map each index array to a binary arrays with 1's at
             at the specified indices.
                      [[1, 1, 1], [0, 1, 1]]
       z0    Zip/transpose the resulting 2D array, filling shorter rows with 0's.
                      [[1, 0], [1, 1], [1, 1]]
         P   Take the columnwise product.
                      [1, 0]
          Ẹ  Any; yield 1 if any of the products is non-zero, 0 otherwise.
                      1

7

जे , 30 बाइट्स

सारा श्रेय मेरे सहयोगी मार्शल को जाता है ।

अनाम: उपसर्ग समारोह उपसर्ग।

[:+./ .*(1->./@${.|:)^:2@|:@#:

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

( @समारोह रचना है)

#: antibase -2

|: पक्षांतरित

()^:2 दो बार निम्न फ़ंक्शन लागू करें:

1- बूलियन नकारात्मक

>./ अधिकतम

@ का

$ अक्ष लंबाई

{. ले (शून्य से पैडिंग) से

|: प्रत्यारोपित तर्क

+./ .*"पागल दृढ़ जादू" *

[: हुक न करें (नो-ऑप - शेष भाग के साथ पिछले भाग की रचना करता है)


* मार्शल के शब्दों में।


6

जावास्क्रिप्ट (ईएस 6), 104 ... 93 83 बाइट्स

लौटाता है 0या 1

f=(a,m=Math.max(...a),s=1)=>s>m|a.some((n,i)=>n&s&&f(b=[...a],m,s*2,b.splice(i,1)))

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

तरीका

इनपुट सरणी को देखते हुए एक = [एक 0 , एक 1 , ..., एक एन 1 ] , हम एक क्रमचय के लिए देखो [एक पी [0] , एक पी [1] , ..., एक पी [N- 1] ] की एक और एक पूर्णांक एक्स ≤ एन ऐसी है कि:

  • s = 1 + (a p [0] और 2 0 ) + (a p [1] AND 2 1 ) + ... + (a p [x-1] और 2 x-1 ) = 2 x
  • और s , A के सबसे बड़े तत्व m से बड़ा है

प्रारूपित और टिप्पणी की गई

f = (                 // f = recursive function taking:
  a,                  //   - a = array
  m = Math.max(...a), //   - m = greatest element in a
  s = 1               //   - s = current power of 2, starting at 1
) =>                  //
  s > m               // success condition (see above) which is
  |                   // OR'd with the result of this some():
  a.some((n, i) =>    // for each element n at position i in a:
    n & s &&          //   provided that the expected bit is set in n,
    f(                //   do a recursive call with:
      b = [...a],     //     b = copy of a
      m,              //     m unchanged
      s * 2,          //     s = next power of 2
      b.splice(i, 1)  //     the current element removed from b
    )                 //   end of recursive call
  )                   // end of some()

4

भूसी , 14 बाइट्स

SöV≡ŀToṁ∂Pmo↔ḋ

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

व्याख्या

SöV≡ŀToṁ∂Pmo↔ḋ  Implicit input, say [4,5,2].
          m  ḋ  Convert each to binary
           o↔   and reverse them: x = [[0,0,1],[1,0,1],[0,1]]
         P      Take all permutations of x
      oṁ∂       and enumerate their anti-diagonals in y = [[0],[0,1],[1,0,0],[1,1],[1]..
S    T          Transpose x: [[0,1,0],[0,0,1],[1,1]]
    ŀ           Take the range up to its length: z = [1,2,3]
                Then z is as long as the longest list in x.
 öV             Return the 1-based index of the first element of y
   ≡            that has the same length and same distribution of truthy values as z,
                i.e. is [1,1,1]. If one doesn't exist, return 0.

4

05AB1E , 23 22 20 बाइट्स

-1 बाइट मिस्टरकोड के लिए धन्यवाद

सत्य: १, मिथ्या: ०

2вí0ζœεvyƶNè})DgLQ}Z

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

स्पष्टीकरण:

2вí0ζœεvyƶNè})DgLQ}Z   Full program (implicit input, e.g. [4, 6, 2])
2в                     Convert each to binary ([1,0,0], [1,1,0], [1,0])
  í                    Reverse each ([0,0,1], [0,1,1], [0,1])
   0ζ                  Zip with 0 as a filler ([0,0,0],[0,1,1],[1,1,0])
     œ                 Get all sublists permutations
      ε           }    Apply on each permutation...
       vyƶNè}            For each sublist...
        yƶ                  Multiply each element by its index
          Nè                Get the element at position == sublist index
             )           Wrap the result in a list
              DgLQ       1 if equal to [1,2,...,length of item]
                   Z   Get max item of the list (1 if at least 1 permutations fill the conditions)
                       -- implicit output

3

वोल्फ्राम लैंग्वेज (मैथमेटिका) , 65 बाइट्स

Max[Tr/@Permutations[n=PadLeft[#~IntegerDigits~2]]]==Tr[1^#&@@n]&

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

व्याख्या

#~IntegerDigits~2

हम सभी इनपुट को बाइनरी सूचियों में परिवर्तित करके शुरू करते हैं।

n=PadLeft[...]

फिर हम सरणी आयताकार बनाने के लिए उन सभी सूचियों को शून्य से बाईं ओर पैड करते हैं। परिणाम nबाद के लिए संग्रहीत किया जाता है ।

Permutations[...]

हाँ, जानवर बल, चलो इनपुट के सभी संभव क्रमांकन प्राप्त करें।

Tr/@...

यह प्रत्येक क्रमपरिवर्तन के लिए ट्रेस प्राप्त करता है, अर्थात क्रमपरिवर्तन में विकर्ण तत्वों का योग। दूसरे शब्दों में, हम पहले नंबर से MSB को जोड़ते हैं, दूसरे नंबर से MS-to को। यदि क्रमपरिवर्तन वैध है, तो ये सभी 1 होंगे और कई 1 होंगे सबसे बड़ा इनपुट नंबर चौड़ा s ।

Max[...]

हमें अधिकतम ट्रेस मिलता है, क्योंकि ट्रेस कभी भी वैध परमिट से अधिक नहीं हो सकता है ।

...==Tr[1^#&@@n]

दाहिने हाथ की ओर सिर्फ एक गोल्फ संस्करण है Length @ First @ n, यानी इसे आयताकार सरणी की चौड़ाई मिलती है, और इसलिए सबसे बड़ी इनपुट संख्या की चौड़ाई। हम यह सुनिश्चित करना चाहते हैं कि कुछ क्रमचय का निशान इसके बराबर हो।


3

PHP, 255 243 160 बाइट्स

-12 बाइट्स,
टाइटस के लिए छँटाई -83 बाइट्स (!) को निकाला

<?function f($a,$v=NULL,$b=[]){($v=$v??(1<<log(max($a),2)+1)-1)||die("1");if($p=array_pop($a))while($p-=$i)($b[$i=1<<log($p,2)]|$v<$i)||f($a,$v-$i,[$i=>1]+$b);}

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

सत्य के लिए 1 प्रिंट, झूठी के लिए कुछ भी नहीं।

मूल संस्करण ungolfed:

<?php
unset($argv[0]);                                                   // remove filename from arguments
$max = pow(2,floor(log(max($argv),2))+1)-1;                        // get target number (all bits set to 1)
solve($argv,$max,[]);
function solve($array,$value,$bits){
  if(!$value){                                                     // if we've reached our target number (actually subtracted it to zero)
    die("1");                                                      // print truthy
  }
  if(count($array)){                                               // while there are arguments left to check
    $popped = array_pop($array);                                   // get the largest argument
    while($popped > 0 && ($mybit = pow(2,floor(log($popped,2))))){ // while the argument hasn't reached zero, get the highest power of 2 possible
      $popped -= $mybit;                                           // subtract power from argument
      if($value >= $mybit && !$bits[$i]){                          // if this bit can be subtracted from our argument, and we haven't used this bit yet
        $copy = $bits;                                             // create a copy to pass to the function
        $copy[$mybit] = 1;                                         // mark the bit as used in the copy
        solve($array,$value-$mybit,$copy);                         // recurse
      }
    }
  }
}

मैंने इसका परीक्षण नहीं किया, लेकिन थिसिस 158 बाइट्स को ऐसा ही करना चाहिए:function f($a,$v=NULL,$b=[]){($v=$v??(1<<log(max($a),2)+1)-1)||die("1");if($p=array_pop($a))while($p-=$i)($b[$i=1<<log($p,2)]|$v<$i)||f($a,$v-$i,[$i=>1]+$b);}
टाइटस

@ टिट्स और इस प्रकार हम देखते हैं कि मैं कोडगॉल्फ में कितना भयानक हूं। और क्यों अधिकांश प्रश्नों का PHP में आपके द्वारा शानदार उत्तर होता है। (और कुछ अन्य भाषाएं)।
जो।

अभी के लिए भयानक। यह बहुत अच्छा जवाब है; और गोल्फ कौशल अनुभव के साथ आते हैं।
टाइटस

लंबी स्ट्रिंग संकेतन की कोई आवश्यकता नहीं है, बस "1" में अनुवाद करने वाले कुछ और का उपयोग करें लेकिन पूर्णांक नहीं है। उदाहरण के लिए एक बूलियन true: die("1")die(!0)
मैनटवर्क

2

लुआ 5.2, 85 बाइट्स

m=math
x=function(...)print(bit32.bor(...)==2^(m.floor(m.log(m.max(...),2))+1)-1)end

यह x एक ऐसा कार्य करता है जो एक चर संख्या को इनपुट (32 बिट पूर्णांक होने की उम्मीद) को स्वीकार करता है, और प्रिंट करने के लिए या तो "सच" या "गलत" बताता है।

उपयोग:

x(13, 83, 86, 29, 8, 87, 26, 21) -- Prints "false"

1
हम्म, यह झूठे परीक्षण मामलों में से कुछ के लिए विफल लगता है? उदाहरण के लिए [1,15,3,1]वापस trueजाने के falseलिए लगता है । यहां आपका कोड TIO का ऑनलाइन कंपाइलर है। अन्य दो परीक्षण मामले जो विफल होते हैं [1,7,1]और [15,15,15]। अन्य सभी परीक्षण मामले सही परिणाम का उत्पादन करते हैं।
केविन क्रूज़सेन 13

2

PHP, 121 बाइट्स

function f($a,$s=0){($v=array_pop($a))||(0|$g=log($s+1,2))-$g||die("1");for($b=.5;$v<=$b*=2;)$v&$b&&~$s&$b&&f($a,$s|$b);}

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

टूट - फूट

function f($a,$s=0)
{
    ($v=array_pop($a))          # pop element from array
    ||                          # if nothing could be popped (empty array)
    (0|$g=log($s+1,2))-$g       # and $s+1 is a power of 2
        ||die("1");                 # then print "1" and exit
    for($b=.5;$v>=$b*=2;)       # loop through the bits:
        $v&$b                       # if bit is set in $v
        &&~$s&$b                    # and not set in $s
            &&f($a,$s|$b);              # then set bit in $s and recurse
}

2

जे , 49 बाइट्स

g=.3 :'*+/*/"1+/"2((#y){.=i.{:$#:y)*"2#:(i.!#y)A.,y'

क्या मुझे 'g =' को भी गिनना होगा? मैं इसे जोड़ने के लिए तैयार हूं।

इस समय एक लंबी स्पष्ट क्रिया। मैंने एक ही एल्गोरिथ्म के लिए एक टैसिट की कोशिश की, लेकिन यह इससे भी लंबा और बदसूरत निकला। Adám के समाधान से दूर।

स्पष्टीकरण: (y फ़ंक्शन का सही तर्क है)

                                             ,y - adds a leading axis to the argument 
                                             (if it's scalar becomes an array of length 1)
                                          .A    - finds the permutations according to the left argument
                                   (i.!#y)      - factorial of the length of the argument, for all permutations
                                 #:             - convert each element to binary
                             *"2                - multiply each cell by identity matrix
           (                )                   - group 
                   =i.{:$#:y                    - identity matrix with size the length
                                                  of the binary representation of the argument 
             (#y){.                             - takes as many rows from the identity matrix 
                                                  as the size of the list (pad with 0 if neded)
    */"1+/"2                                    - sums the rows and multiplies the items
                                                  to check if forms an identity matrix
 *+/                                            - add the results from all permutations and
                                                  returns 1 in equal or greater then 1

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


1

पायथन 3 , 126 120 बाइट्स

श्री Xcoder के कारण 6 बाइट्स बचा

lambda x:g(x,max(map(len,map(bin,x)))-3)
g=lambda x,n:n<0 or any(g(x[:i]+x[i+1:],n-1)for i in range(len(x))if x[i]&2**n)

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


क्या आप एक अनप्लग्ड संस्करण जोड़ सकते हैं?
एंटिटी

[0]+[...]क्या यह व्यर्थ नहीं है? any(g(x[:i]+x[i+1:],n-1)for i in range(len(x))if x[i]&2**n)पर्याप्त होना चाहिए।
श्री एक्सकोडर

@ Mr.Xcoder हाँ, मुझे लगता है कि मैं अधिकतम समारोह के बारे में सोच रहा था जब मैंने इसे जोड़ा था
Halvard Wil

1

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

BUz0Œ!ŒD€Ẏ
ṀBo1eÇ

संख्याओं की सूची लेने और लौटने 1(सच्चाई) या0 (सत्य) (फाल्सी) के लिए एक विवादास्पद लिंक।

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

यह प्रत्येक परीक्षण मामलों में से सबसे लंबे समय तक टीआईओ पर समय देगा।

कैसे?

BUz0Œ!ŒD€Ẏ - Link 1, possibilities (plus some shorter ones & duplicates): list of numbers
                                     e.g. [4, 5, 2]
B          - to binary list (vectorises)  [[1,0,0],[1,0,1],[1,0]]
 U         - upend                        [[0,0,1],[1,0,1],[0,1]]
   0       - literal zero                  0
  z        - transpose with filler        [[0,1,0],[0,0,1],[1,1,0]]
    Œ!     - all permutations             [[[0,1,0],[0,0,1],[1,1,0]],[[0,1,0],[1,1,0],[0,0,1]],[[0,0,1],[0,1,0],[1,1,0]],[[0,0,1],[1,1,0],[0,1,0]],[[1,1,0],[0,1,0],[0,0,1]],[[1,1,0],[0,0,1],[0,1,0]]]
      ŒD€  - diagonals of €ach            [[[0,0,0],[1,1],[0],[1],[0,1]],[[0,1,1],[1,0],[0],[0],[1,0]],[[0,1,0],[0,0],[1],[1],[0,1]],[[0,1,0],[0,0],[1],[0],[1,1]],[[1,1,1],[1,0],[0],[0],[0,0]],[[1,0,0],[1,1],[0],[0],[0,1]]]
         Ẏ - tighten                      [[0,0,0],[1,1],[0],[1],[0,1],[0,1,1],[1,0],[0],[0],[1,0],[0,1,0],[0,0],[1],[1],[0,1],[0,1,0],[0,0],[1],[0],[1,1],[1,1,1],[1,0],[0],[0],[0,0],[1,0,0],[1,1],[0],[0],[0,1]]

ṀBo1eÇ - Main link: list of numbers  e.g. [4, 5, 2]
Ṁ      - maximum                           5
 B     - to binary list                   [1,0,1]
   1   - literal one                       1
  o    - or (vectorises)                  [1,1,1]
     Ç - last link as a monad             [[0,0,0],[1,1],[0],[1],[0,1],[0,1,1],[1,0],[0],[0],[1,0],[0,1,0],[0,0],[1],[1],[0,1],[0,1,0],[0,0],[1],[0],[1,1],[1,1,1],[1,0],[0],[0],[0,0],[1,0,0],[1,1],[0],[0],[0,1]]
    e  - exists in?                        1    --------------------------------------------------------------------------------------------------------------^

1

आर , 247 बाइट्स 221 बाइट्स

function(i){a=do.call(rbind,Map(`==`,Map(intToBits,i),1));n=max(unlist(apply(a,1,which)));any(unlist(g(a[,1:n,drop=F],n)))}
g=function(a,p){if(p==1)return(any(a[,1]));Map(function(x){g(a[x,,drop=F],p-1)},which(a[,p])*-1)}

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

अनप्लग्ड संस्करण

f=function(i){                                   #anonymous function when golfed
  a=do.call(rbind,Map(`==`,Map(intToBits,i),1))  #convert integers to binary, then logical
                                                 #bind results together in matrix
  n=max(unlist(apply(a,1,which)))                #determine max number of bits
  any(unlist(g(a[,1:n,drop=F],n)))               #apply recursive function
}

g=function(a,p){
  if(p==1)return(any(a[,1]))                   #check if first bit is available still
  Map(function(x){g(a[x,,drop=F],p-1)},which(a[,p])*-1) #strip row used for current bit
                                                        #and apply the function recursively
}

मुझे एहसास हुआ कि drop=Fतर्कों के साथ नो-रो की जाँच अनावश्यक थी । कुछ pesky व्हाट्सएप को भी हटा दिया।


1

PHP, 152 बाइट्स

<?function b($a,$b,$s){$a[$s]=0;$r=$b-1;foreach($a as$i=>$v)if($v&1<<$b)$r=max(b($a,$b+1,$i),$r);return$r;}$g=$argv;$g[0]=0;echo!(max($g)>>b($g,0,0)+1);

झूठे के लिए कुछ भी नहीं, 1 सच के लिए।

Ungolfed:

<?

// Search an array for a value having a bit set at the given bit index.
// For each match, search for a next higher bit index excluding the current match.
// This way it "climbs up" bit by a bit, finally returning the highest bit index reached.
function bitSearch($valArr, $bitInd, $skipInd) {
    unset($valArr[$skipInd]);
    $result = $bitInd - 1;
    foreach ($valArr as $ind => $v) {
        if ($v & (1 << $bitInd)) {
            $result = max(bitSearch($valArr, $bitInd + 1, $ind), $result);
        }
    }
    return $result;
}

$argv[0] = 0;
$r = bitSearch($argv, 0, 0);
// Check if the highest bit index reached was highest in the largest value given.
if (max($argv) >> ($r + 1)) {
    echo("False\n");
} else {
    echo("True\n");
}


0

सी, 79 बाइट्स

b,i;main(a){for(;~scanf("%d",&a);i++)b|=a;puts("false\0true"+(b==(1<<i)-1)*6);}

क्या आप एक स्पष्टीकरण जोड़ सकते हैं? इसके अलावा, एक try it onlineलिंक उपयोगी होगा।
एंटीटी

कुछ सुझाव जब सी में गोल्फिंग: 1 / कई चुनौतियों में (इसमें एक शामिल है), आपको एक पूर्ण कार्यक्रम के बजाय एक फ़ंक्शन सबमिट करने की अनुमति है, 2 / आपको एक सच्चाई / गलत मूल्य का उत्पादन करना होगा, यह लंबे समय तक कुछ भी हो सकता है जैसा कि यह सुसंगत है (आप "झूठे" / "सच" के बजाय 0/1 आउटपुट कर सकते हैं)। अंत में, यह कोड काम नहीं करता है: [1, 7, 1]झूठे लौटना चाहिए, और [52, 114, 61, 19, 73, 54, 83, 29]सच लौटना चाहिए
स्कॉट

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