Biplex: một toán tử vô dụng quan trọng


33

Đầu vào

  • Danh sách từ 1 đến 255 số nguyên dương (bao gồm), mỗi số trong phạm vi 1 đến 2 32 - 1 (đã bao gồm).
  • Định dạng đầu vào của bạn không cần phải giống hệt với các trường hợp thử nghiệm.
  • Đầu vào không có số 0 đầu được yêu cầu phải được chấp nhận.
  • Đầu vào với các số 0 hàng đầu không bắt buộc phải được chấp nhận.
  • Bạn có thể sử dụng bất kỳ dấu phân cách nào bạn muốn giữa các số nguyên.
  • Một số nguyên có thể được biểu diễn bằng một chuỗi nhưng các chữ số riêng lẻ của một số nguyên cụ thể phải liền kề nhau.
  • Bạn có thể chọn sử dụng bất kỳ cơ sở nào cho đầu vào (bao gồm cả nhị phân và đơn nguyên), miễn là đầu ra cũng nằm trong cơ sở đó.

Đầu ra

  • Một số nguyên duy nhất.
  • Đầu ra phải không có số 0 đứng đầu.
  • Đầu ra phải ở cùng cơ sở với đầu vào.
  • Đầu ra có thể được tính theo bất cứ cách nào bạn muốn nhưng phải khớp với kết quả của phép tính sau:

Tính biplex

  • Các bit của biểu diễn nhị phân được đánh số từ bên phải bắt đầu từ 0, vì vậy bit i nằm trong cột đại diện cho 2 i .
  • Các i th bitsum là tổng của i th bit của cơ quan đại diện nhị phân của mỗi số đầu vào.
  • Giá trị bitum tối đa là giá trị cao nhất được lấy bởi bitum.
  • Giá trị tối thiểu của bitum là giá trị khác không thấp nhất được lấy bởi các bitum.
  • Chữ số thứ i của biểu diễn nhị phân của đầu ra là:
    • 1 nếu bitum thứ i bằng với bitum tối đa hoặc tối thiểu bitum.
    • 0 khác.

Ví dụ làm việc

Ví dụ này sử dụng nhị phân cho đầu vào và đầu ra.

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

Tối đa bitum là 3 và tối thiểu bitum là 1, do đó, đầu ra có 1 giây ở mọi nơi mà bitum là 3 hoặc 1 và 0 ở mọi nơi khác.


Các trường hợp thử nghiệm

Các trường hợp thử nghiệm có dạng:

Input => Output

Các trường hợp thử nghiệm trong nhị phân:

[1] => 1
[10] => 10
[1, 10, 101] => 111
[11111111111111111111111111111111] => 11111111111111111111111111111111
[10010010010010010010010010010010, 10101010101010101010101010101010, 11011011011011011011011011011011] => 11100011100011100011100011100011
[10001011100010100110100101001001, 10110000111110010000111110111010, 1101110001101101011010010100101, 1010101010001011101001001010101] => 11 

Các trường hợp thử nghiệm tương tự trong thập phân:

[1] => 1
[2] => 2
[1, 2, 5] => 7
[4294967295] => 4294967295
[2454267026, 2863311530, 3681400539] => 3817748707
[2341103945, 2969112506, 1849078949, 1430639189] => 3

Bảng xếp hạng

Cảm ơn Đoạn trích của Martin


Toán tử được đặt tên là biplex, viết tắt của extrema mặt phẳng nhị phân, sau khi thảo luận trong trò chuyện .


Chúng ta có thể yêu cầu đầu vào ở dạng nhị phân, như trong ví dụ không?
frageum

1
@feersum You may choose to use any base for input and output (including binary and unary), provided they are both in the same base. Vì vậy, có, đi cho nó :)
trichoplax

Chúng tôi có thể sử dụng ký hiệu như [[1,0,1], [1,1,0,0], [1,0,0,1]] không?
Akangka

Chắc là không. Giả sử một trong những hạn chế nhất.
Akangka

@ChristianIrwan Đầu vào phải ở dạng số nguyên (mỗi số được tạo thành từ các chữ số liền kề). Một số nguyên có thể được biểu diễn dưới dạng một chuỗi nhưng không nên có dấu phân cách giữa các chữ số.
trichoplax

Câu trả lời:


1

Thạch, không cạnh tranh

14 byte Câu trả lời này không cạnh tranh vì thử thách trước khi tạo ra Jelly.

BUSµḟ0Ṣ.ịe€@UḄ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

BUSµḟ0Ṣ.ịe€@UḄ    Main link. Input: A (list)

B                 Convert each item in A to binary.
 U                Reverse each array of binary digits.
  S               Add them across columns.

   µ              Monadic chain. Argument: S (list of column sums)
    ḟ0            Remove all occurrences of 0.
      Ṣ           Sort the remaining sums.
       .ị         Take the elements with indices around 0.5.
                  Indices are 1-bases, so this selects the last and the first one.
             U    Yield S, reversed.
            @     Reverse the arguments.
         e€       Test each item in the left list for membership in the right one.
              Ḅ   Convert from binary to integer.                

Mặc dù có sự bất đồng về cách đánh giá chính xác, nhưng câu hỏi meta này cho thấy cộng đồng rất ủng hộ việc không còn đánh dấu câu trả lời là không cạnh tranh khi thử thách trước khi tạo ra ngôn ngữ. Do đó, tôi chấp nhận câu trả lời này.
trichoplax

11

Bình thường, 26 25 byte

JsM.T_MjR2Qi_}RhM_BS-J0J2

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình

JsM.T_MjR2Q
       jR2Q      convert each input number to binary (lists of 1s and 0s)
     _M          reverse each list
   .T            transpose (with top justify)
 sM              sum up each list (numbers of 1s at each position)
J                store this list in J

i_}RhM_BS-J0J2
         -J0     J without 0s
        S        sorted
      _B         create the list [sorted, reverse(sorted)]
    hM           take the first elments of each (bitsum-min and bitsum-max)
  }R        J    check for each value in J, if it is part of ^
 _               reverse this list of booleans
i            2   convert from binary to base 10 and print

1
Việc _Bsử dụng là tuyệt vời
isaacg

9

J, 31 30 24 23 21 byte

+/(e.>./,<./@#~@)&.#:

Đây là một động từ ngầm, đơn âm lấy một danh sách các số nguyên thập phân và trả về biplex thập phân của chúng.

Cảm ơn @Zgarb vì những gợi ý của anh ấy, đã lưu trực tiếp 4 byte và mở đường cho 2 người nữa!

Cảm ơn @randomra vì đã chơi golf thêm 2 byte!

Các trường hợp thử nghiệm

   biplex =: +/(e.>./,<./@#~@)&.#:

   biplex ,1
1
   biplex ,2
2
   biplex 1 2 5
7
   biplex ,4294967295
4294967295
   biplex 2454267026 2863311530 3681400539
3817748707
   biplex 2341103945 2969112506 1849078949 1430639189
3

Làm thế nào nó hoạt động

                 &.    Dual. Apply the verb to the right, the verb to the left,
                       and finally the inverse of the verb to the right.
                   #:  Convert the input list from integer to base 2.
  (            @)      Define an adverb, i.e., an operator that takes a verb as
                       its left argument.
+/                     Call it with "reduce by sum". This calculates the sum of
                       the corresponding binary digits of all integers before
                       executing the remainder of the adverb's body, i.e, this:
             #~          Replicate the sum N a total of N times, i.e., turn
                         0 1 2 3 into 1 2 2 3 3 3. This eliminates zeroes.
         <./@            Calculate the minimum of the result.
     >./                 Calculate the maximum of the sums.
        ,                Append; wrap both extrema into a list.
   e.                    Check if each of the sums is in the list of extrema.
                         This yields 1 if yes and 0 if no.
                       (from &.) Convert from base 2 to integer.

9

Minkolang 0.10 , 109 79 byte

(n1$(d2%$r2:d)99*I-DmI2:[+1R]$I)rI$d$(s0(x0gd,)Ik3R2g1-X0I3-[2*2gd0c=$r1c=++]N.

Đầu vào và đầu ra là số thập phân. Hãy thử nó ở đây.

Giải trình

(                            $I)    Loop until input is empty
 n                                  Read in number from input
  1$(       d)                      Start a while loop with only the top of stack
     d2%                            Next least-significant bit (modulo by 2)
        $r                          Swap top two values
          2:                        Divide by 2
              99*I-D                Pad with 0s
                                    (when the while loop exits, top of stack is 0)
                    m               Merge (interleave) stack
                     I2:[   ]       For each pair...
                         +1R        Add and rotate stack to the right
                                    <<This does the work of computing bitsums>>

r       Reverse stack
 I      Push length of stack
  $d    Duplicate whole stack
        <<This lets me sort the bitsums without affecting the original order>>

$(                      Start while loop with <top of stack> elements
  s                     Sort
   0(     )             Push a 0 and start another while loop
     x                  Dump top of stack
      0g                Get front of stack and put it on top
        d,              Duplicate and <not> for end-while condition check
           Ik           Push length of stack and break out of while loop
             3R         Rotate [min, max, length] to front
               2g1-     Get length and put it on top, then subtract 1
                   X    Dump that many elements off the top of stack
                        <<Now I have min and max>>

0                        Initialize decimal with 0    
 I3-[               ]    For as many bits as there are...
     2*                  Multiply by 2
       2gd               Get the next most significant bit and put it on top
          0c=            Copy min and check for equality
             $r          Swap top two elements of stack
               1c=       Copy max and check for equality
                  ++     Add 1 if bitsum item is equal to min or max, 0 otherwise
N.                       Output as integer and stop

Phiên bản cũ:

$nI[(d2%i1+0a+i1+0A00ai`4&i00A2:d)x]00a1+[i1+0a]s0(x0gd,)rI2-[x]00a1+[i1+0ad0c=$r1c=+]0gx0gx0(xd,)0I1-[2*+]N.

Hãy thử nó ở đây!

Giải trình

Điểm mấu chốt của nó là tính năng mảng được sử dụng rất nhiều ( a A) để lưu trữ các bitcoin, trong đó tối thiểu và tối đa được tìm thấy, sau đó 1s và 0s được xuất ra một cách thích hợp, với việc bỏ các vị trí dẫn đầu 0ở hai vị trí.

$n                                      Read in whole input as integers
  I[(                             x]    Convert each number to binary
     d2%                                Get next least significant bit (modulo by 2)
        i1+0a                           Get current value in array for that position
             +                          Add
              i1+0A                     Put current value in array for that position
                   00ai`                Get first value of array (bitsum length)
                      i`                Greater than loop counter?
                        4&i00A          If not, put loop counter there
                              2:        Divide by 2
                                d)      If 0, exit loop

00a                Get first value of array (maximum length
   1+              Add one
     [i1+0a]       Get bitsum values from array and push on stack
            s      Sort
0(                 Push a 0 (for dump) and start a while loop -- dumps leading 0s
  x                Dump top of stack
   0g              Get bottom of stack
     d,            Duplicate and <not> it
       )           Exit loop when top of stack is non-zero (i.e., the minimum)
        r          Reverse stack (so now it's [min, max, <stuff>])
         I2-[x]    Dump everything else

00a1+[               ]    Get bitsum length and loop that many times
      i1+0a               Get bitsum value at current position
           d              Duplicate
            0c=           Copy front of stack and check for equality
               $r         Swap
                 1c=      Copy next-to-front of stack and check for equality
                    +     Add (so it's 1 if it's equal to min or max, 0 otherwise)

0gx0gx       Dump front two elements of stack (the min and max)
0(xd,)       Dump leading 0s
0            Push 0 for conversion to decimal
 I1-[   ]    For each bit...
     2*+     Multiply by 2 and add
N.           Output as integer and stop

Từ trình thông dịch trực tuyến, điều này có nhận đầu vào thập phân và cho đầu ra nhị phân không?
trichoplax

Vâng. Tôi có cần thay đổi điều đó không?
El'endia Starman 4/11/2015

1
Ahhh, tôi đã tìm kiếm nó trong các gạch đầu dòng và bỏ lỡ nó trong câu đầu tiên. Thỉnh thoảng tôi sẽ sửa nó.
El'endia Starman

1
Đã sửa! Và chỉ với hai byte thêm! : Đ
El'endia Starman

1
Bạn đã kiếm được +1 của mình; Tôi rất vui khi biết về Minkolang.
lirtosiast

8

Brainfuck , 619 byte

Câu trả lời đầu tiên ở đây quá dài ở đây, vì vậy tôi nghĩ tôi sẽ làm tốt!

>->->->>>,----------[--<++++++[>------<-]>>>>,----------]-<<<+[-<<<+]->>,<++++[>--------<-]>[<++++[>+++++<-]>++[--<++++++[>------<-]>>>+>]<-[+>-<<+[-<<<+]-<<+[->+[->[-[->>>+<<<]<<<+]+[-->>>++]-<+]<<<+[-[->+<]<<<+]->>+>]<-[+>->>>>+[->>>+]->+[-<[-[->>>+<<<]<<<+]+[-->>>++]->+]-<+<<<+[-[->+<]<<<+]->>]]>,<++++[>--------<-]>]>+[->>>+]>->->>-[+<<<<<<+[-<-<<+]->>[+>>>[>>>]>+[<<->>[->>>+]->>>[-]+<<<<<+[-<<<+]+>->]<]>->>+>-]<[<<<<<+[-<+<<+]->>[-]>+[->>>+]->>-]>-[+<<<<<<+[-<+<<+]->>[->>>[>>>]>+[<<<->>>[->>>+]->>>[-]+<<<<<<+[-<<<+]+>>+>]<]>->>>-]<<<<-<<<<+[->[-]<[->+<]<[->>[-]+<<]<<+]>-[+>>>-]++[->++++++[-<++++++++>]<.>>>+]

Có phải ... tôi đã thắng?

Chương trình này mong đợi các dòng mới (ASCII 10) sau mỗi số nhị phân và yêu cầu một khoảng trắng (ASCII 32) ở cuối.

Chạy thử:

Me$ bf bpx.bf
1
10
101

111

Me$ bf bpx.bf
11111111111111111111111111111111

11111111111111111111111111111111

Me$ bf bpx.bf
10010010010010010010010010010010
10101010101010101010101010101010
11011011011011011011011011011011

11100011100011100011100011100011

Me$ bf bpx.bf
10001011100010100110100101001001
10110000111110010000111110111010
1101110001101101011010010100101
1010101010001011101001001010101

11

(Dòng mới được thêm vào sau mỗi trường hợp ++++++++++.được thêm vào cuối chương trình)

Giải trình

Vẫn là một công việc đang tiến triển, nhưng một công việc chậm. Vì thiếu thời gian, tôi vừa sao chép các ghi chú tôi đã viết trong khi viết chương trình này, điều này sẽ đủ cho một lời giải thích cho bây giờ:

[Biplex Calculator]

[

Bitsum writing philosophy: 

Start with [0 255 255 255 ...].
The 255s will be markers that we can 'search' for to get back to the start.
After that, the next byte should be a 0, fairly permanently. (The first reference 0)
It is useful to have 0-bytes handy for general calculations. 
The next byte is where we will read the first digit of any binary number. (The first read)
The next byte holds the first bitsum.
Afterward, the next byte is 0, the following byte is the place
to read the second binary digit, the following byte is the second bitsum,
and so on.
I'll use the terminology nth reference 0, nth read, and nth bitsum to refer to
each part of the triplet of bytes.

The location three places after the final bitsum will be 255,
and the location three places after the final read will be 255.
We can move entire numbers by lining up these 255s after every binary number.

]


>->->->>>~                  [0 255 255 255 0 0 0 0 0                ]

[From the first bitsum, read input to create an initial set of bitsums                  ]
,----------
[
    --<++++++[>------<-]            [Convert the input '1' or '0' into a bit        ]
    >>>>,---------- 
]~                      
-<<<+[-<<<+]->>                 [Mark 255 after the last bit, then go back to first read]

,<++++[>--------<-]             [Check for space, using the first reference 0       ]
>
[
    <++++[>+++++<-]             [Check for \n                       ]
    >++
    [
        --<++++++[>------<-]        [It wasn't \n, so convert the input into a bit      ]
        >>>+>               [Write 1 to the next reference 0, and go to next read   ]
    ]
    <-
    [
        +>              [It was \n                      ]
        -<              [Mark 255 on this (nth) read and go to (n-1)th bitsum   ]
        <+[-<<<+]           [Search for a 255 off to the left           ]

        [We've either struck our marker, or the last bitsum. We need to check.          ]
        -<<+
        [
            -           [We hit the last bitsum. Move the bitsums right.    ]
            >+
            [
                ->[-[->>>+<<<]<<<+] [Move until we reach the start          ]
                +[-->>>++]      [From the start, move to our last bitsum    ]
                [Repeat this move until the read here is a 255              ]
                -<+
            ]
            [We now need to go to the first reference zero, and put a 1 there       ]
            <<<+[-[->+<]<<<+]->>+>      [Add bits to bitsums and end on first read  ]
        ]
        <-
        [
            +>->>>>+[->>>+]     [Go to the 255 after our reads              ]
            ->+
            [
                -<[-[->>>+<<<]<<<+] [Move until we reach the start          ]
                +[-->>>++]      [From the start, move to the 255 after our reads]
                [Repeat this move until we see the 255 bitsum               ]
                ->+
            ]
            [We now need to go to the first read                        ]
            -<+<<<+[-[->+<]<<<+]->>     [Add bits to bitsums and end on first read  ]
        ]
        >>>>>>>>>>>>>>>>>>>>>>>>>~<<<<<<<<<<<<<<<<<<<<<<<<<
    ]

    [We're at the reference 0 to the left of our next read                      ]
    >,<++++[>--------<-]            [Check for space, using the first reference 0       ]
    >
]

[

Let BN be the nth bitsum. Then our situation at the moment is:

[0 255 255 255 0 0 B1 0 0 B2 ... 0 0 BN 0 0 255] 
                 ^
I'm just happy nothing's exploded yet.

]

[Next goal: Mark the minimums                                       ]

>+[->>>+]>->->>~            [Zero the 255 and put 2 255s after it, then move after it   ]

-[
    +<<<<<<
    +[-<-<<+]               [Subtract one from each bitsum              ]
    ->>
    [
        +>>>[>>>]           [Find the first 0 bitsum                ]
        >+
        [
            <<->>[->>>+]->>>[-]     [Mark the zero as a minimum, and set a flag     ]
            +<<<<<+[-<<<+]+>->
        ]
        <
    ]
    >->>+>-
]~

[Hey, that worked. Weird. Alright, moving on...                             ]
[Reset the bitsums to what they were before we messed them all up                   ]

<[<<<<<+[-<+<<+]->>[-]>+[->>>+]->>-]>~

[After the stuff up there, that's not too bad.                              ]
[Now it's time to mark the maximums, in virtually the opposite way we did the minimums.         ]

-[
    +<<<<<<
    +[-<+<<+]               [Add one to each bitsum                 ]
    ->>
    [
        ->>>[>>>]           [Find the first 0 bitsum                ]
        >+
        [
            <<<->>>[->>>+]->>>[-]   [Mark the zero as a maximum, and set a flag     ]
            +<<<<<<+[-<<<+]+>>+>
        ]
        <
    ]
    >->>>-
]~

[Alright, now OR the maxs and mins, take care of leading zeros, output, and cross fingers       ]
<<<<->>~<<<<<<~+[->[-]<[->+<]<[->>[-]+<<]<<+]>-[+>>>-]++[->++++++[-<++++++++>]<.>>>+]

Dòng mới tách và không gian kết thúc là hoàn toàn hợp lệ. +1
trichoplax

7

CJam, 27 byte

q~2fbWf%:.+_0-$(\W>|fe=W%2b

Đưa đầu vào dưới dạng danh sách kiểu cơ sở 10 CJam. Kiểm tra nó ở đây. Hoặc, chạy tất cả các trường hợp thử nghiệm (tập lệnh loại bỏ đầu ra dự kiến ​​và chuyển đổi định dạng đầu vào nếu cần).

Giải trình

q~    e# Read and evaluate input.
2fb   e# Convert each number to base 2.
Wf%   e# Reverse each digit list, to align digits in case there are numbers with different 
      e# widths.
:.+   e# Add up the bit planes.
_0-   e# Make a copy and remove zeroes.
$     e# Sort the bit plane sums.
(\W>| e# Get the first and last element. We use set union instead of addition so that the
      e# resulting array will contain only one value if min = max.
fe=   e# For each element in the bit plane sums, count how often it appears in the min/max
      e# array, which is either 1 or 0.
W%    e# Reverse the digits again (to undo the initial reversing).
2b    e# Interpret as base-2 digits.

Không phải đầu ra là tối đa và tối thiểu bitum?
DavidC

1
@DavidCarraher Không, xem các ví dụ. Đầu ra phải là một số có biểu diễn nhị phân có 1s trong các bit tương ứng với các mặt phẳng bit nơi xảy ra cực tiểu và cực đại.
Martin Ender

6

JavaScript (ES6), 215 185 176 byte

f=a=>{s=[];for(i of a)for(b=i.toString(2),d=l=b.length;d--;)s[x=l-d-1]=(s[x]|0)+(b[d]|0);q=255;for(r of s)d=r>d?r:d,q=r<q?r||q:q;o="";s.map(r=>o=(r==q|r==d)+o);return+("0b"+o)}

Sử dụng

f([2454267026, 2863311530, 3681400539])
=> 3817748707

Giải trình

f=a=>{

  // Create an array of bitsums
  s=[];                   // s = bitsums
  for(i of a)             // iterate through the passed array of numbers
    for(
      b=i.toString(2),    // b = number as binary string
      d=l=b.length;       // l = number of digits in b
      d--;                // iterate through each digit of the binary string
    )
      s[x=l-d-1]=         // add to the digit of the bitsum array
        (s[x]|0)+         // get the current value of the bitsum array (or 0 if null)
        (b[d]|0);         // add the result to the bitsum array

  // Get the maximum and minimum bitsums
  q=255;                  // q = min bitsum
  //d=0;                  // d = max bitsum
  for(r of s)             // iterate through the bitsums
    d=r>d?r:d,            // set d to maximum
    q=r<q?r||q:q;         // set q to minimum

  // Calculate the result
  // (unfortunately JavaScript only supports bitwise operations on signed 32-bit
  // integers so the temporary binary string is necessary)
  o="";                   // o = output
  s.map(r=>               // iterate through the bitsum digits
    o=(r==q|r==d)+o       // add a 1 to the string if the digit is equal to min or max
  );
  return+("0b"+o)         // convert the binary string to a number
}

3
Chào mừng đến với PPCG! Tôi thấy một vài cách mà điều này có thể được thực hiện ngắn hơn. 1) Khi xác định hàm mũi tên với một tham số, bạn không cần dấu ngoặc đơn xung quanh nó. f=(a)=>{}= f=a=>{}2) Bạn có thể biến các for...invòng lặp của mình thành for...ofcác vòng lặp, lưu một vài byte: for(i in a)for(b=a[i]...= for(i of a)for(b=i..., for(i in s)r=s[i],d=...= for(r of s)d=...3) Bitwise OR |tự động thay đổi đúng thành 1 và sai thành 0, o+=r==q|r==d?1:0;tương tự như vậy o+=r==q|r==d;.
Sản xuất ETH

1
Cuối cùng, bạn có thể thực hiện: return parseInt(o,2)đến:return+('0b'+o)
Downgoat

1
Để lưu 2 byte, bạn có thể thay thế s[l-d-1]=(s[l-d-1]|0)bằng s[T=l-d-1]=(s[T]|0). Để cạo thêm 2, thay thế b=i.toString(2),l=b.length,d=lbằng d=l=(b=i.toString(2)).length.
Ismael Miguel

4

Julia, 141 byte

A->(s=reduce(.+,map(i->digits(i,2,maximum(map(i->ndigits(i,2),A))),A));parse(Int,reverse(join([1(iextrema(filter(j->j>0,s)))for i=s])),2))

Ung dung:

function biplex(A::AbstractArray)
    # Get the maximum number of binary digits in each element
    # of the input array
    L = maximum(map(i -> ndigits(i, 2), A))

    # Create an array of arrays of binary digits corresponding
    # to the inputs
    B = map(i -> digits(i, 2, L), A)

    # Get the bitsums
    S = reduce(.+, B)

    # Replace the minimum and maximum bitsums with ones and
    # the rest with zeros
    s = [1 * (i in extrema(filter(j -> j > 0, S))) for i in S]

    # Join this into a string and parse it as a base 2 integer
    # Reverse is required because digits() returns the digits
    # in reverse order
    p = parse(Int, reverse(join(s)), 2)

    return p
end

3

Simplex v.0.7 , 38 byte

Simpl ified ý kiến. Đầu vào trong Binary, không có trình thông dịch làm việc tại thời điểm này. Hy vọng các ý kiến ​​là đủ.

hj&=j&Lun?&RvRpp]{Ri}^XKRJ@jqLhR@LhuTo
h               ]                        ~~ define macro 0
 j&                                      ~~ insert a new byte and write register to it
   =                                     ~~ equal to the previous byte?
    j&                                   ~~ insert a new byte and write register to it
      L                                  ~~ return to equality
       u    v                            ~~ go up/down a strip
        n?&                              ~~ write the register iff byte = 0
           R                             ~~ go right
             Rpp                         ~~ remove two bytes
                 {Ri}                    ~~ take input until input = 0
                     ^X                  ~~ take the sum of the strip
                       K                 ~~ split that sum into digits
                        RJ@              ~~ take the max; write to register
                           jq            ~~ take the min
                             Lh          ~~ call macro 0
                               R@        ~~ set min to register
                                 Lh      ~~ apply macro 0
                                   uTo   ~~ output result 

3

Octave, 50 byte

@(a)["" ((b=sum(a-48))==max(b)|b==min(b(b>0)))+48]

Thí dụ:

octave:1> g = @(a)["" ((b=sum(a-48))==max(b)|b==min(b(b>0)))+48] ;
octave:2> g(["10010010010010010010010010010010"; "10101010101010101010101010101010"; "11011011011011011011011011011011"])
ans = 11100011100011100011100011100011

Tôi rất muốn xem một lời giải thích cho điều này ...
trichoplax 04/11/2015

2
@trichoplax Tôi không quá xuất sắc với matlab / octave, nhưng hy vọng điều này sẽ giúp: @(a)xác định một hàm ẩn danh có một vectơ đầu vào a. ["" buộc đầu ra thành một chuỗi (tôi tin). (b=sum(a-48))định nghĩa blà vectơ chứa bitum. b==max(b)sẽ là một vectơ có một 1vị trí nhất định nếu bitum có cực đại và 0ngược lại. b(b>0)là một vectơ của mọi phần tử blớn hơn 0, b==min(b(b>0))vectơ chứa a 1khi bitum là cực tiểu và 0ngược lại. Sau đó, nó sẽ cùng nhau, và+48 cho ASCII.
BrainSteel 4/11/2015

@BrainSteel tất cả có ý nghĩa bây giờ - cảm ơn bạn
trichoplax 04/11/2015

Đôi khi tôi quên mất Octave và MATLAB khác nhau như thế nào. Tôi đoán tôi thực sự nên bắt đầu sử dụng Octave để chơi gôn trong tương lai, lần thử MATLAB ngắn nhất của tôi là 60 byte vì bạn không thể sử dụng phép gán nội tuyến và kết thúc bằng function o=b(i)(dòng mới)r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
Sanchise

3

JavaScript (ES6), 158

Một hàm với tham số mảng số, trả về một số. Với cùng một số byte, nó có thể nhận được một tham số mảng chuỗi (chứa các lần xuất hiện cơ sở 2) và trả về một chuỗi cơ sở 2 - chỉ cần di chuyển .toString(2)ở cuối sau r.

f=l=>(l.map(v=>[...v.toString(2)].reverse().map((x,i)=>t[i]=~~t[i]-x),t=[]),t.map(v=>(r+=v==Math.min(...t)|v==Math.max(...t.filter(x=>x))&&b,b+=b),r=0,b=1),r)

// More readable

u=l=>(
  t=[],
  l.map(v =>
    [...v.toString(2)]
    .reverse()
    .map((x,i) => t[i] = ~~t[i] - x)
  ),
  r=0,b=1,
  t.map(v => (
    r += v==Math.min(...t) | v==Math.max(...t.filter(x=>x)) && b, b+=b
  )),
  r
)

// Test
console.log=s=>O.innerHTML+=s+'\n'

;[
 [[1], 1]
,[[2], 2]
,[[1, 2, 5], 7]
,[[4294967295], 4294967295]
,[[2454267026, 2863311530, 3681400539], 3817748707]
,[[2341103945, 2969112506, 1849078949, 1430639189], 3]
].forEach(t =>{ 
  r=f(t[0])
  x=t[1]
  console.log('Test '+(r==x?'OK':'Fail (Expected: ' + x +')')
  +'\nInput: '+t[0]+'\nResult: ' +r+'\n')                       
})  
<pre id=O></pre>


3

Haskell, 198 182 178 161 ký tự

Tôi vẫn mới bắt đầu chơi golf. Chỉ có 80 danh tiếng đến từ câu trả lời.

m=map
v=reverse
(b:x)&(c:y)=(b+c):x&y
[]&a=a
b&_=b
l=(show=<<).v.(\a->m(fromEnum.(`elem`[maximum a,minimum$(replicate=<<id)=<<a]))a).foldl1(&).m(m(read.(:[])).v)

Làm thế nào nó hoạt động.

Thay vì đệm, tôi đảo ngược mảng sau đó tôi thêm bằng cách sử dụng người dùng xác định (&). Tôi không sử dụng Foldl1 (zipWith (+)) ngắn hơn vì zipWith sẽ xóa mục siêu. Sau đó, tôi tìm thấy tối thiểu và khác tối thiểu, đó cũng là chức năng do người dùng xác định. Sau đó, tôi khớp mục với mức tối thiểu và khác không tối thiểu, 1 nếu khớp, 0 nếu không khớp. Sau đó, chúng tôi đảo ngược và biến nó thành số nhị phân.

LÀM:

  1. Sử dụng Data.List

2
Trong định nghĩa của k, cchỉ được sử dụng một lần, vì vậy không cần phải đặt nó trong wheremệnh đề. Sử dụng trực tiếp : ...||(x==a#b).... Tại sao niềng răng xoăn? Trong l: concat.map showconcatMap showhoặc thậm chí tốt hơn >>=: l=(>>=show).v.... (Lưu ý: cũng =<<có điều tương tự, nhưng với các đối số được lật (show=<<).v...:). >>==<<làm việc trong bối cảnh danh sách ở đây và làm những việc khác nhau trong chức năng hoặc bối cảnh khác.
nimi

2
Bạn có thể thay thế []trong các trường hợp cuối cùng &#bằng _: b&_=b_#l=l.
nimi

2
(x==b)||(x==c)(hoặc (x==b)||(x==a#b)khi bạn xóa c) có thể được thay thế bằng elem x[b,c](resp elem x[b,a#b]:).
nimi

2
u=maximumk a=m(\x->fromEnum$elem x[u a,a#u a])anên làm việc.
nimi

1
Đừng làm _&a=a, nó phải ở lại []&a=a, nếu không thì danh sách đầu tiên sẽ bị mất nếu danh sách thứ hai trống. _Chỉ sử dụng trong trường hợp cuối cùng - có thể đó là lỗi của bạn.
nimi

3

Con trăn 3, 181 126 122 byte

(Tôi đã loại bỏ hầu hết các dấu gạch chéo số byte vì nó hơi vô lý.) Tắt 21 byte nhờ Sp3000 !

*z,=map(sum,zip(*[map(int,t.zfill(99))for t in input().split()]))
k=0
for x in z:k=k*10+(x in[min(z)or 1,max(z)])
print(k)

Hơi ít chơi golf:

s=input().split()
k=list(map(lambda t:list(map(int,t))[::-1],s))
z=list(map(sum,zip(*k)))
y=z[:]
while min(y)==0:y.remove(0)
a,b=min(y),max(y)
f=''.join(map(lambda x:str(1*(x in[a,b])),z[::-1]))
print(int(f))

Đầu vào được dự kiến ​​ở dạng nhị phân chỉ có khoảng trắng ngăn cách các số. Đầu ra là trong nhị phân là tốt.


3

Javascript, 154 150 byte

t=i=>(m=0,r=[],i.map(n=>{for(j=31;j+1;r[k=31-j]=(r[k]|0)+((n>>>j)%2),--j);}),r.map(n=>m=(n==Math.min(...r.filter(x=>x))|n==Math.max(...r)?1:0)+m*2),m)

Cảm ơn phương pháp edc65 để tính toán tối thiểu / tối đa, nó đã rút ngắn mã của tôi xuống 4 byte.

Giải trình

t=i=>(
    m=0,//m=>output
    r=[],//Bitsum then final number in binary
    i.map(
        n=>
        {
            //Decimal to binary + bitsum
            for(j=31;j+1;r[k=31-j]=(r[k]|0)+((n>>>j)%2),--j);
        }),
    //Output formatting
    r.map(
        n=>
            m=(n==Math.min(...r.filter(x=>x))|n==Math.max(...r)?1:0)+m*2
        ),
    m
)

+1 đẹp. Bit số học nhịp đập chuyển đổi chuỗi cho đến nay. Và tôi thấy 2 cách để rút ngắn nó nhiều hơn.
edc65

132:f=i=>(m=0,r=[],i.map(n=>{for(k=32;k--;n=n/2|0)r[k]=~~r[k]+n%2}),r.map(n=>m+=m+(n==Math.min(...r.filter(x=>x))|n==Math.max(...r))),m)
edc65

Thậm chí còn tốt hơn! Tôi cần tìm hiểu thêm về việc chơi golf cho các vòng lặp, vẫn không sử dụng để chiếm quyền điều khiển.
Naouak

3

ShapeScript , 186 byte

'"1
"$0?_1-"+"*":2"@~@"0
"~"0
"$"
"~+'1?_*!"2"$"0"~"
"$""~":"1?'@1?"+"$_1>"+"*+@1?"0"+$""~'1?_*!#"0"+@":+"'1?1?"0"+$_2<"+"*+'1?_*!"0"+$"1"~@$"1"~":"$""~"+"$""~'"
"@+"
0"$""~'1?_*!"
"$""~

Một ngôn ngữ quan trọng, vô dụng cho một nhà điều hành quan trọng, vô dụng.

I / O là nhị phân. Chương trình mong đợi mỗi số trên một dòng riêng biệt, mỗi số kết thúc bằng một dòng cấp.

Hãy thử trực tuyến!

Các trường hợp thử nghiệm

$ echo -e '1' | shapescript biplex.shape; echo
1
$ echo -e '10' | shapescript biplex.shape; echo
10
$ echo -e '1\n10\n101' | shapescript biplex.shape; echo
111
$ echo -e '11111111111111111111111111111111' | shapescript biplex.shape; echo11111111111111111111111111111111
$ echo -e '10010010010010010010010010010010\n10101010101010101010101010101010\n11011011011011011011011011011011' | shapescript biplex.shape; echo
11100011100011100011100011100011
$ echo -e '10001011100010100110100101001001\n10110000111110010000111110111010\n1101110001101101011010010100101\n1010101010001011101001001010101' | shapescript biplex.shape; echo
11

Tôi không biết rác này là gì bạn gọi là ngôn ngữ , nhưng tôi thích nó!
giai đoạn

2

APL, 27 byte

{2⊥S∊(⌈/,⌊/)0~⍨S←+/⍵⊤⍨32⍴2}

Đây là một hàm đơn âm lấy danh sách các số nguyên thập phân và trả về biplex thập phân của chúng.

Hãy thử trực tuyến trong bản demo ngn / apl .

Làm thế nào nó hoạt động

                     32⍴2  Create a list of 32 2's.
                  ⍵⊤⍨      Base-encode the right argument.
                +/         Add the corresponding binary digits.
              S←           Save the sums in S.
           0~⍨             Remove 0's.
    (⌈/,⌊/)                Apply minimum (⌊/), maximum (⌈/) and concatenate.
  S∊                       Check which binary digits are in the extrema list.
2⊥                         Convert from base 2 to integer.

2

Ngôn ngữ Wolfram, 113 byte

Phiên bản này lấy đầu vào từ cửa sổ bật lên, với các số được nhập ở dạng "{x, y, z, ...}", (không có dấu ngoặc kép).

FromDigits[#/.{Max[#]->1,Min[#/.{0->Nothing}]->1,_Integer->0},2]&@Total[PadLeft[IntegerDigits[#,2],33]&/@Input[]]

Đầu vào:

cửa sổ bật lên năng động

Đầu ra:

đầu ra

Lấy đầu vào trong một Thao tác động dưới dạng một chuỗi có dạng "{x, y, z}" với x, y và z là các số nguyên cơ sở 10 (có hoặc không có các số 0 đứng đầu). Đầu ra cũng ở cơ sở 10.

Manipulate[FromDigits[#/.{Max[#]->1,Min[#/.{0->Nothing}]->1,_Integer->0},2]&@Total[PadLeft[IntegerDigits[#,2],33]&/@ToExpression@i],{i,"{1}"}]

thí dụ

Có nhiều cách khác để nhập cái này theo cách tiết kiệm số lượng ký tự, nhưng tôi nghĩ giải pháp này là một cách sử dụng tao nhã của GUI động thực hiện tính toán

Nếu bạn muốn chạy cái này trong đám mây, chúng ta có thể sử dụng CloudDeploy:

o=CloudDeploy[FormPage[{"i"->"String"},(FromDigits[#/.{Max[#]->1,Min[#/.{0->Nothing}]->1,_Integer->0},2]&@Total[PadLeft[IntegerDigits[#,2],33]&/@ToExpression@#i])&]];SetOptions[o,Permissions->{All->{"Read","Execute"},"Owner"->{"Read","Write","Execute"}}];o

Việc triển khai Đám mây mang lại số lượng nhân vật lên tới 256 tuy nhiên ...

Đầu vào của FormPage cũng là một chuỗi có dạng "{x, y, z}" với x, y và z là các số nguyên cơ sở 10.

Tôi tự triển khai đám mây này và bạn có thể dùng thử tại https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781

ví dụ đám mây


Tôi đã kiểm tra liên kết đám mây mà không có các số 0 đứng đầu và nó vẫn xuất ra chính xác 3.
trichoplax

Nếu bạn có mã ngắn hơn mà không có GUI, bạn có thể chỉnh sửa nó thành câu trả lời này để cải thiện điểm số của mình và vẫn để phiên bản GUI trong câu trả lời của bạn làm ví dụ thay thế để hiển thị những gì có thể. Tốt nhất của cả hai thế giới ...
trichoplax

@trichoplax Lưu ý, tôi đã thêm những gì tôi nghĩ là phiên bản ngắn nhất với Input []. Về mặt giả thuyết cũng có thể mong đợi các số được lưu trữ trong một biến, điều này cũng có thể làm giảm số lượng ký tự, nhưng sau đó tôi mơ hồ về cách bạn nhập dữ liệu vào đó tôi nghĩ
Ian Johnson

Lưu trữ các số trong một biến không phải là một trong những phương thức nhập mặc định ... Vì vậy, bước bổ sung đó không khả dụng, nhưng những gì bạn có cho đến nay là tuyệt vời :)
trichoplax

1

Con trăn 3, 197

import itertools
o='0'
d=[sum(map(int,n))for n in itertools.zip_longest(*map(reversed,input().split(' ')),fillvalue=o)]
m=max(d),min(d)or 1
print(''.join((o,'1')[g in m]for g in d[::-1]).lstrip(o))

Nó có trong không gian số nhị phân giới hạn không gian.

Phiên bản bị đánh cắp:

import itertools
nums = map(reversed, input().split(' '))
digits = []
for num in itertools.zip_longest(*nums, fillvalue='0'):
    current_digit = sum(map(int,num))
    digits.append(current_digit)
bit_max = max(digits)
bit_min = min(digits) or min(digits) + 1
print(''.join(('0','1')[digit in(bit_max,bit_min)]for digit in digits[::-1]).lstrip('0'))

1

C #, 255

Một chương trình hoàn chỉnh, nhập vào dưới dạng đối số dòng lệnh - khoảng cách được phân tách - theo số thập phân.

using System.Linq;class P{static void Main(string[]l){var n=new uint[32];uint i,r=0,b;foreach(var v in l)for(i=0,b=uint.Parse(v);b!=0;b/=2)n[i++]+=b&1;b=1;foreach(var v in n){r+=(v==n.Max()|v== n.Min(x=>x>0?x:n.Max()))?b:0;b+=b;}System.Console.Write(r);}}

Dễ đọc hơn:

using System.Linq;

class P
{
    static void Main(string[] l)
    {
        var n = new uint[32];
        uint i, r = 0, b;

        foreach (var v in l)
            for (i = 0, b = uint.Parse(v); b != 0; b /= 2) n[i++] += b & 1;
        b = 1;
        foreach (var v in n)
        {
            r += (v == n.Max() | v == n.Min(x => x > 0 ? x : n.Max())) ? b : 0;
            b += b;
        }
        System.Console.Write(r);
    }
}

1

Ruby, 127 byte

def f l;a=[];32.times{|i|a[i]=0;l.each{|n|;a[i]+=n[i]}};a.map{|b|a.reject{|c|c==0}.minmax.index(b)?1:0}.reverse.join.to_i 2;end

Lấy một mảng làm đầu vào.


1

CoffeeScript, 194 byte

Lấy đầu vào là số nhị phân tách biệt hôn mê, đầu ra ở dạng nhị phân.

a=(s.split('').reverse()for s in prompt().split(','))
for i in b=[0..31]
 b[i]=0
 b[i]+=+c[31-i]||0for c in a
m=1/M=0
for d in b
 M=d if d>M;m=d if m>d&&d
alert +(+(d in[m,M])for d in b).join ''

Thử nó.


1

GolfScript, 46 byte

~{2base-1%}%zip{{+}*}%-1%.$0-)\1<|`{&,}+%2base

Dùng thử trực tuyến trên Web GolfScript .

Các trường hợp thử nghiệm

$ golfscript biplex.gs <<< '[1]'
1
$ golfscript biplex.gs <<< '[2]'
2
$ golfscript biplex.gs <<< '[1 2 5]'
7
$ golfscript biplex.gs <<< '[4294967295]'
4294967295
$ golfscript biplex.gs <<< '[2454267026 2863311530 3681400539]'
3817748707
$ golfscript biplex.gs <<< '[2341103945 2969112506 1849078949 1430639189]'
3

1

C ++, 192 byte

Chấp nhận đầu vào một mảng số nguyên không dấu 32 bit và một số mục trong mảng đó.

typedef unsigned long U;U b(U*a,int c){U x[32],t,i,j,M=0,m=c,r=0;for(i=0;i<32;x[i++]=t,m=t&&m>t?t:m,M=M<t?t:M)for(t=j=0;j<c;)t+=a[j++]>>i&1;for(i=0;i<32;++i)r|=(x[i]==m||x[i]==M)<<i;return r;}

Ung dung:

unsigned long b(unsigned long*a, int c){
    unsigned long x[32],t,i,j,M=0,m=c,r=0;
    for(i=0;i<32;x[i++]=t){
        m = (t && m > t)?t:m;
        M = M < t ? t:M;
        for(t=j=0;j<c;){
            t+=a[j++]>>i&1;
        }
    }
    for(i=0;i<32;++i)
        r|=(x[i]==m||x[i]==M)<<i;
    return r;
}

1
@trichoplax Mình thay đổi rồi.
MegaTom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.