Biplex: un opérateur important et inutile

33

Contribution

  • Liste de 1 à 255 entiers positifs (inclus), chacun compris entre 1 et 2 32 - 1 (inclus).
  • Votre format d'entrée n'a pas besoin d'être identique aux cas de test.
  • La saisie sans zéros est requise pour être acceptée.
  • La saisie avec des zéros au début n'est pas obligée d'être acceptée.
  • Vous pouvez utiliser le délimiteur que vous souhaitez entre les entiers.
  • Un entier peut être représenté par une chaîne mais les chiffres individuels d'un entier spécifique doivent être contigus.
  • Vous pouvez choisir d'utiliser n'importe quelle base pour l'entrée (y compris binaire et unaire), à ​​condition que la sortie se trouve également dans cette base.

Sortie

  • Un seul entier.
  • La sortie ne doit pas avoir de zéros au début.
  • La sortie doit être dans la même base que l'entrée.
  • La sortie peut être calculée comme vous le souhaitez mais doit correspondre au résultat du calcul suivant:

Calcul du biplex

  • Les bits d'une représentation binaire sont numérotés à partir de la droite à partir de zéro, le bit i est donc dans la colonne représentant 2 i .
  • Le i ème BITSUM est la somme des i ème bits des représentations binaires de chacun des nombres d'entrée.
  • Le maximum de bits est la valeur la plus élevée prise par les bits.
  • Le minimum de somme est la valeur la plus basse non nulle prise par les sommes.
  • La i ième chiffre de la représentation binaire de la sortie est la suivante :
    • 1 si le i ème BITSUM est égale au maximum ou le minimum BITSUM BITSUM.
    • 0 sinon.

Exemple travaillé

Cet exemple utilise binaire pour les entrées et les sorties.

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

Le nombre maximal de bits est de 3 et le nombre minimal de bits est de 1, de sorte que la sortie comporte des 1 partout où le nombre total de bits est de 3 ou 1, et des 0 partout ailleurs.


Cas de test

Les cas de test sont sous la forme:

Input => Output

Les cas de tests en binaire:

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

Les mêmes cas de test en décimal:

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

Classement

Merci à l'extrait de classement de Martin


L'opérateur a été nommé biplex, abréviation d'extrema de plan binaire, à la suite d'une discussion en discussion .

trichoplax
la source
Peut-on exiger que l'entrée soit en binaire, comme dans l'exemple?
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. Alors oui,
foncez
Pouvons-nous utiliser une notation comme [[1,0,1], [1,1,0,0], [1,0,0,1]]?
Akangka
Probablement pas. Supposons le plus restrictif.
Akangka
@ChristianIrwan L'entrée doit être sous la forme d'entiers (chacun composé de chiffres contigus). Un entier peut être représenté sous forme de chaîne, mais il ne devrait pas y avoir de séparateur entre les chiffres.
Trichoplax

Réponses:

1

Gelée, non en compétition

14 octets Cette réponse est sans concurrence, car le défi était antérieur à la création de Jelly.

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

Essayez-le en ligne!

Comment ça marche

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.                
Dennis
la source
Bien qu'il y ait un désaccord sur la manière de la juger, cette méta-question suggère que la communauté est fortement en faveur de ne plus marquer les réponses comme non concurrentes lorsque le défi est antérieur à la création de la langue. J'accepte donc cette réponse.
Trichoplax
11

Pyth, 26 à 25 octets

JsM.T_MjR2Qi_}RhM_BS-J0J2

Essayez-le en ligne: démonstration ou suite de tests

Explication

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
Jakube
la source
1
L' _Butilisation est brillante
isaacg
9

J, 31 30 24 23 21 octets

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

Il s'agit d'un verbe monadique tacite qui prend une liste d'entiers décimaux et renvoie leur biplex décimal.

Merci à @Zgarb pour ses suggestions, qui ont permis d’économiser 4 octets directement et d’ouvrir la voie à 2 autres!

Merci à @randomra pour avoir joué 2 octets de plus!

Cas de test

   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

Comment ça marche

                 &.    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.
Dennis
la source
9

Minkolang 0.10 , 109 79 octets

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

L'entrée et la sortie sont en décimal. Essayez ici.

Explication

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

Ancienne version:

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

Essayez-le ici!

Explication

Le noeud du problème est que la fonction array est fortement utilisée ( a A) pour stocker les bits, dont les minimum et maximum sont trouvés, puis 1s et 0s sont générés de manière appropriée, avec un vidage des 0s principaux à deux endroits.

$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
la source
A partir de l'interprète en ligne, cela prend-il une entrée décimale et donne-t-il une sortie binaire?
Trichoplax
Oui. Dois-je changer cela?
El'endia Starman
1
Ahhh, je cherchais cela dans les points de balle et je l'ai manqué dans la toute première phrase. Je vais le réparer un jour aujourd'hui.
El'endia Starman
1
Fixé! Et avec seulement deux octets supplémentaires! : D
El'endia Starman
1
Vous avez gagné mon +1; Je suis content d'apprendre sur Minkolang.
lirtosiast
8

Brainfuck , 619 octets

La première réponse a été trop longue ici, alors j'ai pensé en faire une bonne!

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

Est-ce que ... Est-ce que j'ai gagné?

Ce programme attend les nouvelles lignes (ASCII 10) après chaque nombre binaire et nécessite un espace (ASCII 32) à la fin.

Tests effectués:

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

(Newlines ajoutées après chaque cas avec ++++++++++.ajouté à la fin du programme)

Explication

Encore un travail en cours, mais un lent. Par manque de temps, je viens de copier les notes que j'ai prises lors de l'écriture de ce programme, ce qui suffira pour une explication pour le moment:

[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       ]
<<<<->>~<<<<<<~+[->[-]<[->+<]<[->>[-]+<<]<<+]>-[+>>>-]++[->++++++[-<++++++++>]<.>>>+]
BrainSteel
la source
Newline séparé et espace terminé est parfaitement valide. +1
trichoplax
7

CJam, 27 octets

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

Accepte les entrées sous forme de liste de style CJam base 10. Testez-le ici. Vous pouvez également exécuter tous les cas de test (le script ignore la sortie attendue et convertit le format d'entrée si nécessaire).

Explication

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.
Martin Ender
la source
La sortie ne devrait-elle pas être le maximum et le minimum de bits?
DavidC
1
@DavidCarraher Non, voir les exemples. La sortie doit être un nombre dont la représentation binaire a 1dans ces bits s qui correspondent aux plans de bits où les minima et les maxima se sont produits.
Martin Ender
6

JavaScript (ES6), 215 185 176 octets

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

Usage

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

Explication

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
}
utilisateur81655
la source
3
Bienvenue chez PPCG! Je vois deux façons de réduire cela. 1) Lorsque vous définissez une fonction de flèche avec un paramètre, vous n’avez pas besoin de parenthèses. f=(a)=>{}= f=a=>{}2) Vous pouvez transformer vos for...inboucles en for...ofboucles en économisant quelques octets: 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) OU au niveau du bit OU |change automatiquement la valeur true à 1 et la valeur false à 0, de sorte que o+=r==q|r==d?1:0;le même résultat soit o+=r==q|r==d;.
ETHproductions
1
À la fin, vous pouvez faire return parseInt(o,2):return+('0b'+o)
Downgoat
1
Pour économiser 2 octets, vous pouvez remplacer s[l-d-1]=(s[l-d-1]|0)par s[T=l-d-1]=(s[T]|0). Pour raser plus de 2, remplacez b=i.toString(2),l=b.length,d=lpar d=l=(b=i.toString(2)).length.
Ismael Miguel
4

Julia, 141 octets

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
Alex A.
la source
3

Simplex v.0.7 , 38 octets

Simpl Ified commentaires. Entrée en binaire, aucun interprète ne fonctionne pour le moment. Espérons que les commentaires sont suffisants.

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 
Conor O'Brien
la source
3

Octave, 50 octets

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

Exemple:

octave:1> g = @(a)["" ((b=sum(a-48))==max(b)|b==min(b(b>0)))+48] ;
octave:2> g(["10010010010010010010010010010010"; "10101010101010101010101010101010"; "11011011011011011011011011011011"])
ans = 11100011100011100011100011100011
Alephalpha
la source
Je serais ravi de voir une explication à ce sujet ...
trichoplax
2
@trichoplax Je ne suis pas trop brillant avec matlab / octave, mais j'espère que cela aide: @(a)définit une fonction anonyme qui prend un vecteur d' entrée a. ["" force la sortie dans une chaîne (je crois). (b=sum(a-48))définit bcomme étant le vecteur contenant les bits. b==max(b)sera un vecteur ayant un 1dans un endroit donné si le bitum il y a un maximum, et 0sinon. b(b>0)est un vecteur de chaque élément bsupérieur à 0, tout b==min(b(b>0))comme un vecteur contenant un 1lorsque la somme de bits est le minimum, et 0sinon. Ensuite, c'est OR'd ensemble, et +48pour ASCII.
BrainSteel
@BrainSteel tout a du sens maintenant - merci
trichoplax
Parfois, j'oublie à quel point Octave et MATLAB sont différents. J'imagine que je devrais vraiment commencer à utiliser Octave pour le golf à l'avenir. Ma plus petite tentative de MATLAB est de 60 octets, car vous ne pouvez pas utiliser l'attribution inline et vous retrouver avec function o=b(i)(nouvelle ligne)r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
Sanchises
3

JavaScript (ES6), 158

Une fonction avec un paramètre de tableau numérique, renvoyant un nombre. Avec le même nombre d'octets, il pourrait obtenir un paramètre de tableau de chaînes (contenant des représentations en base 2) et renvoyer une chaîne en base 2 - il suffit de déplacer le .toString(2)à la fin après 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>

edc65
la source
3

Haskell, 198 182 178 161 personnage

Je suis toujours débutant au golf. Seulement 80 points de réputation proviennent de la réponse.

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)

Comment ça marche.

Au lieu de remplir, j'inverse le tableau, puis j'ajoute en utilisant user (&). Je n'utilise pas foldl1 (zipWith (+)), qui est plus court car zipWith supprimera l'élément superflous. Ensuite, je trouve le minimum et un minimum non nul, qui nécessitait également une fonction définie par l'utilisateur. Ensuite, je fais correspondre l'élément avec le maximum et un minimum différent de zéro, 1 s'il correspond, 0 s'il ne correspond pas. Ensuite, nous inversons et transformons-le en nombre binaire.

FAIRE:

  1. En utilisant Data.List
Akangka
la source
2
Dans la définition de k, cn’est utilisé qu’une fois, il n’est donc pas nécessaire de le mettre dans la whereclause. Utilisez directement: ...||(x==a#b).... Pourquoi les accolades? Dans l: concat.map showest concatMap showou mieux encore >>=: l=(>>=show).v.... (Remarque: il y a aussi =<<ce qui fait la même chose, mais avec des arguments inversés:) (show=<<).v.... >>=et =<<travaillez dans un contexte de liste ici et faites différentes choses dans une fonction ou dans d'autres contextes.
nimi
2
Vous pouvez remplacer []dans les derniers cas de &et #avec _: b&_=bet _#l=l.
nimi
2
(x==b)||(x==c)(ou (x==b)||(x==a#b)lorsque vous supprimez c) peut être remplacé par elem x[b,c](resp:) elem x[b,a#b].
nimi
2
u=maximumet k a=m(\x->fromEnum$elem x[u a,a#u a])adevrait fonctionner.
nimi
1
Ne faites pas _&a=a, ça doit rester []&a=a, sinon la première liste est perdue si la seconde est vide. Utilisez _uniquement dans le dernier cas - c'est peut-être votre erreur.
nimi
3

Python 3, 181 126 122 octets

(J'ai éliminé la plupart des barres de décompte d'octets car cela devenait un peu ridicule.) 21 octets de moins grâce à 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)

Un peu moins joué au 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))

L'entrée est attendue en binaire avec seulement des espaces séparant les nombres. La sortie est également en binaire.

El'endia Starman
la source
3

Javascript, 154 150 octets

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)

Merci pour la méthode edc65 pour les calculs min / max, cela a raccourci mon code de 4 octets.

Explication

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
)
Naouak
la source
+1 sympa. L'arithmétique des bits bat de loin la conversion des chaînes. Et je vois 2 façons de le raccourcir davantage.
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
Encore mieux! J'ai besoin d'en savoir plus sur le golf pour les boucles, mais pas pour utiliser hijeck pour des instructions.
Naouak
3

ShapeScript , 186 octets

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

Un langage important et inutile pour un opérateur important et inutile.

I / O est en binaire. Le programme attend chaque numéro sur une ligne distincte, chacune se terminant par un saut de ligne.

Essayez-le en ligne!

Cas de test

$ 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
Dennis
la source
Je ne sais pas ce que cette poubelle est que vous appelez une langue , mais je l'aime!
phase
2

APL, 27 octets

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

C'est une fonction monadique qui prend une liste d'entiers décimaux et renvoie leur biplex décimal.

Essayez-le en ligne dans le démo ngn / apl .

Comment ça marche

                     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.
Dennis
la source
2

Wolfram Language, 113 octets

Cette version utilise les entrées d'une fenêtre contextuelle, les nombres étant entrés sous la forme "{x, y, z, ...}", (sans guillemets).

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

Contribution:

fenêtre popup dynamique

Sortie:

sortie

Prend une entrée dans une manipulation dynamique sous la forme d'une chaîne de la forme "{x, y, z}", avec x, y et z valant des entiers en base 10 (avec ou sans zéros non significatifs). La sortie est également en base 10.

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

Exemple

Il existe d'autres moyens de saisir cela de manière à économiser le nombre de caractères, mais je pense que cette solution est une utilisation élégante d'une interface graphique dynamique qui effectue le calcul.

Si vous voulez l'exécuter dans le cloud, nous pouvons utiliser 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

Le déploiement en nuage porte le nombre de caractères à 256 mais ...

L'entrée dans FormPage est également une chaîne de la forme "{x, y, z}", x, y et z étant des entiers en base 10.

Je l'ai déployé moi-même dans le cloud et vous pouvez l'essayer à l' adresse https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781.

exemple de nuage

Ian Johnson
la source
J'ai testé le lien cloud sans les zéros au début et il
affiche
Si vous avez un code plus court sans interface graphique, vous pouvez le modifier dans cette réponse pour améliorer votre score, tout en conservant la version de l'interface graphique dans votre réponse comme exemple alternatif pour montrer ce qui est possible. Le meilleur des deux mondes ...
trichoplax
@trichoplax Noted, j'ai ajouté ce que je pense être la version la plus courte avec Input []. On pourrait aussi supposer que les nombres seront stockés dans une variable, ce qui pourrait également réduire le nombre de caractères, mais il est alors ambigu de savoir comment vous saisissez l'entrée, je pense
Ian Johnson
Stocker les nombres dans une variable n'est pas l'une des méthodes de saisie par défaut ... Cette étape supplémentaire n'est donc pas disponible, mais ce que vous avez jusqu'à présent est géniale :)
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))

Il faut des nombres binaires délimités par des espaces.

Version non-golfée:

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'))
Morgan Thrapp
la source
1

C #, 255

Un programme complet, entré comme argument de ligne de commande - séparé de l’espace - en décimal.

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

Plus lisible:

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);
    }
}
edc65
la source
1

Ruby, 127 octets

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

Prend un tableau en entrée.

MegaTom
la source
1

CoffeeScript, 194 octets

Prend les entrées sous forme de nombres binaires séparés par des virgules, les sorties en binaires.

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

L'essayer

MegaTom
la source
1

GolfScript, 46 octets

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

Essayez-le en ligne sur Web GolfScript .

Cas de test

$ 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
Dennis
la source
1

C ++, 192 octets

Accepte l'entrée d'un tableau d'entiers non signés sur 32 bits et d'un nombre d'éléments dans ce tableau.

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;
}
MegaTom
la source
1
@trichoplax je l'ai changé.
MegaTom