Biplex: un importante operatore inutile


33

Ingresso

  • Un elenco compreso tra 1 e 255 numeri interi positivi (inclusi), ciascuno compreso tra 1 e 2 32 - 1 (incluso).
  • Il formato di input non deve essere identico ai casi di test.
  • È necessario accettare l'ingresso senza zeri iniziali.
  • Non è necessario accettare input con zeri iniziali.
  • Puoi usare qualsiasi delimitatore che desideri tra i numeri interi.
  • Un numero intero può essere rappresentato da una stringa ma le singole cifre di un numero intero specifico devono essere contigue.
  • È possibile scegliere di utilizzare qualsiasi base per l'input (inclusi binari e unari), purché anche l'output si trovi in ​​quella base.

Produzione

  • Un singolo numero intero.
  • L'output non deve avere zero iniziali.
  • L'output deve essere nella stessa base dell'input.
  • L'output può essere calcolato nel modo desiderato, ma deve corrispondere al risultato del seguente calcolo:

Calcolo del biplex

  • I bit di una rappresentazione binaria sono numerati da destra a partire da zero, quindi il bit i è nella colonna che rappresenta 2 i .
  • La i esima BITSUM è la somma dei i th bit delle rappresentazioni binarie di ciascuno dei numeri di ingresso.
  • Il massimo bitume è il valore più alto preso dai bitumi.
  • Il minimo di bit è il valore inferiore a zero preso dai bit.
  • La i esima cifra della rappresentazione binaria di uscita è:
    • 1 se l' i esimo BITSUM è uguale al massimo BITSUM o minimo BITSUM.
    • 0 altrimenti.

Esempio lavorato

Questo esempio utilizza binario per input e output.

Input:    100110
         1101110
         1100101
         _______
Bitsums: 2301321

Output:   101101

Il massimo di bitume è 3 e il minimo di bitume è 1, quindi l'uscita ha 1s ovunque che il bitume sia 3 o 1 e 0s ovunque.


Casi test

I casi di test sono nella forma:

Input => Output

I casi di test in binario:

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

Gli stessi casi di test in decimale:

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

Classifica

Grazie allo snippet della classifica di Martin


L'operatore si chiamava biplex, abbreviazione di extrema del piano binario, in seguito alla discussione in chat .


Possiamo richiedere che l'input sia binario, come nell'esempio?
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. Quindi sì,
provaci

Possiamo usare notazioni come [[1,0,1], [1,1,0,0], [1,0,0,1]]?
Akangka,

Probabilmente no. Assumi quello più restrittivo.
Akangka,

@ChristianIrwan L'input deve essere in forma di numeri interi (ciascuno composto da cifre contigue). Un numero intero può essere rappresentato come una stringa ma non dovrebbero esserci separatori tra le cifre.
trichoplax,

Risposte:


1

Gelatina, non competitiva

14 byte Questa risposta non è competitiva poiché la sfida precede la creazione di Jelly.

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

Provalo online!

Come funziona

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.                

Sebbene non ci sia accordo su come giudicarlo, questa meta domanda suggerisce che la comunità è fortemente favorevole a non contrassegnare più le risposte come non concorrenti quando la sfida precede la creazione della lingua. Accetto quindi questa risposta.
trichoplax,

11

Pyth, 26 25 byte

JsM.T_MjR2Qi_}RhM_BS-J0J2

Provalo online: Dimostrazione o Test Suite

Spiegazione

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
L' _Buso è brillante
isaacg

9

J, 31 30 24 23 21 byte

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

Questo è un verbo tacito e monadico che prende un elenco di numeri interi decimali e restituisce il loro biplex decimale.

Grazie a @Zgarb per i suoi suggerimenti, che ha salvato direttamente 4 byte e ha aperto la strada a altri 2!

Grazie a @randomra per giocare a golf con altri 2 byte!

Casi 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

Come funziona

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

Ingresso e uscita sono in decimali. Provalo qui.

Spiegazione

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

Vecchia versione:

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

Provalo qui!

Spiegazione

Il punto cruciale è che la funzione array viene utilizzata pesantemente ( a A) per memorizzare i bit, di cui si trovano il minimo e il massimo, quindi gli 1s e gli 0vengono emessi in modo appropriato, con il dumping degli 0s iniziali in due punti.

$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

Dall'interprete online, questo richiede input decimale e produce output binario?
trichoplax,

Sì. Devo cambiarlo?
El'endia Starman,

1
Ahhh, lo stavo cercando nei punti elenco e l'ho perso nella prima frase. Lo riparerò oggi.
El'endia Starman,

1
Fisso! E con solo due byte extra! : D
El'endia Starman,

1
Hai guadagnato il mio +1; Sono felice di conoscere Minkolang.
Lirtosiast

8

Brainfuck , 619 byte

Prima risposta da troppo tempo qui, quindi ho pensato di farne una buona!

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

Ho ... Ho vinto?

Questo programma prevede newline (ASCII 10) dopo ogni numero binario e richiede uno spazio (ASCII 32) alla fine.

Esecuzioni di test:

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

(Newline aggiunti dopo ogni caso con l' ++++++++++.aggiunta alla fine del programma)

Spiegazione

Ancora un lavoro in corso, ma lento. Per mancanza di tempo, ho appena copiato le note che ho preso durante la scrittura di questo programma, che per ora sarà sufficiente per una spiegazione:

[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 separato e spazio terminato è perfettamente valido. +1
trichoplax

7

CJam, 27 byte

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

Accetta input come un elenco in stile CJam di base 10. Provalo qui. In alternativa, eseguire tutti i casi di test (lo script ignora l'output previsto e converte il formato di input secondo necessità).

Spiegazione

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.

L'output non dovrebbe essere il massimo e il minimo del bitume?
DavidC,

1
@DavidCarraher No, vedi gli esempi. L'output dovrebbe essere un numero la cui rappresentazione binaria ha 1s in quei bit che corrispondono ai piani di bit in cui si sono verificati i minimi e i massimi.
Martin Ender,

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

uso

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

Spiegazione

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
Benvenuti in PPCG! Vedo un paio di modi in cui questo potrebbe essere ridotto. 1) Quando si definisce una funzione freccia con un parametro, non sono necessarie le parentesi attorno ad esso. f=(a)=>{}= f=a=>{}2) Potresti trasformare i tuoi for...inloop in for...ofloop, salvando alcuni 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) Bit a bit O |cambia automaticamente true in 1 e false in 0, quindi o+=r==q|r==d?1:0;è uguale a o+=r==q|r==d;.
ETHproductions

1
Alla fine puoi fare: return parseInt(o,2) a:return+('0b'+o)
Downgoat

1
Per salvare 2 byte, è possibile sostituirlo s[l-d-1]=(s[l-d-1]|0)con s[T=l-d-1]=(s[T]|0). Per radere più 2, sostituiscilo b=i.toString(2),l=b.length,d=lcon 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))

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 byte

Commenti ified semplici . Input in binario, nessun interprete al momento al lavoro. Speriamo che i commenti siano sufficienti.

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

Ottava, 50 byte

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

Esempio:

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

Mi piacerebbe vedere una spiegazione per questo ...
trichoplax

2
@trichoplax Non sono troppo brillante con matlab / ottava, ma spero che questo aiuti: @(a)definisce una funzione anonima che accetta un vettore di input a. ["" forza l'output in una stringa (credo). (b=sum(a-48))definisce bessere il vettore contenente i bitums. b==max(b)sarà un vettore che ha un 1in un determinato posto se il bitume esiste un massimo e un 0altro. b(b>0)è un vettore di ogni elemento bmaggiore di 0, quindi b==min(b(b>0))è un vettore che contiene un 1quando il bitume è il minimo, e 0altrimenti. Quindi è OR insieme e +48per ASCII.
BrainSteel,

@BrainSteel ora ha un senso - grazie
trichoplax

A volte dimentico quanto sono diversi Octave e MATLAB. Immagino che dovrei davvero iniziare a usare Octave per giocare a golf in futuro, il mio tentativo MATLAB più breve è di 60 byte perché non puoi usare l'assegnazione in linea e finire con function o=b(i)(newline)r=sum(i>48);o=['' (r==max(r)|r==min(r))+48];
Sanchises,

3

JavaScript (ES6), 158

Una funzione con un parametro di array numerico, che restituisce un numero. Con lo stesso numero di byte potrebbe ottenere un parametro array di stringhe (contenente rappresentazioni di base 2) e restituire una stringa di base 2 - basta spostare il .toString(2)alla fine dopo 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 caratteri

Sono ancora alle prime armi con il golf. Solo 80 reputazione viene dalla risposta.

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)

Come funziona.

Invece di riempire, invertisco l'array e poi aggiungo usando definito dall'utente (&). Non uso foldl1 (zipWith (+)) che è più corto perché zipWith eliminerà l'elemento superfluo. Quindi trovo il massimo e il minimo diverso da zero, che ha richiesto anche la funzione definita dall'utente. Quindi abbino l'articolo con il massimo e il minimo diverso da zero, 1 se corrisponde, 0 se non corrisponde. Quindi invertiamo e lo trasformiamo in numero binario.

FARE:

  1. utilizzando Data.List

2
Nella definizione di k, cviene utilizzato solo una volta, quindi non è necessario inserirlo nella whereclausola. Utilizzare direttamente: ...||(x==a#b).... Perché le parentesi graffe? In l: concat.map showèconcatMap show o, meglio ancora >>=: l=(>>=show).v.... (Nota: c'è anche quello =<<che fa lo stesso, ma con argomenti capovolti:) (show=<<).v.... >>=e =<<lavorare in un contesto di elenco qui e fare cose diverse in funzione o in altri contesti.
nimi,

2
È possibile sostituire [] negli ultimi casi di &e #con _: b&_=be _#l=l.
nimi,

2
(x==b)||(x==c)(o (x==b)||(x==a#b)quando lo rimuovi c) può essere sostituito da elem x[b,c](resp:) elem x[b,a#b].
nimi,

2
u=maximume k a=m(\x->fromEnum$elem x[u a,a#u a])adovrebbe funzionare.
nimi,

1
Non farlo _&a=a, deve rimanere []&a=a, altrimenti il ​​primo elenco viene perso se il secondo è vuoto. Utilizzare _solo nell'ultimo caso - forse questo è l'errore.
nimi,

3

Python 3, 181 126 122 byte

(Ho eliminato la maggior parte delle barre di conteggio dei byte perché stava diventando un po 'ridicolo.) 21 byte di sconto grazie a 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)

Leggermente meno golfato:

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'input è previsto in binario con solo spazi che separano i numeri. Anche l'output è binario.


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)

Grazie per il metodo edc65 per il calcolo min / max, ha ridotto il mio codice di 4 byte.

Spiegazione

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 simpatico. L'aritmetica dei bit batte di gran lunga la conversione delle stringhe. E vedo 2 modi per accorciarlo di più.
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,

Anche meglio! Devo imparare di più sul golf per i loop, ancora non usare per dirottare le istruzioni.
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?_*!"
"$""~

Un linguaggio importante e inutile per un operatore importante e inutile.

L'I / O è binario. Il programma si aspetta che ogni numero su una riga separata, ciascuno che termina con un avanzamento riga.

Provalo online!

Casi 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

Non so come si chiama questa spazzatura una lingua , ma la adoro!
fase

2

APL, 27 byte

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

Questa è una funzione monadica che accetta un elenco di numeri decimali e restituisce il loro biplex decimale.

Provalo online nella demo di ngn / apl .

Come funziona

                     32⍴2  Create a list of 32 2's.
                  ⍵⊤⍨      Base-encode the right argument.
                +/         Add the corresponding binary digits.
              S←           Save the sums in S.
           0~⍨             Remove 0's.
    (⌈/,⌊/)                Apply minimum (⌊/), maximum (⌈/) and concatenate.
  S∊                       Check which binary digits are in the extrema list.
2⊥                         Convert from base 2 to integer.

2

Wolfram Language, 113 byte

Questa versione accetta input da una finestra pop-up, con i numeri inseriti nel formato "{x, y, z, ...}", (senza virgolette).

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

Ingresso:

popup window dynamic

Produzione:

output

Prende l'input in un manipolo dinamico come una stringa del modulo "{x, y, z}" con x, y e z che sono numeri interi di base 10 (con o senza zeri iniziali). L'output è anche nella base 10.

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

example

Esistono altri modi per inserire questo in un modo che risparmierebbe sul conteggio dei caratteri, ma penso che questa soluzione sia un uso elegante di una GUI dinamica che esegue il calcolo

Se vuoi eseguirlo nel cloud, possiamo usare 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

La distribuzione Cloud porta il conteggio dei personaggi fino a 256 tuttavia ...

L'input per FormPage è anche una stringa del formato "{x, y, z}" con x, y e z che sono numeri interi di base 10.

L'ho distribuito nel cloud da solo e puoi provarlo su https://www.wolframcloud.com/objects/97b512df-64f8-4cae-979b-dba6d9622781

cloud example


Ho testato il collegamento cloud senza gli zeri
iniziali

Se hai un codice più corto senza la GUI, puoi modificarlo in questa risposta per migliorare il tuo punteggio e lasciare comunque la versione della GUI nella tua risposta come esempio alternativo per mostrare ciò che è possibile. Il meglio dei due mondi ...
trichoplax,

@trichoplax Notato, ho aggiunto quella che penso sia la versione più breve con Input []. Si potrebbe anche ipotizzare che i numeri vengano memorizzati in una variabile, il che potrebbe anche ridurre il conteggio dei personaggi, ma poi è ambiguo il modo in cui si immette l'input in esso, credo
Ian Johnson,

Memorizzare i numeri in una variabile non è uno dei metodi di input predefiniti ... Quindi quel passaggio aggiuntivo non è disponibile, ma quello che hai finora è fantastico :)
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))

Accetta i numeri binari delimitati da spazi.

Versione non golfata:

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

Un programma completo, inserito come argomento della riga di comando - spazio separato - in decimale.

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

Più leggibile:

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

Rubino, 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

Accetta un array come input.


1

CoffeeScript, 194 byte

Accetta input come numeri binari separati da coma, output in formato binario.

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

Provalo.


1

GolfScript, 46 byte

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

Provalo online su Web GolfScript .

Casi 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

1

C ++, 192 byte

Accetta input di un array intero senza segno a 32 bit e un conteggio di elementi in tale array.

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 L'ho cambiato.
MegaTom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.