Biplex: operator penting yang tidak berguna


33

Memasukkan

  • Daftar antara 1 dan 255 bilangan bulat positif (inklusif), masing-masing dalam kisaran 1 hingga 2 32 - 1 (inklusif).
  • Format input Anda tidak perlu identik dengan kasus uji.
  • Input tanpa angka nol di depan harus diterima.
  • Input dengan nol terkemuka tidak harus diterima.
  • Anda dapat menggunakan pembatas apa pun yang Anda inginkan di antara bilangan bulat.
  • Integer dapat diwakili oleh string tetapi digit individu dari integer tertentu harus berdekatan.
  • Anda dapat memilih untuk menggunakan basis apa pun untuk input (termasuk biner dan unary), asalkan outputnya juga ada di basis itu.

Keluaran

  • Bilangan bulat tunggal.
  • Keluaran harus tidak memiliki angka nol di depan.
  • Output harus dalam basis yang sama dengan input.
  • Output dapat dihitung dengan cara apa pun yang Anda inginkan tetapi harus sesuai dengan hasil perhitungan berikut:

Menghitung biplex

  • Bit dari representasi biner diberi nomor dari kanan mulai dari nol, jadi bit i ada di kolom yang mewakili 2 i .
  • The i th bitsum adalah jumlah dari i th bit dari representasi biner dari masing-masing nomor masukan.
  • The maksimum bitsum adalah nilai tertinggi yang diambil oleh bitsums.
  • The bitsum minimum adalah termurah non-nol nilai yang diambil oleh bitsums.
  • The i th digit dari representasi biner dari output adalah:
    • 1 jika i th bitsum sama dengan bitsum maksimum atau minimum bitsum.
    • 0 sebaliknya.

Contoh yang berhasil

Contoh ini menggunakan biner untuk input dan output.

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

Bitum maksimum adalah 3 dan bitum minimum adalah 1, sehingga output memiliki 1s di mana-mana bitum adalah 3 atau 1, dan 0s di tempat lain.


Uji kasus

Uji kasus dalam bentuk:

Input => Output

Kasus uji dalam biner:

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

Kasus uji yang sama dalam desimal:

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

Papan peringkat

Terima kasih untuk Cuplikan Papan Peringkat Martin


Operator bernama biplex, kependekan dari binary plane extrema, setelah diskusi dalam obrolan .


Bisakah kita memerlukan input dalam biner, seperti dalam contoh?
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. Jadi ya,
lakukanlah

Bisakah kita menggunakan notasi seperti [[1,0,1], [1,1,0,0], [1,0,0,1]]?
Akangka

Mungkin tidak. Asumsikan yang paling ketat.
Akangka

@ChristianIrwan Input harus dalam bentuk bilangan bulat (masing-masing terdiri dari angka yang berdekatan). Integer dapat direpresentasikan sebagai string tetapi tidak boleh ada pemisah antara digit.
trichoplax

Jawaban:


1

Jelly, tidak bersaing

14 byte Jawaban ini tidak bersaing karena tantangan mendahului pembuatan Jelly.

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

Cobalah online!

Bagaimana itu bekerja

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.                

Meskipun ada ketidaksepakatan tentang bagaimana cara menghakimi, pertanyaan meta ini menunjukkan bahwa masyarakat sangat mendukung tidak lagi menandai jawaban sebagai tidak bersaing ketika tantangan mendahului penciptaan bahasa. Karena itu saya menerima jawaban ini.
trichoplax

11

Pyth, 26 25 byte

JsM.T_MjR2Qi_}RhM_BS-J0J2

Cobalah online: Demonstrasi atau Test Suite

Penjelasan

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
The _BPenggunaan brilian
isaacg

9

J, 31 30 24 23 21 byte

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

Ini adalah kata kerja monadik diam-diam yang mengambil daftar bilangan bulat desimal dan mengembalikan bipleks desimal mereka.

Terima kasih kepada @Zgarb untuk sarannya, yang menyimpan 4 byte secara langsung dan membuka jalan untuk 2 lagi!

Terima kasih kepada @randomra untuk bermain golf 2 byte lagi!

Uji kasus

   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

Bagaimana itu bekerja

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

9

Minkolang 0,10 , 109 79 byte

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

Input dan output dalam desimal. Coba di sini.

Penjelasan

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

Versi lama:

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

Coba di sini!

Penjelasan

Inti dari itu adalah bahwa fitur array banyak digunakan ( a A) untuk menyimpan bitumen, yang minimum dan maksimum ditemukan, kemudian 1s dan 0s dikeluarkan dengan tepat, dengan dumping leading 0di dua tempat.

$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

Dari penerjemah online, apakah ini mengambil input desimal dan memberikan output biner?
trichoplax

Iya nih. Apakah saya perlu mengubahnya?
El'endia Starman

1
Ahhh, aku mencarinya di poin-poin dan melewatkannya di kalimat pertama. Saya akan memperbaikinya suatu hari nanti.
El'endia Starman

1
Tetap! Dan dengan hanya dua byte tambahan! : D
El'endia Starman

1
Anda telah mendapatkan +1 saya; Saya senang mengetahui tentang Minkolang.
lirtosiast

8

Brainfuck , 619 byte

Jawaban pertama terlalu lama di sini, jadi saya pikir saya akan melakukan yang baik!

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

Apakah ... Apakah saya menang?

Program ini mengharapkan baris baru (ASCII 10) setelah setiap angka biner, dan membutuhkan spasi (ASCII 32) di bagian akhir.

Tes berjalan:

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

(Baris baru ditambahkan setelah setiap kasus dengan ++++++++++.ditambahkan di akhir program)

Penjelasan

Masih dalam proses, tetapi lambat. Karena kekurangan waktu, saya baru saja menyalin catatan yang saya buat saat menulis program ini, yang akan cukup untuk penjelasan untuk saat ini:

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

Baris baru dipisahkan dan ruang yang diakhiri benar-benar valid. +1
trichoplax

7

CJam, 27 byte

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

Mengambil input sebagai daftar gaya-10 CJam dasar. Uji di sini. Atau, jalankan semua test case (skrip membuang output yang diharapkan dan mengonversi format input seperlunya).

Penjelasan

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.

Bukankah output harus bitum maksimum dan minimum?
DavidC

1
@ DavidVarraher Tidak, lihat contohnya. Outputnya harus berupa angka yang memiliki representasi biner 1dalam bit tersebut yang sesuai dengan bidang bit tempat minima dan maxima terjadi.
Martin Ender 3-15

6

JavaScript (ES6), 215 185 176 byte

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

Pemakaian

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

Penjelasan

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
Selamat datang di PPCG! Saya melihat beberapa cara agar ini bisa dibuat lebih pendek. 1) Saat mendefinisikan fungsi panah dengan satu parameter, Anda tidak perlu tanda kurung di sekitarnya. f=(a)=>{}= f=a=>{}2) Anda dapat mengubah for...inloop menjadi for...ofloop, menyimpan beberapa byte: for(i in a)for(b=a[i]...= for(i of a)for(b=i..., for(i in s)r=s[i],d=...= for(r of s)d=...3) Bitwise ATAU |otomatis berubah menjadi 1 dan false ke 0, jadi o+=r==q|r==d?1:0;sama dengan o+=r==q|r==d;.
ETHproduk

1
Pada akhirnya Anda dapat membuat: return parseInt(o,2)ke:return+('0b'+o)
Downgoat

1
Untuk menyimpan 2 byte, Anda bisa menggantinya s[l-d-1]=(s[l-d-1]|0)dengan s[T=l-d-1]=(s[T]|0). Untuk mencukur lebih banyak 2, ganti b=i.toString(2),l=b.length,d=ldengan d=l=(b=i.toString(2)).length.
Ismael Miguel

4

Julia, 141 byte

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

Tidak Disatukan:

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 bytes

Simpl ified komentar. Masukan dalam Biner, tidak ada penerjemah yang bekerja saat ini. Semoga komentarnya cukup.

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

Oktaf, 50 byte

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

Contoh:

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

Saya ingin melihat penjelasan untuk yang satu ini ...
trichoplax

2
@trichoplax Saya tidak terlalu pintar dengan matlab / oktaf, tapi mudah-mudahan ini membantu: @(a)mendefinisikan fungsi anonim yang mengambil vektor input a. ["" memaksa output menjadi sebuah string (saya percaya). (b=sum(a-48))mendefinisikan bmenjadi vektor yang mengandung bitum. b==max(b)akan menjadi vektor yang memiliki 1di tempat tertentu jika bitum ada maksimum, dan 0sebaliknya. b(b>0)adalah vektor dari setiap elemen blebih besar dari 0, jadi b==min(b(b>0))adalah vektor yang mengandung 1ketika bitum adalah minimum, dan 0sebaliknya. Maka itu ATAU bersama, dan +48untuk ASCII.
BrainSteel

@BrainSteel semuanya masuk akal sekarang - terima kasih
trichoplax

Terkadang saya lupa betapa berbedanya Oktaf dan MATLAB. Saya kira saya harus benar-benar mulai menggunakan Oktaf untuk bermain golf di masa depan, upaya MATLAB terpendek saya adalah 60 byte karena Anda tidak dapat menggunakan penugasan sebaris dan berakhir dengan function o=b(i)(baris baru)r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
Sanchises

3

JavaScript (ES6), 158

Fungsi dengan parameter array numerik, mengembalikan nomor. Dengan jumlah byte yang sama itu bisa mendapatkan parameter array string (mengandung basis 2 representasi) dan mengembalikan basis 2 string - hanya memindahkan .toString(2)di akhir setelah r.

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

// More readable

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

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

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


3

Haskell, 198 182 178 161 karakter

Saya masih pemula dalam bermain golf. Hanya 80 reputasi yang berasal dari jawaban.

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)

Bagaimana cara kerjanya.

Alih-alih padding, saya membalikkan array kemudian saya tambahkan menggunakan yang ditentukan pengguna (&). Saya tidak menggunakan foldl1 (zipWith (+)) yang lebih pendek karena zipWith akan menghapus item superflous. Kemudian saya menemukan maksimum dan bukan nol minimum, yang juga membutuhkan fungsi yang ditentukan pengguna. Kemudian saya mencocokkan item dengan maksimum dan bukan nol minimum, 1 jika cocok, 0 jika tidak cocok. Kemudian kita membalikkan dan mengubahnya menjadi angka biner.

MELAKUKAN:

  1. Menggunakan Data.List

2
Dalam definisi k, chanya digunakan sekali, jadi tidak perlu dimasukkan ke dalam whereklausa. Menggunakannya secara langsung: ...||(x==a#b).... Mengapa kurung kurawal? Dalam l: concat.map showadalah concatMap showatau bahkan lebih baik >>=: l=(>>=show).v.... (Catatan: ada juga =<<yang melakukan hal yang sama, tetapi dengan argumen terbalik:) (show=<<).v.... >>=dan =<<bekerja dalam konteks daftar di sini dan melakukan hal-hal yang berbeda dalam fungsi atau konteks lainnya.
nimi

2
Anda dapat mengganti []dalam kasus terakhir dengan &dan #dengan _: b&_=bdan _#l=l.
nimi

2
(x==b)||(x==c)(atau (x==b)||(x==a#b)ketika Anda menghapus c) dapat digantikan oleh elem x[b,c](resp:) elem x[b,a#b].
nimi

2
u=maximumdan k a=m(\x->fromEnum$elem x[u a,a#u a])aharus bekerja.
nimi

1
Jangan lakukan _&a=a, itu harus tetap []&a=a, kalau tidak daftar pertama hilang jika yang kedua kosong. Gunakan _hanya dalam kasus terakhir - mungkin itu kesalahan Anda.
nimi

3

Python 3, 181 126 122 byte

(Saya mengambil sebagian besar pemotongan byte byte karena sudah agak konyol.) 21 byte off berkat 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)

Sedikit kurang golf:

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

Input diharapkan dalam biner dengan hanya spasi yang memisahkan angka. Output dalam biner juga.


3

Javascript, 154 150 byte

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

Terima kasih untuk metode edc65 untuk perhitungan min / max, ini mempersingkat kode saya dengan 4 byte.

Penjelasan

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 bagus. Aritmatika bit mengalahkan konversi string sejauh ini. Dan saya melihat 2 cara untuk mempersingkat lebih banyak.
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

Bahkan lebih baik! Saya perlu belajar lebih banyak tentang golf untuk loop, masih belum digunakan untuk membajak instruksi.
Naouak

3

ShapeScript , 186 byte

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

Bahasa yang penting dan tidak berguna untuk operator yang penting dan tidak berguna.

I / O dalam biner. Program ini mengharapkan setiap nomor pada baris terpisah, masing-masing berakhir dengan linefeed.

Cobalah online!

Uji kasus

$ 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

Saya tidak tahu sampah apa yang Anda sebut bahasa , tapi saya menyukainya!
fase

2

APL, 27 byte

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

Ini adalah fungsi monadik yang mengambil daftar bilangan bulat desimal dan mengembalikan biplex desimal mereka.

Cobalah online di demo ngn / apl .

Bagaimana itu bekerja

                     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

Bahasa Wolfram, 113 byte

Versi ini mengambil input dari jendela sembulan, dengan angka yang dimasukkan dalam bentuk "{x, y, z, ...}", (tanpa tanda kutip).

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

Memasukkan:

jendela popup dinamis

Keluaran:

keluaran

Mengambil input dalam Manipulasi dinamis sebagai string dari bentuk "{x, y, z}" dengan x, y, dan z sebagai bilangan bulat basis 10 (dengan atau tanpa angka nol di depan). Outputnya juga di base 10.

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

contoh

Ada cara lain untuk memasukkan ini dengan cara yang akan menghemat jumlah karakter, tapi saya pikir solusi ini adalah penggunaan elegan dari GUI dinamis yang melakukan perhitungan

Jika Anda ingin menjalankan ini di cloud, kami dapat menggunakan 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

Penyebaran Cloud membawa jumlah karakter hingga 256 namun ...

Input ke FormPage juga merupakan string dari bentuk "{x, y, z}" dengan x, y, dan z menjadi bilangan bulat basis 10.

Saya menggunakan cloud ini sendiri dan Anda dapat mencobanya di https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781

contoh cloud


Saya telah menguji tautan cloud tanpa nol terkemuka dan masih dengan benar menghasilkan 3.
trichoplax

Jika Anda memiliki kode yang lebih pendek tanpa GUI, Anda dapat mengeditnya menjadi jawaban ini untuk meningkatkan skor Anda, dan tetap meninggalkan versi GUI dalam jawaban Anda sebagai contoh alternatif untuk menunjukkan apa yang mungkin. Terbaik dari kedua dunia ...
trichoplax

@trichoplax Tercatat, saya menambahkan apa yang saya pikir adalah versi terpendek dengan Input []. Bisa juga secara hipotetis mengharapkan angka-angka untuk disimpan dalam variabel, yang juga bisa mengurangi jumlah karakter, tapi kemudian itu ambigu mengenai bagaimana Anda memasukkan input ke dalamnya saya pikir
Ian Johnson

Menyimpan angka-angka dalam variabel bukan salah satu metode input default ... Sehingga langkah tambahan tidak tersedia, tetapi apa yang Anda miliki sejauh ini bagus :)
trichoplax

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

Dibutuhkan dalam ruang angka biner terbatas.

Versi tidak disatukan:

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

Program yang lengkap, dimasukkan sebagai argumen baris perintah - dipisahkan dengan spasi - dalam desimal.

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

Lebih mudah dibaca:

using System.Linq;

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

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

1

Ruby, 127 byte

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

Mengambil array sebagai input.


1

CoffeeScript, 194 byte

Mengambil input sebagai angka biner yang dipisahkan koma, menghasilkan dalam biner.

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

Cobalah.


1

GolfScript, 46 byte

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

Cobalah online di Web GolfScript .

Uji kasus

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

1

C ++, 192 byte

Menerima input array integer 32 bit yang tidak ditandatangani, dan sejumlah item dalam array itu.

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

Tidak Disatukan:

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 saya mengubahnya.
MegaTom
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.