Биплекс: важный бесполезный оператор


33

вход

  • Список от 1 до 255 натуральных чисел (включительно), каждое в диапазоне от 1 до 2 32 - 1 (включительно).
  • Ваш входной формат не должен быть идентичен тестовым примерам.
  • Ввод без начальных нулей должен быть принят.
  • Ввод с ведущими нулями не требуется принимать.
  • Вы можете использовать любой желаемый разделитель между целыми числами.
  • Целое число может быть представлено строкой, но отдельные цифры конкретного целого числа должны быть смежными.
  • Вы можете использовать любую базу для ввода (включая двоичную и унарную), при условии, что выходные данные также находятся в этой базе.

Выход

  • Одно целое число
  • Выход не должен иметь начальных нулей.
  • Выход должен быть в той же базе, что и вход.
  • Выходные данные могут быть рассчитаны любым способом, который вы хотите, но должны соответствовать результату следующего вычисления:

Расчет биплекса

  • Биты двоичного представления нумеруются справа, начиная с нуля, поэтому бит i находится в столбце, представляющем 2 i .
  • Я й bitsum это сумма я й бит двоичных представлений каждого из входных чисел.
  • Bitsum максимум является самым высоким значением , принимаемым по bitsums.
  • Минимальная bitsum является самой низкой ненулевой величиной , принимаемой в bitsums.
  • Я й разряд двоичного представления продукции является:
    • 1, если i- я битная сумма равна максимуму битовой суммы или минимуму битовой суммы.
    • 0 иначе

Работал пример

Этот пример использует двоичный файл для ввода и вывода.

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

Максимальное количество битов равно 3, а минимальное значение битов равно 1, поэтому выход имеет 1, где битовая сумма равна 3 или 1, а 0 - везде.


Контрольные примеры

Тестовые случаи в форме:

Input => Output

Тестовые случаи в двоичном виде:

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

Те же тесты в десятичном формате:

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

Leaderboard

Благодаря фрагменту таблицы лидеров Мартина


Оператор получил название 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]]?
Akangka

Возможно нет. Предположим, самый ограничительный.
Akangka

@ChristianIrwan Ввод должен быть в виде целых чисел (каждый из которых состоит из непрерывных цифр). Целое число может быть представлено в виде строки, но между цифрами не должно быть разделителей.
трихоплакс

Ответы:


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.                

Хотя существуют разногласия по поводу того, как именно его судить, этот мета-вопрос говорит о том, что сообщество решительно выступает за то, чтобы больше не отмечать ответы как неконкурентные, когда проблема предшествует созданию языка. Поэтому я принимаю этот ответ.
трихоплакс

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.>./,<./@#~@)&.#:

Это молчаливый монадический глагол, который принимает список десятичных целых чисел и возвращает их десятичный биплекс.

Спасибо @Zgarb за его предложения, которые сэкономили 4 байта напрямую и проложили путь для еще 2!

Спасибо @randomra за добавление в игру еще 2 байтов!

Контрольные примеры

   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

Минколанг 0,10 , 109 79 байт

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

Ввод и вывод в десятичном виде. Попробуй это здесь.

объяснение

(                            $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 с выводом ведущих 0s в двух местах.

$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

От интерпретатора онлайн, это берет десятичный ввод и дает двоичный вывод?
трихоплакс

Да. Мне нужно изменить это?
El'endia Starman

1
Аааа, я искал это в пунктах пули и пропустил это в самом первом предложении. Я исправлю это сегодня.
Эльендия Старман

1
Исправлена! И только с двумя дополнительными байтами! : D
El'endia Starman

1
Вы заработали мой +1; Я рад узнать о Минколанге.
Lirtosiast

8

Brainfuck , 619 байтов

Первый ответ слишком долго здесь, так что я решил сделать хороший ответ!

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

Разве ... я победил?

Эта программа ожидает новые строки (ASCII 10) после каждого двоичного числа и требует пробела (ASCII 32) в конце.

Тестовые прогоны:

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
трихоплакс

7

CJam, 27 байт

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

Принимает входные данные в виде списка CJam-base-10. Проверьте это здесь. В качестве альтернативы, запустите все контрольные примеры (сценарий отбрасывает ожидаемый результат и при необходимости преобразует формат ввода).

объяснение

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) При определении функции стрелки с одним параметром вам не нужны круглые скобки вокруг нее. 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) Побитовое ИЛИ |автоматически меняет 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=lна d=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))

Ungolfed:

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 байт

Упрощенные комментарии. Ввод в двоичном виде, переводчик в данный момент не работает. Надеюсь, комментариев достаточно.

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как вектор, содержащий битовые суммы. b==max(b)будет вектором, имеющим 1в данном месте, если битовая сумма максимальна, и 0иначе. b(b>0)является вектором каждого элемента bбольше чем 0, b==min(b(b>0))также вектор, содержащий, 1когда битовая сумма является минимальной, и 0иначе. Тогда это будет OR вместе и +48для ASCII.
BrainSteel

@BrainSteel теперь имеет смысл - спасибо
trichoplax

Иногда я забываю, как отличаются Octave и MATLAB. Я полагаю, что в будущем я действительно должен начать использовать Octave для игры в гольф, моя самая короткая попытка MATLAB составляет 60 байт, потому что вы не можете использовать встроенное назначение и в конечном итоге получить function o=b(i)(новую r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
строку

3

JavaScript (ES6), 158

Функция с параметром числового массива, возвращающая число. С таким же количеством байтов он может получить параметр массива строк (содержащий базовые представления 2) и вернуть строку базовых 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)

Как это работает.

Вместо заполнения я переворачиваю массив, затем добавляю, используя пользовательский (&). Я не использую foldl1 (zipWith (+)), который короче, потому что zipWith удалит лишний элемент. Затем я нахожу максимальный и ненулевой минимум, что также требует определенной пользователем функции. Затем я сопоставляю элемент с максимальным и ненулевым минимумом, 1, если совпадает, 0, если он не совпадает. Затем мы обращаемся и превращаем его в двоичное число.

СДЕЛАТЬ:

  1. С помощью Data.List

2
В определении k, cиспользуется только один раз, поэтому нет необходимости ставить его в whereпредложении. С его помощью можно непосредственно: ...||(x==a#b).... Почему фигурные скобки? В l: concat.map showесть concatMap showили еще лучше >>=: l=(>>=show).v.... (Примечание: есть также то, =<<что делает то же самое, но с аргументами flipped:) (show=<<).v.... >>=и =<<работать здесь в контексте списка и делать разные вещи в функциональном или другом контексте.
Ним,

2
Вы можете заменить []в последних случаях &и #на _: b&_=bи _#l=l.
Ним

2
(x==b)||(x==c)(или (x==b)||(x==a#b)когда вы удалите c) может быть заменено на elem x[b,c](соответственно:) elem x[b,a#b].
Ним

2
u=maximumи k a=m(\x->fromEnum$elem x[u a,a#u a])aдолжен работать.
Ним

1
Не делайте _&a=a, он должен остаться []&a=a, иначе первый список будет потерян, если второй пуст. Используйте _только в последнем случае - возможно, это ваша ошибка.
Nimi

3

Python 3, 181 126 122 байта

убрал большую часть косых черт, потому что это становилось немного нелепым.) Благодаря 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)

Немного меньше в гольф:

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 для расчета min / max, он сократил мой код на 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

Даже лучше! Мне нужно больше узнать о гольфе для петель, но до сих пор не пользуюсь инструкцией.
Науак

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

Важный, бесполезный язык для важного, бесполезного оператора.

Ввод / вывод в двоичном формате. Программа ожидает каждого числа в отдельной строке, каждая из которых заканчивается переводом строки.

Попробуйте онлайн!

Контрольные примеры

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

Это монадическая функция, которая принимает список десятичных целых чисел и возвращает их десятичный биплекс.

Попробуйте онлайн в демоверсии 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 Language, 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}"}]

пример

Существуют и другие способы ввода данных таким образом, чтобы сэкономить на количестве символов, но я думаю, что это решение представляет собой элегантное использование динамического графического интерфейса пользователя, который выполняет вычисления

Если вы хотите запустить это в облаке, мы можем использовать 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 []. Можно также гипотетически ожидать, что числа будут храниться в переменной, что также может уменьшить количество символов, но тогда, как мне кажется, неоднозначно, как вы вводите ввод в него
Ян Джонсон

Хранение чисел в переменной не является одним из методов ввода по умолчанию ... Так что этот дополнительный шаг недоступен, но то, что у вас есть, великолепно :)
trichoplax

1

Питон 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))

Он принимает в двоичных числах, разделенных пробелами.

Безголовая версия:

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

Полная программа, вводимая как аргументы командной строки - разделенные пробелами - в десятичном виде.

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 байта

Принимает ввод как двоичные числа, разделенные запятой, вывод в двоичном виде.

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

Попробуйте это онлайн на веб-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;}

Ungolfed:

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 Я изменил это.
MegaTom
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.