バイプレックス:重要な役に立たない演算子


33

入力

  • 1から255までの正の整数(両端を含む)のリストで、それぞれ1から2 32-1(両端を含む)の範囲です。
  • 入力形式は、テストケースと同じである必要はありません。
  • 先行ゼロなしの入力を受け入れる必要があります。
  • 先行ゼロを含む入力を受け入れる必要はありません。
  • 整数の間に任意の区切り文字を使用できます。
  • 整数は文字列で表すことができますが、特定の整数の個々の数字は連続している必要があります。
  • 出力がそのベースにもある場合は、入力に任意のベース(バイナリおよび単項を含む)を使用することを選択できます。

出力

  • 単一の整数。
  • 出力には先行ゼロがない必要があります。
  • 出力は入力と同じベースになければなりません。
  • 出力は任意の方法で計算できますが、次の計算の結果と一致する必要があります。

バイプレックスの計算

  • バイナリ表現のビットは、ゼロから始まる右から番号が付けられているため、ビットiは2 iを表す列にあります。
  • I 番目 bitsumの合計であるI 番目の入力番号のそれぞれのバイナリ表現のビットです。
  • bitsum最大値は bitsumsで撮影した最高値です。
  • bitsum最小値は最小である非ゼロ bitsumsによって撮影された値。
  • 出力のバイナリ表現のi 番目の桁は次のとおりです。
    • i 番目のビットサムが最大ビットサムまたは最小ビットサムに等しい場合は1 。
    • それ以外の場合は0。

実施例

この例では、入力と出力にバイナリを使用しています。

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

ビットサムの最大値は3、ビットサムの最小値は1であるため、ビットサムが3または1の場合はすべて出力に1が、その他の場合は0が出力されます。


テストケース

テストケースの形式は次のとおりです。

Input => Output

バイナリのテストケース:

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

10進数の同じテストケース:

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

リーダーボード

MartinのLeaderboard Snippetに感謝


chatでの議論に続いて、演算子はbiplexと呼ばれ、バイナリプレーンの極値の略です。


例のように、入力をバイナリにする必要がありますか?
feersum

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。はい、そうです:)
trichoplax

[[1,0,1]、[1,1,0,0]、[1,0,0,1]]のような表記を使用できますか?
アカンカ

おそらくない。最も制限の厳しいものを想定してください。
アカンカ

@ChristianIrwan入力は整数の形式である必要があります(それぞれが連続する数字で構成されています)。整数は文字列として表現できますが、数字の間に区切り文字はありません。
-trichoplax

回答:


1

ゼリー、非競合

14バイトこの回答は、チャレンジがゼリーの作成より前に行われているため、競合していません。

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

オンラインでお試しください!

使い方

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.                

正確にどのように判断するかについては意見の相違がありますが、このメタの質問は、チャレンジが言語の作成よりも前の場合、コミュニティが回答を非競合としてマークしないことを強く支持していることを示唆しています。したがって、私はこの答えを受け入れます。
-trichoplax

11

Pyth、26 25バイト

JsM.T_MjR2Qi_}RhM_BS-J0J2

オンラインで試す:デモンストレーションまたはテストスイート

説明

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
_B使用は素晴らしいです
isaacg

9

J、31 30 24 23 21バイト

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

これは暗黙の単項動詞で、10進整数のリストを取り、10進双プレックスを返します。

@Zgarbの提案に感謝します。これは4バイトを直接節約し、さらに2バイトの道を開きました。

さらに2バイトのゴルフをしてくれた@randomraに感謝します!

テストケース

   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

使い方

                 &.    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.10109の 79バイト

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

入力と出力は10進数です。ここで試してみてください。

説明

(                            $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

古いバージョン:

$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.

ここで試してみてください!

説明

重要点は、配列機能が頻繁に使用され(a A)、ビットサムを保存することです(ビットサムの最小値と最大値が見つかった後、1sと0sが適切に出力されます0

$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

オンラインインタープリターから、これは10進数の入力を受け取り、バイナリの出力を与えますか?
-trichoplax

はい。変更する必要がありますか?
エレンディアスターマン

1
ああ、私は箇条書きでそれを探していましたが、最初の文では見逃していました。本日中に修正します。
エレンディアスターマン

1
一定!あと2バイトだけです!:D
El'endiaスターマン

1
あなたは私の+1を獲得しました。Minkolangについて学ぶことができてうれしいです。
リトシアスト

8

Brainfuck、619バイト

ここでは長すぎる最初の答えなので、私は良いことをしたいと思いました!

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

した...私は勝ちましたか?

このプログラムでは10、すべての2進数の後に改行(ASCII )が必要32であり、最後にスペース(ASCII )が必要です。

テスト実行:

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

(プログラムの最後に追加された各ケースの後に追加された改行++++++++++.

説明

まだ進行中の作業ですが、遅いものです。時間がないため、このプログラムを書いている間に作成したメモをコピーしました。これで説明はこれで十分です。

[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       ]
<<<<->>~<<<<<<~+[->[-]<[->+<]<[->>[-]+<<]<<+]>-[+>>>-]++[->++++++[-<++++++++>]<.>>>+]

改行区切りとスペース終了は完全に有効です。+1
trichoplax

7

CJam、27バイト

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

入力をベース10のCJamスタイルのリストとして受け取ります。ここでテストしてください。または、すべてのテストケースを実行します(スクリプトは期待される出力を破棄し、必要に応じて入力形式を変換します)。

説明

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.

出力はビットサムの最大値と最小値ではありませんか?
DavidC

1
@DavidCarraherいいえ、例を参照してください。出力は1、最小値と最大値が発生したビットプレーンに対応するビットにsが含まれるバイナリ表現の数値でなければなりません。
マーティンエンダー

6

JavaScriptの(ES6)、215の 185 176バイト

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

使用法

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

説明

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
PPCGへようこそ!これを短くする方法はいくつかあります。1)1つのパラメーターで矢印関数を定義する場合、括弧を囲む必要はありません。f=(a)=>{}= f=a=>{}2)for...inループをfor...ofループに変えて、数バイトを節約できます: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は|自動的にtrueを1に、falseを0に自動的に変更するためo+=r==q|r==d?1:0;、と同じo+=r==q|r==d;です。
ETHproductions

1
最後に、次のことを実行できますreturn parseInt(o,2)return+('0b'+o)
Downgoat

1
2つのバイトを保存するには、置き換えることができs[l-d-1]=(s[l-d-1]|0)s[T=l-d-1]=(s[T]|0)。2以上を剃るために、交換してくださいb=i.toString(2),l=b.length,d=ld=l=(b=i.toString(2)).length
イスマエルミゲル

4

ジュリア、141バイト

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

ゴルフをしていない:

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

シンプレックスv.0.7、38バイト

簡略化されたコメント。バイナリで入力し、現在インタープリターは動作していません。うまくいけば、コメントで十分です。

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

オクターブ、50バイト

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

例:

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

これについての説明をご覧ください
...-trichoplax

2
@trichoplax私はmatlab / octaveにあまり精通していませんが、うまくいけばこれは助けます:@(a)入力ベクトルを 受け取る匿名関数を定義しますa["" 出力を文字列に強制します(私は信じています)。ビットサムを含むベクトルを(b=sum(a-48))定義bします。ビットサムが最大の場合、与えられた場所にa b==max(b)を持つベクトル10それ以外の場合はaになります。b(b>0)は、bより大きいすべての要素のベクトルである0ため、ビットサムが最小の場合b==min(b(b>0))はaを含むベクトル1であり、0それ以外の場合はです。次に+48、ASCIIの場合、ORで結合されます。
BrainSteel

@BrainSteelは今すべて理にかなっています-ありがとう
-trichoplax

OctaveとMATLABの違いを忘れることがあります。将来、ゴルフにOctaveを使い始めるべきだと思います。インライン割り当てを使用できず、最終的にfunction o=b(i)(改行)r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
-Sanchises

3

JavaScript(ES6)、158

数値を返す数値配列パラメーターを持つ関数。同じバイト数で、それは文字列配列パラメータ(含むベース2 rapresentations)を取得し、ベース2の文字列を返すことができます-ちょうど移動し.toString(2)た後、最後に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

ハスケル、198 182 178 161文字

私はまだゴルフの初心者です。回答から得られる評判は80のみです。

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)

どのように機能しますか。

パディングの代わりに、配列を逆にしてから、ユーザー定義(&)を使用して追加します。zipWithはスーパーフロースアイテムを削除するため、短いfoldl1(zipWith(+))は使用しません。次に、ユーザー定義関数を必要とする最大値とゼロ以外の最小値を見つけます。次に、アイテムを最大値とゼロ以外の最小値に一致させます。一致する場合は1、一致しない場合は0です。次に、逆に2進数に変換します。

TODO:

  1. を使用して Data.List

2
の定義ではkc一度しか使用されないため、where句に入れる必要はありません。直接使用します...||(x==a#b)...。なぜ中括弧ですか?でlconcat.map showであるconcatMap showか、さらに良いです>>=l=(>>=show).v...。(注:=<<同じことを行うものもありますが、引数が反転します:)(show=<<).v...>>=そして=<<、ここでリストコンテキストでの仕事や関数や他のコンテキストで異なることを行います。
nimi

2
あなたは置き換えることができます[]の最後の例で&#して_b&_=b_#l=l
-nimi

2
(x==b)||(x==c)(または(x==b)||(x==a#b)削除する場合c)はelem x[b,c](それぞれ:)に置き換えることができますelem x[b,a#b]
-nimi

2
u=maximumそして、k a=m(\x->fromEnum$elem x[u a,a#u a])a動作するはずです。
-nimi

1
しないでください_&a=a、それはそのままでなければなりません[]&a=a_最後の場合にのみ使用してください-多分それはあなたのエラーです。
nimi

3

Pythonの3、181の 126 122バイト

(少しおかしくなったので、バイトカウントのスラッシュのほとんどを削除しました。)Sp3000のおかげで21バイトオフになりました。

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

やや少ないゴルフ:

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

入力は、数字を区切るスペースのみのバイナリで期待されます。出力もバイナリです。


3

Javascript、154 150バイト

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)

最小/最大計算のためのedc65メソッドのおかげで、コードが4バイト短縮されました。

説明

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いいね。ビット演算は、文字列変換をはるかに上回ります。そして、私はそれをもっと短くする2つの方法を見ます。
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

さらに良い!私はループのためのゴルフについてさらに学ぶ必要がありますが、それでも指示のためにハイジャックするために使用することはありません。
-Naouak

3

ShapeScript、186バイト

'"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?_*!"
"$""~

重要で役に立たないオペレーターのための重要で役に立たない言語。

I / Oはバイナリです。プログラムは、各行が改行で終わる独立した行の各数値を想定しています。

オンラインでお試しください!

テストケース

$ 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

あなたが言語と呼ぶこのゴミが何なのかわかりませんが、大好きです!
フェーズ

2

APL、27バイト

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

これは、10進整数のリストを受け取り、それらの10進双プレックスを返す単項関数です。

ngn / aplデモでオンラインでお試しください

使い方

                     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

Wolfram言語、113バイト

このバージョンは、ポップアップウィンドウから入力を受け取り、「{x、y、z、...}」の形式で番号を入力します(引用符なし)。

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

入力:

ポップアップウィンドウダイナミック

出力:

出力

ダイナミックマニピュレートの入力を、「{x、y、z}」形式の文字列として入力します。x、y、およびzは10を基数とする整数です(先行ゼロ付きまたはなし)。出力も10を底にしています。

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

例

文字数を節約する方法でこれを入力する他の方法がありますが、このソリューションは計算を実行する動的なGUIのエレガントな使用だと思います

これをクラウドで実行する場合、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

ただし、クラウドデプロイでは最大256文字まで文字数が増えます...

FormPageへの入力も、「{x、y、z}」形式の文字列で、x、y、およびzは10を基数とする整数です。

これを自分でクラウド展開しました。https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781で試してみることができます

クラウドの例


先行ゼロなしでクラウドリンクをテストしましたが、まだ正しく3を出力します。
trichoplax

GUIを使用せずに短いコードがある場合は、この回答を編集してスコアを改善し、GUIバージョンを回答に残して、可能なことを示すことができます。両方の世界のベスト
...-trichoplax

@trichoplax注意、Input []で最短バージョンだと思うものを追加しました。また、仮にまた、文字数を減らすことができ、変数に格納する番号を、期待していますが、私が思うに、あなたがそれに入力を入力する方法として、それは曖昧だでした
イアン・ジョンソン

変数に数値を保存することは、デフォルトの入力方法の 1つではありません...そのため、追加のステップは使用できませんが、これまでの
手順

1

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

スペースで区切られた2進数を取ります。

ゴルフされていないバージョン:

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

完全なプログラム、コマンドライン引数として入力-スペースで区切られた-10進数。

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

より読みやすい:

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

ルビー、127バイト

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

入力として配列を受け取ります。


1

CoffeeScript、194バイト

入力をコマ区切りの2進数として受け取り、2進数で出力します。

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

それを試してみてください。


1

GolfScript、46バイト

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

Web GolfScriptでオンラインで試してください。

テストケース

$ 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バイト

32ビットの符号なし整数配列の入力、およびその配列内のアイテムのカウントを受け入れます。

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

アンゴルフド:

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変更しました。
メガトム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.