ใช้เวลาหนึ่งที่จะทำให้หนึ่ง


23

ท้าทาย

รับรายการของจำนวนเต็มบวกหาว่ามีการเรียงสับเปลี่ยนที่ใช้เวลาถึงหนึ่งบิตจากแต่ละจำนวนเต็มเป็นเลขฐานสองซึ่งประกอบด้วย1s ทั้งหมดสามารถสร้างขึ้นได้

จำนวนบิตในเลขฐานสองที่ได้นั้นเท่ากับMSBสูงสุดในรายการจำนวนเต็ม

เอาท์พุต

รหัสของคุณจะต้องส่งออกหรือส่งกลับค่าความจริง / เท็จที่ระบุว่าการเปลี่ยนแปลงดังกล่าวมีอยู่

ตัวอย่าง

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! ความท้าทายแรกที่ดี!
นาย Xcoder

@Notatree: ดียังไงดี ฉันสามารถใช้รหัสที่สั้นที่สุดในการหาภรรยาของฉัน
Antti29

เพิ่มดัชนีปัญหากราฟของฉันเป็นการจับคู่แบบสองส่วน
Peter Taylor

คำตอบ:


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

J , 30 ไบต์

เครดิตทั้งหมดไปที่เพื่อนร่วมงานของฉันมาร์แชลล์

ฟังก์ชั่นนำหน้าโดยปริยายไม่มีชื่อ

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

ลองออนไลน์!

( @คือองค์ประกอบของฟังก์ชั่น)

#: antibase-2

|: transpose

()^:2 ใช้ฟังก์ชั่นต่อไปนี้สองครั้ง:

1- บูลีนคัดค้าน

>./ สูงสุด

@ ของ

$ ความยาวแกน

{. ใช้ (การเติมด้วยศูนย์) จาก

|: อาร์กิวเมนต์ transposed

+./ .*"วิเศษปัจจัยบ้า" *

[: ไม่ขอ (no-op - ทำหน้าที่เขียนส่วนก่อนหน้ากับส่วนที่เหลือ)


* ในคำพูดของมาร์แชล


6

JavaScript (ES6), 104 ... 93 83 ไบต์

ผลตอบแทนหรือ01

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)))

กรณีทดสอบ

วิธี

รับอินพุตอาร์เรย์A = [a 0 , a, 1 , ... , N-1 ]เรามองหาการเปลี่ยนแปลง[a p [0] , a p [1] , ... , a p [N- 1] ]ของAและจำนวนเต็มx ≤ Nเช่นนั้น:

  • s = 1 + (a p [0]และ 2 0 ) + (a p [1]และ 2 1 ) + ... + (a p [x-1]และ 2 x-1 ) = 2 x
  • และsมากกว่าองค์ประกอบที่ยิ่งใหญ่ที่สุดเมตรของ

จัดรูปแบบและแสดงความคิดเห็น

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

Husk , 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 ไบต์ขอบคุณ Mr.Xcoder

จริง: 1, เท็จ: 0

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

ภาษา Wolfram (Mathematica) , 65 ไบต์

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

ลองออนไลน์!

คำอธิบาย

#~IntegerDigits~2

เราเริ่มต้นด้วยการแปลงอินพุตทั้งหมดเป็นรายการไบนารี่

n=PadLeft[...]

จากนั้นเราจะรวมรายการทั้งหมดที่มีศูนย์ทางด้านซ้ายเพื่อสร้างอาร์เรย์ของสี่เหลี่ยม ผลลัพธ์จะถูกเก็บไว้ในnภายหลัง

Permutations[...]

Yay แรงเดรัจฉานลองได้พีชคณิตของอินพุทที่เป็นไปได้ทั้งหมด

Tr/@...

สิ่งนี้จะได้รับการติดตามสำหรับการเปลี่ยนแปลงแต่ละครั้งนั่นคือผลรวมขององค์ประกอบในแนวทแยงในการเปลี่ยนแปลง กล่าวอีกนัยหนึ่งเราเพิ่ม MSB จากหมายเลขแรกถัดไปสู่ ​​MSB จากจำนวนที่สองเป็นต้น หากการเรียงสับเปลี่ยนนั้นถูกต้องสิ่งเหล่านี้จะเป็น1และจะมี1วินาทีตามจำนวนอินพุตที่ใหญ่ที่สุดนั้นกว้าง

Max[...]

เราได้รับการติดตามสูงสุดเพราะร่องรอยไม่สามารถจะมากขึ้นกว่าที่ของการเปลี่ยนแปลงที่ถูกต้อง

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

ทางด้านขวามือเป็นเพียงรุ่นของสนามกอล์ฟLength @ First @ nนั่นคือได้ความกว้างของอาร์เรย์ที่เป็นรูปสี่เหลี่ยมผืนผ้าดังนั้นความกว้างของจำนวนที่มากที่สุด เราต้องการตรวจสอบให้แน่ใจว่าการติดตามการเปลี่ยนแปลงบางอย่างมีค่าเท่ากัน


3

PHP, 255 243 160 ไบต์

-12 ไบต์ใช้การเรียงลำดับ
-83 ไบต์ (!) ขอบคุณ Titus

<?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 เพื่อความจริงไม่มีอะไรจะหลอก

เวอร์ชันเดิมไม่ได้รับการดัดแปลง:

<?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
      }
    }
  }
}

ฉัน haven't ทดสอบ แต่วิทยานิพนธ์ 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);}
ติตัส

@Titus และทำให้เราเห็นว่าฉันแย่มากที่ codegolf และทำไมคำถามส่วนใหญ่จึงเป็นคำตอบที่ดีสำหรับคุณใน PHP (และอีกสองสามภาษา)
โจ

แย่มากตอนนี้ นั่นเป็นคำตอบที่ดีทีเดียว และทักษะการเล่นกอล์ฟมาพร้อมกับประสบการณ์
ติตัส

ไม่จำเป็นต้องใช้รูปแบบสตริงที่มีความยาวเพียงใช้อย่างอื่นที่แปลเป็น "1" แต่ไม่ใช่จำนวนเต็ม ตัวอย่างเช่นบูลtrue: →die("1") die(!0)
จัดการ

2

Lua 5.2, 85 ไบต์

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

ชุดนี้ x เป็นฟังก์ชันที่รับจำนวนตัวแปรของอินพุต (คาดว่าจะเป็นจำนวนเต็ม 32 บิต) และพิมพ์ไปยัง stdout เป็น "true" หรือ "false"

การใช้งาน:

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]กรณีทดสอบอื่น ๆ ทั้งหมดให้ผลลัพธ์ที่ถูกต้อง
Kevin Cruijssen

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

J , 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

Python 3 , 126 120 ไบต์

บันทึก 6 ไบต์เนื่องจาก Mr. Xcoder

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)

ลองออนไลน์!


คุณสามารถเพิ่มเวอร์ชันที่ไม่ได้แต่งแต้มได้หรือไม่?
Antti29

[0]+[...]ไม่มีจุดหมายใช่ไหม? any(g(x[:i]+x[i+1:],n-1)for i in range(len(x))if x[i]&2**n)ควรจะพอเพียง
Mr. Xcoder

@ Mr.Xcoder ใช่ฉันเดาฉันคิดเกี่ยวกับฟังก์ชั่นสูงสุดเมื่อฉันเพิ่ม
Halvard Hummel

1

เยลลี่ขนาด 17 ไบต์

BUz0Œ!ŒD€Ẏ
ṀBo1eÇ

ลิงก์ monadic ที่รับรายการตัวเลขและส่งคืน1(ความจริง) หรือ0(เท็จ)

ลองออนไลน์!

นี่จะหมดเวลากับ TIO นานที่สุดของแต่ละกรณีทดสอบ

อย่างไร?

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

R , 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ข้อโต้แย้ง ลบบางช่องว่างที่น่ารำคาญออกไปด้วย


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

C, 79 ไบต์

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

คุณสามารถเพิ่มคำอธิบายได้ไหม? นอกจากนี้try it onlineลิงค์จะมีประโยชน์
Antti29

เคล็ดลับบางประการเมื่อเล่นกอล์ฟใน C: 1 / ในหลาย ๆ ความท้าทาย (อันนี้รวมอยู่ด้วย) คุณได้รับอนุญาตให้ส่งฟังก์ชั่นแทนโปรแกรมเต็มรูปแบบ 2 / คุณต้องส่งออกค่าจริง / ค่าเท็จนี่อาจเป็นอะไรก็ได้ เนื่องจากมันสอดคล้องกัน (คุณสามารถส่งออก 0/1 แทน "false" / "true") สุดท้ายรหัสนี้ดูเหมือนจะไม่ทำงาน: [1, 7, 1]ควรคืนค่าเท็จและ[52, 114, 61, 19, 73, 54, 83, 29]ควรคืนค่าจริง
scottinet

คุณพูดถูกเจ้าไม่ดี
PrincePolka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.