Biplex: Önemli bir işe yaramaz operatör


33

Giriş

  • Her biri 1 - 2 32 - 1 (dahil) aralığında 1 - 255 arasında pozitif tamsayı (dahil) listesi .
  • Giriş formatınızın test senaryolarıyla aynı olması gerekmez.
  • Baştaki sıfır olmadan giriş kabul edilmesi gerekir.
  • Önde gelen sıfır içeren girişlerin kabul edilmesi gerekli değildir.
  • Tamsayılar arasında istediğiniz sınırlayıcıyı kullanabilirsiniz.
  • Bir tamsayı bir dize ile temsil edilebilir, ancak belirli bir tamsayıdaki bireysel rakamların bitişik olması gerekir.
  • Çıkışın da bu tabanda olması koşuluyla, giriş için herhangi bir tabanı (ikili ve unary dahil) kullanmayı seçebilirsiniz.

Çıktı

  • Tek bir tamsayı.
  • Çıktıda baştaki sıfır olmamalıdır.
  • Çıkış, girişle aynı temelde olmalıdır.
  • Çıktı istediğiniz şekilde hesaplanabilir ancak aşağıdaki hesaplamanın sonucuyla eşleşmelidir:

Biplex'in hesaplanması

  • Bir ikili gösterimin bitleri, sıfırdan başlayarak sağdan numaralandırılır, bu yüzden i i , 2 i'yi temsil eden sütundadır .
  • İ inci Bitsum toplamıdır i inci giriş numaraları her bir ikilik bit.
  • Bitsum maksimum bitsums tarafından alınan en yüksek değerdir.
  • Bitsum az düşük olan sıfır olmayan bitsums tarafından alınan bir değer.
  • İ inci çıkışının ikili temsil rakamdır:
    • 1 ise i inci Bitsum Bitsum maksimum veya Bitsum az eşittir.
    • Aksi halde 0.

Çalıştı örnek

Bu örnek giriş ve çıkış için ikili kullanır.

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

En yüksek bit değeri 3, en düşük bit değeri 1, bu nedenle çıktının her yeri 1s, bit sayısı 3 veya 1, 0'ı her yerdedir.


Test durumları

Test durumları şu şekildedir:

Input => Output

İkili test durumları:

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

Ondalık olarak aynı test durumları:

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

Liderler Sıralaması

Martin Lider Tablosu Parçacığına Teşekkürler


Operatör, sohbetin tartışılmasının ardından ikili düzlem ekstrema için kısa olan biplex olarak adlandırıldı .


Girişin, örnekte olduğu gibi ikili olarak olmasını isteyebilir miyiz?
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. Yani evet, bunun için gitmek :)
trichoplax

[[1,0,1], [1,1,0,0], [1,0,0,1]] gibi gösterimler kullanabilir miyiz?
Akangka

Muhtemelen değil. En kısıtlayıcı olanı varsayalım.
Akangka

@HristiyanIrvan Girdi, tamsayılar şeklinde olmalıdır (her biri bitişik basamaklardan oluşur). Bir tamsayı bir dize olarak gösterilebilir, ancak rakamlar arasında hiçbir ayırıcı olmamalıdır.
trichoplax

Yanıtlar:


1

Jöle, rakipsiz

14 bytes Bu cevap yarışmacı değil, çünkü sorun Jelly'in yaratılmasından önce geldi.

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

Çevrimiçi deneyin!

Nasıl çalışır

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.                

Tam olarak nasıl yargılanacağına dair bir anlaşmazlık olsa da, bu meta soru topluluğun, dilin oluşturulmasını önlediğinde, artık cevapları rakipsiz olarak işaretlemekten yana olduğunu gösteriyor. Bu nedenle bu cevabı kabul ediyorum.
trichoplax

11

Pyth, 26 25 bayt

JsM.T_MjR2Qi_}RhM_BS-J0J2

Çevrimiçi deneyin: Gösteri veya Test Paketi

açıklama

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
_BKullanım parlak
isaacg

9

J, 31 30 24 23 21 bayt

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

Bu, ondalık sayıların listesini alan ve ondalık sayılarını döndüren tek parça fiildir.

Doğrudan 4 byte tasarruf sağlayan ve 2 daha yol kat eden önerileri için @ Zgarb'a teşekkürler!

2 bayt daha attığınız için @randomra'ya teşekkürler!

Test durumları

   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

Nasıl çalışır

                 &.    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 bayt

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

Giriş ve çıkış ondalık basamaktadır. Burada dene.

açıklama

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

Eski versiyon:

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

Burada dene!

açıklama

Bunun asıl amacı, dizi özelliğinin ( a A) en az ve en yüksek bulunan bitleri depolamak için yoğun şekilde kullanılmasıdır ( ve daha sonra 1s ve 0s, öndeki 0s'nin iki yere boşaltılmasıyla uygun şekilde çıkarılır .

$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

Çevrimiçi tercümandan bu, ondalık sayı alıyor ve ikili çıktı veriyor mu?
trichoplax

Evet. Bunu değiştirmeme gerek var mı?
El'endia Starman

1
Ahhh, kurşun noktalarında onu arıyordum ve ilk cümlede özledim. Bugün bir gün tamir edeceğim.
El'endia Starman

1
Sabit! Ve sadece iki ekstra byte ile! : D
El'endia Starman

1
+ 1'imi kazandınız; Minkolang'ı öğrendiğim için memnunum.
lirtosiast

8

Brainfuck , 619 bayt

İlk cevap çok uzun zamandır burada, bu yüzden iyi bir tane yapacağımı düşündüm!

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

... Kazandım mı?

Bu program 10, her ikili sayıdan sonra yeni satırlar (ASCII ) bekler 32ve sonunda bir boşluk (ASCII ) gerektirir .

Test çalıştırması:

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

(Program sonunda eklenen her durumdan sonra eklenen yeni satırlar ++++++++++.)

açıklama

Hala devam eden bir çalışma, ama yavaş bir çalışma. Zaman eksikliği nedeniyle, şu anda bir açıklama için yeterli olacak olan bu programı yazarken yaptığım notları yeni kopyaladım:

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

Newline ayrılmış ve boşluk sonlandırıldı tamamen geçerlidir. +1
trichoplax

7

CJam, 27 bayt

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

Temel 10 CJam tarzı liste olarak girdiyi alıyor. Burada test et. Alternatif olarak, tüm test durumlarını çalıştırın (script beklenen çıktıyı atar ve giriş biçimini gerektiği gibi dönüştürür).

açıklama

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.

Çıktı bit ve maksimum bit olmamalı mı?
DavidC

1
@DavidCarraher Hayır, örneklere bakın. Çıktı 1, minima ve maksima'nın gerçekleştiği bit düzlemlerine karşılık gelen bitlerde ikili gösterimi olan bir sayı olmalıdır .
Martin Ender

6

JavaScript (ES6), 215 185 176 bayt

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

kullanım

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

açıklama

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'ye Hoşgeldiniz! Bunun daha kısa hale getirilmesi için birkaç yol görüyorum. 1) Bir ok fonksiyonunu bir parametreyle tanımlarken, etrafındaki parantezlere ihtiyacınız yoktur. f=(a)=>{}= f=a=>{}2) for...inDöngülerinizi döngülere dönüştürebilir for...of, birkaç bayt kaydedebilirsiniz : 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) Bitsel olarak VEYA |otomatik olarak 1'e doğru ve 0'a yanlış o+=r==q|r==d?1:0;olur, aynı şekilde o+=r==q|r==d;.
ETHproductions

1
Sonunda yapabilecekleriniz: return parseInt(o,2)için:return+('0b'+o)
Downgoat

1
2 bayt kaydetmek için s[l-d-1]=(s[l-d-1]|0)ile değiştirebilirsiniz s[T=l-d-1]=(s[T]|0). 2 daha tıraş için, değiştirmek b=i.toString(2),l=b.length,d=lile d=l=(b=i.toString(2)).length.
Ismael Miguel

4

Julia, 141 bayt

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 bayt

Simpl yorumlarınızı ified. İkili giriş, şu anda çalışan tercüman yok. Umarım yorumlar yeterlidir.

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

Oktav, 50 bayt

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

Örnek:

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

Bunun için bir açıklama görmek isterdim ...
trichoplax

2
@trichoplax Ben matlab / oktav ile çok zeki değilim, ama umarım bu yardımcı olur: @(a)bir giriş vektörü alır anonim bir işlev tanımlar a. ["" çıktıyı bir dizgeye zorlar (inanıyorum). bitleri içeren vektör olarak (b=sum(a-48))tanımlar b. bit değeri maksimum, aksi takdirde varsa, belirli bir yerde bulunan b==max(b)bir vektör olacaktır . ondan daha büyük olan her elementin bir vektörüdür , yani bit değeri minimum olduğunda ve içeren bir vektördür . O zaman birlikte OR'dü ve ASCII için. 10b(b>0)b0b==min(b(b>0))10+48
BrainSteel

@BrainSteel artık her şey anlam ifade ediyor - teşekkür ederim
trichoplax

Bazen Octave ve MATLAB'ın ne kadar farklı olduğunu unutuyorum. Satır içi atama kullanmak ve ile bitirmek olamaz çünkü ben gerçekten gelecekte golf için Octave kullanmaya başlamak sanırım, benim en kısa MATLAB girişimi 60 bayt function o=b(i)(yeni satır)r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
Sanchises

3

JavaScript (ES6), 158

Sayı döndüren, sayı döndüren bir işlev. Aynı byte sayımı ile bir string array parametresi (temel 2 rapresrasyonları içeren) alabilir ve bir base 2 dizesini döndürür - .toString(2)en sondaki ucu yalnızca hareket ettirin 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

Hala golf oynamaya yeni başlıyorum. Sadece 80 itibar cevaptan geliyor.

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)

O nasıl çalışır.

Dolgu yerine diziyi tersine çevirip kullanıcı tanımlı (&) kullanarak ekliyorum. Ben ziplith superflous öğeyi sileceği için foldl1 (zipWith (+)) daha kısa kullanmıyorum. Sonra kullanıcı tanımlı işlevi gerektiren maksimum ve sıfır olmayan asgari değeri buldum. Sonra öğeyi maksimum ve sıfır olmayan minimum, eşleşirse 1, eşleşmiyorsa 0 ile eşleştiririm. Sonra tersine çevirip ikili sayıya çeviririz.

YAPMAK:

  1. kullanma Data.List

2
Tanımında ise k, cgerek koymak için yalnızca bir kez kullanılır wheremaddesi. Doğrudan kullanın: ...||(x==a#b).... Neden kaşlı ayraçlar? In l: concat.map showolduğu concatMap showdaha da iyi ya >>=: l=(>>=show).v.... (Not: =<<Aynı şeyi yapan da var , ancak argümanlar ters çevrilmiş:) (show=<<).v.... >>=ve =<<burada liste bağlamında çalışın ve işlev veya diğer bağlamlarda farklı şeyler yapın.
nimi

2
Ve ile []son durumlarda değiştirebilirsiniz : ve . &#_b&_=b_#l=l
nimi

2
(x==b)||(x==c)(veya (x==b)||(x==a#b)çıkardığınızda c) ile değiştirilebilir elem x[b,c](cevap:) elem x[b,a#b].
nimi

2
u=maximumve k a=m(\x->fromEnum$elem x[u a,a#u a])açalışması gerekir.
nimi

1
Yapmayın _&a=a, kalmalı []&a=a, ikincisi boşsa ilk liste kaybolur. _Sadece son durumda kullanın - belki de bu sizin hatanızdır.
nimi

3

Python 3, 181 126 122 bayt

(Bayt sayısı kesiklerinin çoğunu çıkardım çünkü biraz saçma oldu.) Sp3000 sayesinde 21 bayt !

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

Biraz daha az golf oynadı:

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

İkili sayılarda giriş sadece sayıları ayıran boşluklarla bekleniyor. Çıktı da ikilidir.


3

Javascript, 154 150 bayt

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)

Min / max hesaplama için edc65 yöntemi için teşekkürler, kodumu 4 bayt kısalttı.

açıklama

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 güzel. Bit aritmetiği, dize dönüşümünü çok fazla atar. Ve onu daha fazla kısaltmanın 2 yolunu görüyorum.
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

Daha iyi! Döngüler için golf oynamak hakkında daha fazla şey öğrenmeye ihtiyacım var, yine de talimat almak için kullanmıyorum.
Naouak

3

ShapeScript , 186 bayt

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

Önemli, işe yaramaz bir işleç için önemli, işe yaramaz bir dil.

G / Ç ikilidir. Program her sayının ayrı bir satırda olmasını ve her birinin satır besleme ile bitmesini beklemektedir.

Çevrimiçi deneyin!

Test durumları

$ 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

Ben bu çöp bir çağrı olduğunu bilmiyorum dili , ama buna bayılıyorum
faz

2

APL, 27 bayt

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

Bu, ondalık sayıların listesini alan ve ondalık sayılarını veren monadik bir işlevdir.

Ngn / apl demosunda çevrimiçi olarak deneyin .

Nasıl çalışır

                     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 Dili, 113 bayt

Bu sürüm açılır pencereden giriş alır ve sayıları "{x, y, z, ...}" şeklinde (tırnak işaretleri olmadan) girilir.

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

Giriş:

açılır pencere dinamiği

Çıktı:

çıktı

Dinamik bir Manipülasyonda, "{x, y, z}" formunun bir dizgisi olarak, x, y ve z ile 10 tabanlı tamsayılar (baştaki sıfırlarla veya sıfır olmadan) girdi alır. Çıktı ayrıca taban 10'dadır.

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

örnek

Bunu karakter sayısından tasarruf sağlayacak şekilde girmenin başka yolları da var, ancak bence bu çözüm hesaplamayı yapan dinamik bir GUI'nin zarif bir kullanımıdır.

Bunu bulutta çalıştırmak istiyorsanız, CloudDeploy'u kullanabiliriz:

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

Cloud dağıtımı karakter sayısını 256'ya çıkardı ancak ...

FormPage'e giriş, aynı zamanda "{x, y, z}" formunun bir dizesidir, x, y ve z, taban 10 tamsayılarıdır.

Ben kendim bulut konuşlandırdım ve https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781 adresinde deneyebilirsiniz

bulut örneği


Ben, başında sıfır olmadan bulut bağlantısını test ettik ve hala doğru 3. verir
placozoa

GUI olmadan daha kısa bir kodunuz varsa, puanınızı iyileştirmek için bu cevabı düzenleyebilir ve hala mümkün olanı göstermek için GUI sürümünü alternatif bir örnek olarak bırakabilirsiniz. Her iki dünyanın
iyisi

@trichoplax Noted, Input [] ile en kısa sürüm olduğunu düşündüğüm şeyi ekledim. Ayrıca rakamların karakter sayısının düşmesine neden olabilecek bir değişkende saklanacağını varsayımsal olarak da bekleyebilir miyiz, ancak daha sonra girdilere nasıl girdiğinize dair belirsizlikler olduğunu düşünüyorum
Ian Johnson

Sayıların bir değişkende saklanması varsayılan girdi yöntemlerinden biri değildir ... Bu yüzden ek adım mevcut değil, ama şu ana kadar sahip olduğunuz şey harika :)
trichoplax 12:15

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

Uzayda sınırlı ikili sayıları alır.

Ungolfed versiyonu:

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

Komple bir program, komut satırı argümanları - boşluk ile ayrılmış - ondalık olarak girin

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

Daha okunabilir:

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 bayt

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

Girdi olarak bir dizi alır.


1

CoffeeScript, 194 bayt

Girişi komaya ayrılmış ikili sayılar olarak alır, ikili olarak çıkar.

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

Dene.


1

GolfScript, 46 bayt

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

Çevrimiçi olarak Web GolfScript'te deneyin .

Test durumları

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

Bir 32 bit işaretsiz tamsayı dizisi girişi ve bu dizideki öğe sayısını kabul eder.

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 Ben değiştirdim.
MegaTom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.