Біплекс: важливий марний оператор


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, тому вихід має скрізь 1s, а бітсум - 3 або 1, а 0s - скрізь.


Тестові справи

Тестові приклади мають форму:

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

Таблиця лідерів

Завдяки фрагменту "Мартін" на лідері


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


Чи можемо ми вимагати, щоб вхід був двійковим, як у прикладі?
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. Так що так, продовжуйте це :)
трихоплакс

Чи можемо ми використовувати позначення типу [[1,0,1], [1,1,0,0], [1,0,0,1]]?
Акангка

Напевно, ні. Припустимо найбільш обмежувальний.
Акангка

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

Відповіді:


1

Желе, не конкуруючий

14 байт Ця відповідь є неконкурентоспроможною, оскільки виклик перед створенням Jelly.

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
А-а-а, я шукав це в пунктах кулі і пропустив це в першому реченні. Я виправлю це десь сьогодні.
El'endia Starman

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

Вводиться як базовий список у стилі 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 Ні, дивіться приклади. Вихід повинен бути числом, бінарне подання якого 1s в тих бітах, які відповідають бітовим площинам, де мали місце мінімуми та максимуми.
Мартін Ендер

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) Побітові АБО |автоматично змінюються істинними на 1, а помилковими - на 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))

Безголівки:

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

Simpl іфіфіковані коментарі. Введення в Binary, на даний момент не працює перекладач. Сподіваємось, коментарів достатньо.

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 Я не надто блискучий з матлабом / октавою, але, сподіваємось, це допомагає: @(a)визначає анонімну функцію, яка займає вхідний вектор a . ["" змушує вихід у рядок (я вважаю). (b=sum(a-48))визначає bвектор, що містить бітсуми. b==max(b)буде вектором, що має 1в заданому місці, якщо бітсум максимум, а 0інше. b(b>0)- вектор кожного елемента, bбільший за 0, так b==min(b(b>0))це вектор, що містить a, 1коли бітсум є мінімальним, 0інакше. Тоді це АБО разом, і +48для ASCII.
BrainSteel

@BrainSteel тепер має сенс - дякую
trichoplax

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

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.... (Примітка. Є також те, =<<що робить те ж саме, але з аргументами перевернуто:) (show=<<).v.... >>=і =<<працюйте в контексті списку тут і робіть різні речі у функціональних чи інших контекстах.
nimi

2
Ви можете замінити []в останніх випадках &і #на _: b&_=bі _#l=l.
nimi

2
(x==b)||(x==c)(або (x==b)||(x==a#b)при видаленні c) можна замінити на elem x[b,c](resp:) 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

Пітон 3, 181 126 122 байт

(Я вийняв більшу частину косої частини байтів, тому що це стало трохи смішно.) 21 байт від 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 за розрахунок хв / макс, він скоротив мій код на 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

Мова Вольфрам, 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 є базовими цілими числами.

Я сам це розгорнув у хмарі, і ви можете спробувати це за посиланням https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781

хмарний приклад


Я перевірив хмарне посилання без провідних нулів, і воно все ще правильно виводить 3.
trichoplax

Якщо у вас коротший код без графічного інтерфейсу, ви можете відредагувати його у цій відповіді, щоб покращити свою оцінку, і все ж залишити версію 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;}

Безумовно:

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.