Es un poco elástico ․․․


18

Entrada:

Tomamos dos entradas:

  • Una entrada bcon dos valores distintos: Lefty Right.
  • Y un entero positivo n.

Salida:

Según la entrada izquierda / derecha, mostramos cualquiera de las siguientes dos secuencias en el rango de 1-n(en las secuencias a continuación se muestran los primeros 125 elementos):

Left:
1, 6, 7, 56, 57, 62, 63, 960, 961, 966, 967, 1016, 1017, 1022, 1023, 31744, 31745, 31750, 31751, 31800, 31801, 31806, 31807, 32704, 32705, 32710, 32711, 32760, 32761, 32766, 32767, 2064384, 2064385, 2064390, 2064391, 2064440, 2064441, 2064446, 2064447, 2065344, 2065345, 2065350, 2065351, 2065400, 2065401, 2065406, 2065407, 2096128, 2096129, 2096134, 2096135, 2096184, 2096185, 2096190, 2096191, 2097088, 2097089, 2097094, 2097095, 2097144, 2097145, 2097150, 2097151, 266338304, 266338305, 266338310, 266338311, 266338360, 266338361, 266338366, 266338367, 266339264, 266339265, 266339270, 266339271, 266339320, 266339321, 266339326, 266339327, 266370048, 266370049, 266370054, 266370055, 266370104, 266370105, 266370110, 266370111, 266371008, 266371009, 266371014, 266371015, 266371064, 266371065, 266371070, 266371071, 268402688, 268402689, 268402694, 268402695, 268402744, 268402745, 268402750, 268402751, 268403648, 268403649, 268403654, 268403655, 268403704, 268403705, 268403710, 268403711, 268434432, 268434433, 268434438, 268434439, 268434488, 268434489, 268434494, 268434495, 268435392, 268435393, 268435398, 268435399, 268435448, 268435449

Right:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624, 639, 896, 911, 1008, 1023, 16384, 16415, 16864, 16895, 19968, 19999, 20448, 20479, 28672, 28703, 29152, 29183, 32256, 32287, 32736, 32767, 1048576, 1048639, 1050560, 1050623, 1079296, 1079359, 1081280, 1081343, 1277952, 1278015, 1279936, 1279999, 1308672, 1308735, 1310656, 1310719, 1835008, 1835071, 1836992, 1837055, 1865728, 1865791, 1867712, 1867775, 2064384, 2064447, 2066368, 2066431, 2095104, 2095167, 2097088, 2097151, 134217728, 134217855, 134225792, 134225919, 134471680, 134471807, 134479744, 134479871, 138149888, 138150015, 138157952, 138158079, 138403840, 138403967, 138411904, 138412031, 163577856, 163577983, 163585920, 163586047, 163831808, 163831935, 163839872, 163839999, 167510016, 167510143, 167518080, 167518207, 167763968, 167764095, 167772032, 167772159, 234881024, 234881151, 234889088, 234889215, 235134976, 235135103, 235143040, 235143167, 238813184, 238813311, 238821248, 238821375, 239067136, 239067263, 239075200, 239075327, 264241152, 264241279, 264249216, 264249343, 264495104, 264495231, 264503168, 264503295, 268173312, 268173439, 268181376, 268181503, 268427264, 268427391

¿Cómo se generan estas secuencias, preguntas?

Una secuencia predeterminada de 1 a través n=10sería:

As integer:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

As binary:
1 10 11 100 101 110 111 1000 1001 1010

Cuando nos estiramos a la izquierda, el binario se convertirá en esto:

1, 110, 111, 111000, 111001, 111110, 111111, 1111000000, 1111000001, 1111000110

¿Por qué? El último bit se usa una vez; el single-last se usa dos veces; el penúltimo se usa tres veces; etc.

So `1010` will become (spaces added as clarification): `1111 000 11 0`

Y estas nuevas cadenas binarias estiradas a la izquierda se convierten de nuevo a enteros:

1, 6, 7, 56, 57, 62, 63, 960, 961, 966

En cuanto a la derecha extendida, el primer bit se usa una vez; segundo dos veces; tercero tres veces; etc. Así:

As binary:
1, 100, 111, 100000, 100111, 111000, 111111, 1000000000, 1000001111, 1001110000

As integer:
1, 4, 7, 32, 39, 56, 63, 512, 527, 624

Reglas de desafío:

  • Puede tomar dos valores distintos, pero indique cuál usa. Así que puede ser 1/0, true/false, null/undefined, "left"/"right", etc.
  • n siempre es mayor que 0.
  • Debe admitir una salida máxima de al menos el entero predeterminado de su idioma (que es de 32 bits para la mayoría de los idiomas).
  • El formato de salida es flexible. Se puede imprimir o devolver como matriz / lista. Puede ser con un espacio, una coma, una tubería y similares como delimitadores. Tu llamada. (Nuevamente, indique lo que ha usado).

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

1
¿Consideraría aceptar respuestas basadas en bits que solo sean compatibles n < 128, de modo que los resultados se ajusten a enteros de 32 bits?
Arnauld

@Arnauld He estado dudando al respecto, pero desde que lo preguntaste, ¿por qué no? Cambiará las reglas para 1000 max a lo que se ajuste al número entero de su idioma.
Kevin Cruijssen

@KevinCruijssen Todavía recomendaría limitar eso a al menos 16 bits: hay al menos un idioma que admite solo un bit como tipo de datos.

Respuestas:




5

05AB1E , 14 13 bytes

Guardado 1 byte gracias a Erik the Outgolfer

LbεIiRƶRëƶ}JC

1por izquierda
0(o cualquier otra cosa) por derecho.

Pruébalo en línea!

Explicación

L                # push range [1 ... first_input]
 b               # convert to binary
  ε              # apply to each
   Ii            # if second_input is true
     RƶR         # reverse, multiply each element with its 1-based index and reverse again
        ëƶ       # else, multiply each element with its 1-based index
          }      # end if
           J     # join
            C    # convert to base-10

2
Puede usar εpara -1:LbεIiRƶRëƶ}JC
Erik the Outgolfer

@EriktheOutgolfer: Buena idea usando ë. Resuelve el problema de ifen una solicitud en este caso :)
Emigna

3

Casco , 13 bytes

mȯḋṠṘo?ḣṫ⁰Lḋḣ

Son muchas letras punteadas ...

Toma primero b( 0para la izquierda y 1para la derecha), luego n. Pruébalo en línea!

Explicación

mȯḋṠṘo?ḣṫ⁰Lḋḣ  Inputs b=1 and n=5 (implicit).
            ḣ  Range to n: [1,2,3,4,5]
mȯ             Map function over the range:
                 Argument: number k=5
           ḋ     Binary digits: [1,0,1]
   ṠṘ            Repeat each digit with respect to the list
     o    L      obtained by applying to the length (3) the function
      ?  ⁰       if b is truthy
       ḣ         then increasing range: [1,2,3]
        ṫ        else decreasing range: [3,2,1].
                 We get [1,0,0,1,1,1].
  ḋ              Convert back to integer: 39
               Final result [1,4,7,32,39], implicitly print.

Probablemente podría elegir tomar como bḣ o ṫ directamente, ahorrándole tres bytes :)
Leo

@Leo Hmm, eso es una pendiente resbaladiza. También podría tomar una de las dos versiones de todo el programa como by hacer que mi solución sea solo I...
Zgarb

3

Japt , 19 18 17 bytes

0para "izquierda", 1para "derecha". (En realidad, puede tomar cualquier valor falso o verdadero en lugar de esos 2.)

õȤËpV©EĪEnFlÃn2

Pruébalo


Explicación

Entrada implícita de enteros Uy V.

õ

Cree una matriz de enteros de 1 a U, inclusive.

È

Pase cada uno a través de una función.

¤

Convierte el entero actual en una cadena binaria

Ë           Ã

Asigne sobre la cadena, pasando cada carácter a través de una función, donde Eestá el índice actual y Fes la cadena completa.

p

Repite el personaje actual

V©  ª

©es lógico AND ( &&) yª es lógico OR ||, así que aquí estamos comprobando si Ves verdadero (no cero) o no.

Si V es verdad, entonces Xse repite Y+1veces.

YnZl

Si Ves falsey, entonces Xse repite Ysustraído de (n ) la longitud ( l) de Zveces.

n2

Convertir de nuevo a un entero de base 10.

Salida implícita de la matriz resultante.


Bajé a 16 antes de darme cuenta de que era "los primeros n ítems" en lugar de "nésimo ítem", así que esto no es tan malo: P
ETHproductions

@ETHproductions: no fuiste el único en cometer ese error;)
Shaggy

2

Gaia , 15 bytes

⟪¤bw¦¤;ċ%׆_b⟫¦

Usos -1para izquierda y 1para derecha.

Pruébalo en línea!

Explicación

⟪¤bw¦¤;ċ%׆_b⟫¦  Map this block over the range 1..n, with direction as an extra parameter:
 ¤                Swap, bring current number to the top
  b               List of binary digits
   w¦             Wrap each in a list
     ¤            Bring direction to the top
      ;ċ          Push the range 1..len(binary digts)
        %         Select every direction-th element of it (-1 reverses, 1 does nothing)
         ׆       Element-wise repetition
           _      Flatten
            b     Convert from binary to decimal

2

Protón , 79 bytes

n=>d=>[int(''.join(b[x]*[l-x,x-1][d]for x:2..(l=len(b=bin(i)))),2)for i:1..n+1]

0está a la izquierda, 1está a la derecha.

Pruébalo en línea!

Sin golf

f=n=>d=>                        # Curried function
[                               # Collect the results in a list
 int(                           # Convert from a binary string to an int:
  ''.join(                       # Join together
   b[x]                           # Each character of the binary string of n
   *[l-x,x-1][d]                  # Repeated by its index or its index from the end, depending on d
   for x:2..(l=len(b=bin(i))))    
 ,2)
 for i:1..n+1                   # Do this for everything from 1 to n inclusive
]

2

C # (.NET Core) , 192 187 + 23 bytes

-5 bytes gracias a TheLethalCoder

b=>n=>new int[n].Select((_,a)=>{var g=Convert.ToString(a+1,2);return(long)g.Reverse().SelectMany((x,i)=>Enumerable.Repeat(x,b?i+1:g.Length-i)).Select((x,i)=>x>48?Math.Pow(2,i):0).Sum();})

El recuento de bytes también incluye:

namespace System.Linq{}

Pruébalo en línea!

Entrada: leftes true, rightesfalse

Explicación:

b => n =>                                   // Take two inputs (bool and int)
    new int[n].Select((_, a) => {           // Create new collection the size of n
        var g = Convert.ToString(a + 1, 2); // Take every number in sequence 1..n and convert to base 2 (in a string)
        return (long)g.Reverse()            // Reverse the bits
               .SelectMany((x, i) =>        // Replace every bit with a collection of its repeats, then flatten the result
                   Enumerable.Repeat(x, b ? i + 1 : g.Length - i))
               .Select((x, i) => x > 48 ? Math.Pow(2, i) : 0)
               .Sum();                      // Replace every bit with a corresponding power of 2, then sum
    })


185 + 23 ^ (era demasiado largo en un comentario)
TheLethalCoder

@TheLethalCoder ¡Gracias! Desafortunadamente, es 187 ya que necesitamos agregar 1 al índice ya que comienza en 0, y la secuencia comienza en 1.
Grzegorz Puławski

¿No es using System.Linq;más corto namespace System.Linq{}o me estoy perdiendo algo aquí? Hace mucho tiempo
programé

1
@KevinCruijssen esto usa Mathy Convertambos están en el Systemespacio de nombres, por lo que elegir namespace System.Linqes el más corto: permite usar ambos Systemy las System.Linqclases.
Grzegorz Puławski

2

Dyalog APL, 23 bytes

{2⊥b/⍨⌽⍣⍺⍳≢b←2⊥⍣¯1⊢⍵}¨⍳

left is 1right is 0(se pasa como argumento izquierdo de la función)

es generador de índice

{... aplica la función entre llaves a cada elemento de la derecha

b←2⊥⍣¯1⊢⍵b está codificado como binario (usando el inverso de decodificación para obtener el número mínimo de bits necesarios para representar en la base 2)

⍳≢bgenerar índices para el vector b ( ≢bes la longitud de b)

⌽⍣⍺ marcha atrás tiempos (usados ​​condicionalmente aquí para estiramiento izquierdo o derecho)

b/⍨ b replicado por (replica los bits según el índice (inverso))

2⊥ decodificar desde la base 2

TryAPL en línea


2

JavaScript (ES6), 131 bytes

Esto es significativamente más largo que la respuesta de Shaggy , pero quería probar un enfoque puramente bit a bit.

Debido al límite de 32 bits de las operaciones JS bitwise, esto funciona solo para n <128 .

Toma entrada en la sintaxis de curry (n)(r), donde r es falso para izquierda / verdad para derecha.

n=>r=>[...Array(n)].map((_,n)=>(z=n=>31-Math.clz32(n),g=n=>n&&(x=z(b=n&-n),r?2<<z(n)-x:b*2)-1<<x*(r?2*z(n)+3-x:x+1)/2|g(n^b))(n+1))

Formateado y comentado

n => r => [...Array(n)]       // given n and r
  .map((_, n) => (            // for each n in [0 .. n - 1]
    z = n =>                  //   z = helper function returning the
      31 - Math.clz32(n),     //       0-based position of the highest bit set
    g = n =>                  //   g = recursive function:
      n && (                  //     if n is not equal to 0:
        x = z(b = n & -n),    //       b = bitmask of lowest bit set / x = position of b
        r ?                   //       if direction = right:
          2 << z(n) - x       //         use 2 << z(n) - x
        :                     //       else:
          b * 2               //         use b * 2
      ) - 1                   //       get bitmask by subtracting 1
      << x * (                //       left-shift it by x multiplied by:
        r ?                   //         if direction = right:
          2 * z(n) + 3 - x    //           2 * z(n) + 3 - x
        :                     //         else:
          x + 1               //           x + 1
      ) / 2                   //       and divided by 2
      | g(n ^ b)              //     recursive call with n XOR b
    )(n + 1)                  //   initial call to g() with n + 1
  )                           // end of map()

Manifestación


Bien, ahora me siento un poco mejor con respecto a la longitud de la mía, ya que buscaste una solución más larga, en lugar de una más corta.
Shaggy

1
" (pendiente de aprobación de OP) " . Aprobado :) +1 de mi parte.
Kevin Cruijssen

2

JavaScript (ES6), 113 bytes

¡Oh, esto es demasiado tiempo! Esto es lo que sucede cuando pasas el día escribiendo JavaScript "real", niños; te olvidas de jugar al golf correctamente!

Usos cualquier valor o Truthy Falsey para b, con falseser "izquierda" y true"tener razón".

n=>b=>[...Array(n)].map(_=>eval("0b"+[...s=(++e).toString(2)].map((x,y)=>x.repeat(b?++y:s.length-y)).join``),e=0)

Intentalo

o.innerText=(f=
n=>b=>[...Array(n)].map(_=>eval("0b"+[...s=(++e).toString(2)].map((x,y)=>x.repeat(b?++y:s.length-y)).join``),e=0)
)(i.value=10)(j.value=1);oninput=_=>o.innerText=f(+i.value)(+j.value)
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Size: </label><input id=i type=number><label for=j>Direction: </label><input id=j min=0 max=1 type=number><pre id=o>



1

Retina , 111 bytes

\d+
$*
1
$`1¶
+`(1+)\1
${1}0
01
1
.
$.%`$*R$&$.%'$*L
+s`(R?)(\d)(L?)(.*¶\1\3)$
$2$2$4
¶*[RL]

1
01
+`10
011
%`1

Pruébalo en línea! Toma el número y, o bien Lo Rcomo un sufijo (o en una línea separada). Explicación:

\d+
$*
1
$`1¶

Convierte de decimal a unario y cuenta de 1 a n.

+`(1+)\1
${1}0
01
1

Convierte de unario a binario.

.
$.%`$*R$&$.%'$*L

Envuelva cada bit Ry Lcaracteres de acuerdo con su posición en la línea.

+s`(R?)(\d)(L?)(.*¶\1\3)$
$2$2$4

Reemplazar el relevante R o Lcaracteres con el dígito adyacente apropiado.

¶*[RL]

1
01
+`10
011
%`1

Elimine los caracteres sobrantes y conviértalos de binario a decimal.


1
Hola, tienes que generar todos los números de 1a n. No solo el nnúmero th.
Kevin Cruijssen

@KevinCruijssen Bah, ahí va mi recuento de sub-100 bytes ...
Neil

1

JavaScript (ES6), 130 127 bytes

3 bytes, gracias Kevin

Seguro que no conozco suficiente ES6 para este sitio, ¡pero lo intenté! Recorre cada número y recorre cada representación binaria para ese número, repitiendo cada carácter cuantas veces sea necesario.

d=>n=>{i=0;while(i++<n){b=i.toString(2),s="",k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);console.log(parseInt(s,2))}}

f=d=>n=>{i=0;while(i++<n){b=i.toString(2),s="",k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);console.log(parseInt(s,2))}}
f(1)(10)
f(0)(10)


1
+1 de mi parte :) Creo que puede guardar un byte utilizando una entrada de curry ( d=>n=>), como hicieron las otras dos respuestas de JS ES6. Además, creo que puede guardar otros 2 bytes cambiando k=-1,l=b.length;while(++k<l)s+=b[k].repeat(d?k+1:l-k);a k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l+~k);(comenzando en k=0lugar de -1, y el l-k-1que luego se requiere se acorta l+~k). Además, ¿están los paréntesis alrededor de lo (i).toString(2)requerido?
Kevin Cruijssen

1
El +~kparece que debería funcionar, pero no puedo entenderlo, se pone cada vez loco. Gracias por los otros consejos!
Sven escribe el código el

1
Ah, vaya, l+~kes incorrecto, ya que no lo es, l-k-1pero l-k+1... Lo malo. Todavía puede campo de un byte empezando ken cero sin embargo: k=0,l=b.length;while(k<l)s+=b[k++].repeat(d?k:l-k+1);.
Kevin Cruijssen

1

Ruby, 98 bytes

->n,r{t=->a{r ?a:a.reverse};(1..n).map{|k|i=0;t[t[k.to_s(2).chars].map{|d|d*(i+=1)}].join.to_i 2}}

¿Es necesario el espacio en el ternario a{r ?a:a.reverse}?
Kevin Cruijssen

2
Si. Los métodos de Ruby pueden terminar con ?, r?se habrían interpretado como un nombre de método.
m-chrzan

Ah ok, gracias por la explicación. Nunca programado en Ruby, pero parecía un ternario regular; si lo uso en Java (o C #), de ahí mi comentario.
Kevin Cruijssen

1

Java 8, 136 bytes

Lambda (curry) de Booleana un consumidor de Integer. El parámetro booleano indica si estirar a la izquierda (valores true,false ). La salida se imprime en salida estándar, separada por nuevas líneas, con una nueva línea final.

l->n->{for(int i=0,o,c,d,s=0;i++<n;System.out.println(o)){while(i>>s>0)s++;for(o=c=0;c++<s;)for(d=0;d++<(l?s-c+1:c);o|=i>>s-c&1)o<<=1;}}

Lambda sin golf

l ->
    n -> {
        for (
            int i = 0, o, c, d, s = 0;
            i++ < n;
            System.out.println(o)
        ) {
            while (i >> s > 0)
                s++;
            for (o = c = 0; c++ < s; )
                for (
                    d = 0;
                    d++ < (l ? s - c + 1 : c);
                    o |= i >> s - c & 1
                )
                    o <<= 1;
        }
    }

Pruébalo en línea

Límites

Porque se acumulan en int s, las salidas están limitadas a 31 bits. Como resultado, las entradas están limitadas a 7 bits, por lo que la entrada máxima que admite el programa es 127.

Explicación

Esta solución acumula cada número estirado utilizando operaciones bit a bit. El bucle externo itera isobre los números a estirar, de 1 a n , e imprime el valor estirado después de cada iteración.

El whilebucle interno se incrementa sal número de bits iy el siguiente foritera csobre cada posición de bit. Dentro de ese ciclo, dcuenta hasta el número de veces que se repite el bit actual, que depende de la entrada l. En cada paso, ose desplaza hacia la izquierda y ise enmascara el bit apropiado y se introduce OR.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.