¡Arriba los pedazos!


26

Dado un entero N, realice los siguientes pasos: (usando 9 como ejemplo).

  1. Recibir entrada N. ( 9)
  2. Convierta N de base10 a base2. ( 1001)
  3. Aumentar cada bit en 1. ( 2112)
  4. Trate el resultado como base3 y conviértalo de nuevo a base10. ( 68)
  5. Devolver / dar salida al resultado.

Entrada

Se puede recibir en cualquier formato de número razonable.
Solo necesita manejar casos donde N> 0.


Salida

Regrese como un número o cadena, o imprima en stdout.


Reglas

  • Este es el , gana el código más corto en bytes.
  • Las lagunas predeterminadas están prohibidas.

Casos de prueba

1 -> 2
2 -> 7
5 -> 23
9 -> 68
10 -> 70
20 -> 211
1235 -> 150623
93825 -> 114252161

Respuestas:


15

Python 2 , 31 bytes

f=lambda n:n and 3*f(n/2)+n%2+1

Pruébalo en línea!


3
¿Podría explicar cómo funciona esto?

+n%2+1agrega el bit binario más a la derecha más 1 al valor de retorno, n/2desplaza a la derecha nen 1 bit binario, 3*f(n/2)agrega recursivamente 3 veces este cálculo en esos bits desplazados a la derecha y n andfinaliza la recursión cuando nes 0
Noodle9

11

JavaScript (Node.js) , 23 bytes

f=x=>x&&x%2+1+3*f(x>>1)

Pruébalo en línea!


x>>1es lo mismo que x/2no?
mbomb007

@ mbomb007 Pensé y sugerí lo mismo todavía, pero aparentemente se convierte Infinityen JS ... Pruébalo en línea. (Es posible que desee agregar un enlace TIO a su respuesta, I4m2 )
Kevin Cruijssen

2
@ mbomb007 No. 1>>1=0while1/2=0.5
l4m2

44
@ mbomb007 ... Python?
user202729

2
Sí. Mira la respuesta de Python. Esa es la razón por la que n/2funciona en esa, y la razón por la que lo sugerí aquí.
mbomb007




6

R , 55 43 bytes

function(n)(n%/%2^(x=0:log2(n))%%2+1)%*%3^x

Pruébalo en línea!

Utiliza el truco de conversión base estándar en R, incrementos, y luego usa un producto de puntos con potencias 3para convertir de nuevo a un entero.

¡Gracias a @ user2390246 por dejar caer 12 bytes!


Debido a que la conversión a binario no es la salida final, el orden de los dígitos no importa. Entonces, en lugar de floor (log (n)): 0 puede hacer 0: log (n) y guardar algunos bytes: 43 bytes
user2390246

@ user2390246 por supuesto, gracias.
Giuseppe


6

Java 10, 81 52 bytes (conversión base)

n->n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)

Pruébalo en línea.

-29 bytes gracias a @Holger .

Explicación:

n->{                         // Method with Long as both parameter and return-type
  n.toString(n,2)            //  Convert the input to a Base-2 String
  .chars().reduce(0,(r,c)->  //  Loop over its digits as bytes
    r*3+c-47)                //  Multiply the current result by 3, and add the digit + 1
                             //  (which is equal to increasing each digit by 1,
                             //  and then converting from Base-3 to Base-10)

Java 10, 171 167 151 150 149 bytes (secuencia)

n->{int t=31-n.numberOfLeadingZeros(n);return a(t+1)+b(n-(1<<t));};int a(int n){return--n<1?n+2:3*a(n)+1;}int b(int n){return n<1?0:n+3*b(n/=2)+n*2;}

-16 bytes gracias a @ musicman523 , cambiando (int)Math.pow(2,t)a (1<<t).
-1 byte gracias a @Holger , cambiando (int)(Math.log(n)/Math.log(2))a 31-n.numberOfLeadingZeros(n).

Pruébalo en línea.

Explicación:

n->{                         // Method with Integer as both parameter and return-type
  int t=31-n.numberOfLeadingZeros(n);
                             //  2_log(n)
  return a(t+1)              //  Return A060816(2_log(n)+1)
         +b(n-(1<<t));}      //   + A005836(n-2^2_log(n))

// A060816: a(n) = 3*a(n-1) + 1; a(0)=1, a(1)=2
int a(int n){return--n<1?n+2:3*a(n)+1;}

// A005836: a(n+1) = 3*a(floor(n/2)) + n - 2*floor(n/2).
int b(int n){return n<1?0:n+3*b(n/=2)+n*2;}

Cuando miramos la secuencia:

2,  7,8,  22,23,25,26,  67,68,70,71,76,77,79,80,  202,203,205,206,211,212,214,215,229,230,232,233,238,239,241,242, ...

Podemos ver múltiples subsecuencias:

A053645(n):
0,  0,1,  0,1,2,3,  0,1,2,3,4,5,6,7,  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,  ...

A060816(A053645(n)):
2,  7,7,  22,22,22,22,  67,67,67,67,67,67,67,67,  202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,  ...

A005836(A053645(n)+1)
0,  0,1,  0,1,3,4,  0,1,3,4,9,10,12,13,  0,1,3,4,9,10,12,13,27,28,30,31,36,37,39,40,  ...

Entonces la secuencia que se pregunta es:

A060816(A053645(n)) + A005836(A053645(n)+1)

Soy un asco para encontrar patrones, así que estoy orgulloso de lo que encontré arriba ... Dicho esto, @ user202729 encontró un enfoque mejor y más corto en Java en unos pocos minutos ...: '(


Re n.toString(n,2).getBytes()... Creo que la conversión manual puede ser más corta.
user202729

1
Por cierto, ¿por qué longy no int?
user202729

1
Creo que en la versión de secuencia puedes cambiar (int)Math.pow(2,t)por 1<<t... y luego en línea esa expresión y soltar la variable i ( 152 bytes )
musicman523

1
En la vida real, usaría en 31-Integer.numberOfLeadingZeros(n)lugar de (int)(Math.log(n)/Math.log(2)), pero no es más corto. A menos que lo use import staticen el encabezado, lo que podría extender las reglas demasiado.
Holger

1
Solo intenté convertir el bucle de su primera variante en una solución de transmisión, con éxito:n -> n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)
Holger





3

Adjunto , 19 bytes

FromBase&3@1&`+@Bin

Pruébalo en línea!

Esta es una composición de tres funciones:

  • FromBase&3
  • 1&`+
  • Bin

Este primero se convierte en binario ( Bin), lo incrementa ( 1&`+), luego se convierte en ternario ( FromBase&3).

Alternativas

Sin puntos, 21 bytes: {FromBase[Bin!_+1,3]}

Sin incorporaciones, 57 bytes: Sum@{_*3^(#_-Iota!_-1)}@{If[_>0,$[_/2|Floor]'(1+_%2),[]]}


3

Retina 0.8.2 , 36 bytes

.+
$*
+`^(1+)\1
$1;1
^
1
+`1;
;111
1

Pruébalo en línea! Explicación:

.+
$*

Convierte de decimal a unario.

+`^(1+)\1
$1;1

Repetidamente divmod por 2, y agregue 1 al resultado del módulo.

^
1

Agregue 1 al primer dígito también.

+`1;
;111

Convierta de base codificada unaria 3 a unaria.

1

Convierte a decimal.


3

Japt , 6 bytes

¤cÄ n3
¤      // Convert the input to a base-2 string,
 c     // then map over it as charcodes.
  Ä    // For each item, add one to its charcode
       // and when that's done,
    n3 // parse the string as a base 3 number.

Toma la entrada como un número, emite un número.

Pruébalo en línea!


¡Maldición! ¿Por qué no pensé en eso? Bien hecho.
Shaggy

3

MATL , 12 7 6 bytes

BQ3_ZA

Pruébalo en línea!

Guardado 5 bytes gracias a Giuseppe y otro gracias a Luis Mendo.

Antigua respuesta de 7 bytes:

YBQc3ZA

Pruébalo en línea!

Explicación:

YB        % Convert to binary string
  Q       % Increment each element
   c      % Convert ASCII values to characters
    3     % Push 3
     ZA   % Convert from base 3 to decimal.

El anterior para 12 bytes:

BQtz:q3w^!Y*

Pruébalo en línea!

Oh, eso fue desordenado ... Así es esto: `BQ3GBn: q ^! Y *.

Explicación:

               % Implicit input
B              % Convert to binary vector
 Q             % Increment all numbers
  t            % Duplicate
   z           % Number of element in vector
    :          % Range from 1 to that number
     q         % Decrement to get the range from 0 instead of 1
      3        % Push 3
       w       % Swap order of stack
        ^      % Raise 3 to the power of 0, 1, ...
         !     % Transpose
          Y*   % Matrix multiplication
               % Implicit output

3

C # (compilador de Visual C #) , 128 bytes

using System;using System.Linq;i=>{int z=0;return Convert.ToString(i,2).Reverse().Select(a=>(a-47)*(int)Math.Pow(3,z++)).Sum();}

Pruébalo en línea!

Estoy contando Systemporque uso Converty Math.


Seleccionar le da el índice como parámetro opcional. Para que pueda deshacerse de su zvariable. También en el cuerpo de expresión que podría deshacerse de los {, }y returndeclaraciones. Entonces algo como eston=>Convert.ToString(n,2).Reverse().Select((x,i)=>(x-47)*Math.Pow(3,i)).Sum();
NtFreX


2

C, 32 27 bytes

n(x){x=x?x%2+1+3*n(x/2):0;}

Basado en la respuesta Java de user202729 . Pruébelo en línea aquí . Gracias a Kevin Cruijssen por jugar al golf 5 bytes.

Versión sin golf:

n(x) { // recursive function; both argument and return type are implicitly int
    x = // implicit return
    x ? x % 2 + 1 + 3*n(x/2) // if x != 0 return x % 2 + 1 + 3*n(x/2) (recursive call)
    : 0; // else return 0
}

Puede guardar 5 bytes reemplazando returncon x=e invirtiendo el ternario para !que ya no sea necesario:n(x){x=x?x%2+1+3*n(x/2):0;}
Kevin Cruijssen

@KevinCruijssen Nice. ¡Gracias!
OOBalance


2

Octava con la caja de herramientas de comunicación, 33 32 bytes

@(x)(de2bi(x)+1)*3.^(0:log2(x))'

Pruébalo en línea!

Convierte la entrada en un vector binario usando de2bie incrementando todos los números. Hace la multiplicación de matrices con un vector vertical de 3 elevado a las potencias apropiadas: 1, 3, 9, ...obteniendo así la suma sin una llamada explícita a sum.


Si bien esto es extremadamente inteligente, también puede hacerlo por 32 bytes: ¡ Pruébelo en línea!
Sanchises

Y con MATLAB incluso puede hacerlo @(x)base2dec(de2bi(x)+49,3)por 27 (una rara ocasión en la que MATLAB es más indulgente que Octave)
Sanchises

2

PHP, 84 64 bytes

Pruébalo en línea !!

Código ORIGINAL

function f($n){$b=decbin($n);echo base_convert($b+str_repeat('1',strlen($b)),3,10);}

Pruébalo en línea !!

Gracias a Cristoph , menos bytes si se ejecuta con php -R

function f($n){echo base_convert(strtr(decbin($n),10,21),3,10);}

Explicación

function f($n){
$b=decbin($n);                    #Convert the iteger to base 2
echo base_convert(                  #base conversion PHP function
    $b+str_repeat('1',strlen($b)),  #It adds to our base 2 number
    3,                              #a number of the same digits length
    10);                            #with purely '1's
}

Aquí es cuando veo que tengo mucho camino por recorrer en la programación ... no tenía idea de la existencia destrtr
Francisco Hahn

1
¡Lo haré!, Lo siento<?="Will do!!"
Francisco Hahn

2

CJam , 8 bytes

ri2b:)3b

Pruébalo en línea!

Explicación

ri   e# Read input as an integer
2b   e# Convert to base 2. Gives a list containing 0 and 1
:)   e# Add 1 to each number in that list
3b   e# Convert list from base 3 to decimal. Implicitly display

Me gusta un poco el :)...
Ian H.

2

Espacio en blanco , 117 bytes

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][N
S S S N
_Create_Label_OUTER_LOOP][S N
S _Duplicate][S S S T   S N
_Push_2][T  S T T   _Modulo][S S S T    N
_Push_1][T  S S S _Add][S N
T   _Swap][S S S T  S N
_Push_2][T  S T S _Integer_division][S N
S _Duplicate][N
T   S N
_If_0_jump_to_Label_INNER_LOOP][N
S N
S N
_Jump_to_Label_OUTER_LOOP][N
S S N
_Create_Label_INNER_LOOP][S S S T   T   N
_Push_3][T  S S N
_Multiply][T    S S S _Add][S N
T   _Swap][S N
S _Duplicate][N
T   S T N
_If_0_jump_to_Label_PRINT_AND_EXIT][S N
T   _Swap][N
S N
N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT_AND_EXIT][S N
T   _Swap][T    N
S T _Output_integer_to_STDOUT]

Se agregaron letras S(espacio), T(tabulación) y N(nueva línea) solo como resaltado.
[..._some_action]agregado solo como explicación.

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).

Explicación en pseudocódigo:

Primero convertí la función recursiva int f(int n){return n<1?0:n%2+1+3*f(n/2);}a su forma iterativa (en pseudocódigo):

Integer n = STDIN as integer
Add starting_value 0 to the stack
function OUTER_LOOP:
  while(true){
    Add n%2+1 to the stack
    n = n/2
    if(n == 0):
      Jump to INNER_LOOP
    Else:
      Jump to next iteration OUTER_LOOP

function INNER_LOOP:
  while(true){
    n = 3*n
    n = n + Value at the top of the stack (the ones we calculated with n%2+1)
    Swap top two items
    Check if the top is now 0 (starting value):
      Jump to PRINT_AND_EXIT
    Else:
      Swap top two items back
      Jump to next iteration INNER_LOOP

function PRINT_AND_EXIT:
  Swap top two items back
  Print top to STDOUT as integer
  Exit program with error: Exit not defined

Y luego implementé este enfoque iterativo en el espacio en blanco del lenguaje basado en la pila, usando su pila predeterminada.

Ejecuciones de ejemplo:

Entrada: 1

Command    Explanation                   Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                        [0]
SNS        Duplicate top (0)             [0,0]
SNS        Duplicate top (0)             [0,0,0]
TNTT       Read STDIN as integer         [0,0]           {0:1}   1
TTT        Retrieve                      [0,1]           {0:1}
NSSSN      Create Label OUTER_LOOP       [0,1]           {0:1}
 SNS       Duplicate top (1)             [0,1,1]         {0:1}
 SSSTSN    Push 2                        [0,1,1,2]       {0:1}
 TSTT      Modulo top two (1%2)          [0,1,1]         {0:1}
 SSSTN     Push 1                        [0,1,1,1]       {0:1}
 TSSS      Add top two (1+1)             [0,1,2]         {0:1}
 SNT       Swap top two                  [0,2,1]         {0:1}
 SSSTSN    Push 2                        [0,2,1,2]       {0:1}
 TSTS      Int-divide top two (1/2)      [0,2,0]         {0:1}
 SNS       Duplicate top (0)             [0,2,0,0]       {0:1}
 NTSN      If 0: Go to Label INNER_LOOP  [0,2,0]         {0:1}
 NSSN      Create Label INNER_LOOP       [0,2,0]         {0:1}
  SSSTTN   Push 3                        [0,2,0,3]       {0:1}
  TSSN     Multiply top two (0*3)        [0,2,0]         {0:1}
  TSSS     Add top two (2+0)             [0,2]           {0:1}
  SNT      Swap top two                  [2,0]           {0:1}
  SNS      Duplicate top (0)             [2,0,0]         {0:1}
  NTSTN    If 0: Jump to Label PRINT     [2,0]           {0:1}
  NSSTN    Create Label PRINT            [2,0]           {0:1}
   SNT     Swap top two                  [0,2]           {0:1}
   TNST    Print top to STDOUT           [0]             {0:1}           2
                                                                                  error

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
Se detiene con error: Salida no definida.

Entrada: 4

Command    Explanation                   Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                        [0]
SNS        Duplicate top (0)             [0,0]
SNS        Duplicate top (0)             [0,0,0]
TNTT       Read STDIN as integer         [0,0]           {0:4}   4
TTT        Retrieve                      [0,4]           {0:4}
NSSSN      Create Label OUTER_LOOP       [0,4]           {0:4}
 SNS       Duplicate top (4)             [0,4,4]         {0:4}
 SSSTSN    Push 2                        [0,4,4,2]       {0:4}
 TSTT      Modulo top two (4%2)          [0,4,0]         {0:4}
 SSSTN     Push 1                        [0,4,0,1]       {0:4}
 TSSS      Add top two (0+1)             [0,4,1]         {0:4}
 SNT       Swap top two                  [0,1,4]         {0:4}
 SSSTSN    Push 2                        [0,1,4,2]       {0:4}
 TSTS      Int-divide top two (4/2)      [0,1,2]         {0:4}
 SNS       Duplicate top (2)             [0,1,2,2]       {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,2]         {0:4}
 NSNSN     Jump to Label OUTER_LOOP      [0,1,2]         {0:4}
 SNS       Duplicate top (2)             [0,1,2,2]       {0:4}
 SSSTSN    Push 2                        [0,1,2,2,2]     {0:4}
 TSTT      Modulo top two (2%2)          [0,1,2,0]       {0:4}
 SSSTN     Push 1                        [0,1,2,0,1]     {0:4}
 TSSS      Add top two (0+1)             [0,1,2,1]       {0:4}
 SNT       Swap top two                  [0,1,1,2]       {0:4}
 SSSTSN    Push 2                        [0,1,1,2,2]     {0:4}
 TSTS      Int-divide top two (2/2)      [0,1,1,1]       {0:4}
 SNS       Duplicate top (1)             [0,1,1,1,1]     {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,1,1]       {0:4}
 NSNSN     Jump to Label OUTER_LOOP      [0,1,1,1]       {0:4}
 SNS       Duplicate top (1)             [0,1,1,1,1]     {0:4}
 SSSTSN    Push 2                        [0,1,1,1,1,2]   {0:4}
 TSTT      Modulo top two (1%2)          [0,1,1,1,1]     {0:4}
 SSSTN     Push 1                        [0,1,1,1,1,1]   {0:4}
 TSSS      Add top two (1+1)             [0,1,1,1,2]     {0:4}
 SNT       Swap top two                  [0,1,1,2,1]     {0:4}
 SSSTSN    Push 2                        [0,1,1,2,1,2]   {0:4}
 TSTS      Int-divide top two (1/2)      [0,1,1,2,0]     {0:4}
 SNS       Duplicate top (0)             [0,1,1,2,0,0]   {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,1,2,0]     {0:4}
 NSSN      Create Label INNER_LOOP       [0,1,1,2,0]     {0:4}
  SSSTTN   Push 3                        [0,1,1,2,0,3]   {0:4}
  TSSN     Multiply top two (0*3)        [0,1,1,2,0]     {0:4}
  TSSS     Add top two (2+0)             [0,1,1,2]       {0:4}
  SNT      Swap top two                  [0,1,2,1]       {0:4}
  SNS      Duplicate top (1)             [0,1,2,1,1]     {0:4}
  NTSTN    If 0: Jump to Label PRINT     [0,1,2,1]       {0:4}
  SNT      Swap top two                  [0,1,1,2]       {0:4}
  NSNN     Jump to Label INNER_LOOP      [0,1,1,2]       {0:4}
  SSSTTN   Push 3                        [0,1,1,2,3]     {0:4}
  TSSN     Multiply top two (2*3)        [0,1,1,6]       {0:4}
  TSSS     Add top two (1+6)             [0,1,7]         {0:4}
  SNT      Swap top two                  [0,7,1]         {0:4}
  SNS      Duplicate top (1)             [0,7,1,1]       {0:4}
  NTSTN    If 0: Jump to Label PRINT     [0,7,1]         {0:4}
  SNT      Swap top two                  [0,1,7]         {0:4}
  NSNN     Jump to Label INNER_LOOP      [0,1,7]         {0:4}
  SSSTTN   Push 3                        [0,1,7,3]       {0:4}
  TSSN     Multiply top two (7*3)        [0,1,21]        {0:4}
  TSSS     Add top two (1+21)            [0,22]          {0:4}
  SNT      Swap top two                  [22,0]          {0:4}
  SNS      Duplicate top (0)             [22,0,0]        {0:4}
  NTSTN    If 0: Jump to Label PRINT     [22,0]          {0:4}
  NSSTN    Create Label PRINT            [22,0]          {0:4}
   SNT     Swap top two                  [0,22]          {0:4}
   TNST    Print top to STDOUT           [0]             {0:4}           22
                                                                                  error

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
Se detiene con error: Salida no definida.


En este punto, ¿por qué no escribir ensamblado? También tengo un método iterativo un poco más simple en mi respuesta codegolf.stackexchange.com/a/161833/17360
qwr

He simplificado aún más mi pseudocódigo de python.
qwr

1
@qwr Su código de Python es casi el mismo que el código Java que se muestra. Java es simplemente más detallado y propenso a errores. La única diferencia es que mi código Java es un bucle while anidado, y el suyo está separado. También podría hacerlo en Java, pero como está anidado en Whitespace, elegí escribirlo también en el pseudocódigo de Java. Además, Whitespace no tiene ninguna forma de saber la cantidad de elementos que quedan en la pila, por eso presiono el 0 al comienzo, y en la parte INNER_LOOP del código: intercambia, comprueba si 0, intercambia de nuevo. Buena respuesta de la Asamblea, sin embargo. Así que lo hice + 1-ed. :)
Kevin Cruijssen

Todavía creo que puede deshacerse de la n < 1verificación presionando los valores hasta que n sea 0 y luego explotándolos hasta que alcance su valor límite (0). La profundidad de la pila no necesita almacenarse explícitamente y ni siquiera debería ser necesario intercambiar (si quiere decir intercambiar los dos valores superiores como en lisp)
qwr

@qwr " Sigo pensando que puedes deshacerte de la comprobación n <1 presionando los valores hasta que n sea 0 " Umm ... comprobando si n < 1(o n == 0) ESTÁ presionando los valores hasta que nes 0 ... O estoy malinterpretando algo aquí ...: S " La profundidad de la pila no necesita ser almacenada explícitamente " En Java sí, de lo contrario no puedo crear la matriz. Podría haber usado un java.util.Stacken su lugar, pero solo usé una matriz para hacerlo menos detallado. En el espacio en blanco, la pila es de tamaño indefinido.
Kevin Cruijssen

2

Brain-Flak , 74 bytes

({<>(())<>({<({}[()])><>([{}]())<>})}(<>)){{}((({})()){}{}[{}])([][()])}{}

Pruébalo en línea!

Versión "legible"

({<>(())<>
  ({
    <({}[()])>
    <>
    ([{}]())
    <>
  })
}
# At this point we have a inverted binary string on the stack
(<>)
)
{
  {}
  (
    (({})()){}{}[{}]
  )
  ([][()])
}{}






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.