Vai su i pezzi!


26

Dato un numero intero N, procedere come segue: (usando 9 come esempio).

  1. Ricevi input N. ( 9)
  2. Converti N da base10 a base2. ( 1001)
  3. Aumenta ogni bit di 1. ( 2112)
  4. Tratta il risultato come base3 e convertilo nuovamente in base10. ( 68)
  5. Restituisce / Emette il risultato.

Ingresso

Può essere ricevuto in qualsiasi formato numerico ragionevole.
Devi solo gestire i casi in cui N> 0.


Produzione

Ritorna come numero o stringa o stampa su stdout.


Regole

  • Questo è , vince il codice più breve in byte.
  • Sono vietate le scappatoie predefinite.

Casi test

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

Risposte:


15

Python 2 , 31 byte

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

Provalo online!


3
Potresti spiegare come funziona?

+n%2+1aggiunge il bit binario più a destra più 1 al valore di ritorno, n/2sposta a destra ndi 1 bit binario, 3*f(n/2)aggiunge ricorsivamente 3 volte questo calcolo su quei bit con spostamento a destra e n andtermina la ricorsione quando nè 0
Noodle9

11

JavaScript (Node.js) , 23 byte

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

Provalo online!


x>>1è la stessa x/2cosa no?
mbomb007,

@ mbomb007 Ho pensato e suggerito lo stesso ancora, ma a quanto pare diventa Infinityin JS .. Provalo online. (Potresti voler aggiungere un link TIO alla tua risposta, I4m2 )
Kevin Cruijssen

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

4
@ mbomb007 ... Python?
user202729

2
Si. Guarda la risposta di Python. Questo è il motivo che n/2funziona in quello, e il motivo per cui l'ho suggerito qui.
mbomb007,




6

R , 55 43 byte

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

Provalo online!

Utilizza il trucco di conversione base standard in incrementi di R, quindi utilizza un prodotto punto con i poteri di 3riconvertire in un numero intero.

Grazie a @ user2390246 per aver eliminato 12 byte!


Poiché la conversione in binario non è l'output finale, l'ordine delle cifre non ha importanza. Quindi, invece di floor (log (n)): 0 puoi fare 0: log (n) e salvare alcuni byte: 43 byte
user2390246

@utente2390246 ovviamente, grazie.
Giuseppe,


6

Java 10, 81 52 byte (conversione di base)

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

Provalo online.

-29 byte grazie a @Holger .

Spiegazione:

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 byte (sequenza)

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 byte grazie a @ musicman523 , cambiando (int)Math.pow(2,t)in (1<<t).
-1 byte grazie a @Holger , cambiando (int)(Math.log(n)/Math.log(2))in31-n.numberOfLeadingZeros(n) .

Provalo online.

Spiegazione:

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

Quando guardiamo la sequenza:

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

Possiamo vedere più sottosequenze:

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

Quindi la sequenza richiesta è:

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

Faccio schifo nel trovare schemi, quindi sono orgoglioso di quello che ho trovato sopra .. Detto questo, @ user202729 ha trovato un approccio migliore e più breve in Java in pochi minuti ..: '(


Ri n.toString(n,2).getBytes()... Penso che la conversione manuale potrebbe essere più breve.
user202729

1
A proposito perché longe no int?
user202729

1
Penso che nella versione in sequenza puoi cambiare (int)Math.pow(2,t)per 1<<t... e poi incorporare quell'espressione e rilasciare la variabile i ( 152 byte )
musicman523

1
Nella vita reale, userei 31-Integer.numberOfLeadingZeros(n)invece di (int)(Math.log(n)/Math.log(2)), ma non è più breve. A meno che non si utilizzi import staticnell'intestazione, ciò potrebbe allungare troppo le regole.
Holger,

1
Ho appena provato a convertire il loop della tua prima variante in una soluzione stream, con successo:n -> n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)
Holger





3

Attache , 19 byte

FromBase&3@1&`+@Bin

Provalo online!

Questa è una composizione di tre funzioni:

  • FromBase&3
  • 1&`+
  • Bin

Questo prima converte in binario ( Bin), lo incrementa ( 1&`+), quindi converte in ternario ( FromBase&3).

alternative

Non inutile, 21 byte: {FromBase[Bin!_+1,3]}

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


3

Retina 0.8.2 , 36 byte

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

Provalo online!Spiegazione:

.+
$*

Converti da decimale a unario.

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

Divmod ripetutamente per 2 e aggiungi 1 al risultato del modulo.

^
1

Aggiungi 1 anche alla prima cifra.

+`1;
;111

Converti dalla base 3 con codifica unaria a unaria.

1

Converti in decimale.


3

Japt , 6 byte

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

Accetta l'input come numero, emette un numero.

Provalo online!


Accidenti! Perché non ci ho pensato? Ben fatto.
Shaggy,

3

MATL , 12 7 6 byte

BQ3_ZA

Provalo online!

Salvato 5 byte grazie a Giuseppe e un altro grazie a Luis Mendo.

Vecchia risposta a 7 byte:

YBQc3ZA

Provalo online!

Spiegazione:

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.

Uno vecchio per 12 byte:

BQtz:q3w^!Y*

Provalo online!

Oh mio Dio, era disordinato ... Così è questo: `BQ3GBn: q ^! Y *.

Spiegazione:

               % 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 # (compilatore Visual C #) , 128 byte

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

Provalo online!

Conto Systemperché uso Converte Math.


Seleziona ti dà l'indice come parametro opzionale. Quindi potresti sbarazzarti della tua zvariabile. Anche nel corpo espressione si potrebbe liberarsi dei {, }e returndichiarazioni. Quindi qualcosa del generen=>Convert.ToString(n,2).Reverse().Select((x,i)=>(x-47)*Math.Pow(3,i)).Sum();
NtFreX l'


2

C, 32 27 byte

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

Basato sulla risposta Java di user202729 . Provalo online qui . Grazie a Kevin Cruijssen per il golf 5 byte.

Versione non golfata:

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
}

È possibile salvare 5 byte sostituendo il returncon x=e invertendo il ternario in modo che !non sia più necessario:n(x){x=x?x%2+1+3*n(x/2):0;}
Kevin Cruijssen

@KevinCruijssen Nice. Grazie!
OOBalance


2

Ottava con toolbox di comunicazione, 33 32 byte

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

Provalo online!

Converte l'input in un vettore binario utilizzando de2bie incrementando tutti i numeri. Fa moltiplicazione di matrici con un vettore verticale di 3 elevato ai poteri appropriati:, 1, 3, 9, ...ottenendo così la somma senza una chiamata esplicita a sum.


Sebbene sia estremamente intelligente, puoi farlo anche per 32 byte: provalo online!
Sanchises,

E con MATLAB potresti anche fare @(x)base2dec(de2bi(x)+49,3)per 27 (una rara occasione in cui MATLAB è più indulgente di Ottava)
Sanchises

2

PHP, 84 64 byte

Provalo online !!

Codice ORIGINALE

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

Provalo online !!

Grazie a Cristoph , meno byte se eseguito con php -R

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

Spiegazione

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
}

Ecco quando vedo che ho un modo loooogn di andare alla programmazione .... non avevo idea dell'esistenza distrtr
Francisco Hahn

1
Lo farò !!, scusa<?="Will do!!"
Francisco Hahn,

2

CJam , 8 byte

ri2b:)3b

Provalo online!

Spiegazione

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

In un certo senso mi piace :)..
Ian H.

2

Spazio bianco , 117 byte

[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]

Lettere S(spazio), T(scheda) e N(nuova riga) aggiunti solo come evidenziazione.
[..._some_action]aggiunto solo come spiegazione.

Provalo online (solo con spazi non elaborati, schede e nuove righe).

Spiegazione in pseudo-codice:

Ho prima convertito la funzione ricorsiva int f(int n){return n<1?0:n%2+1+3*f(n/2);}nella sua forma iterativa (in pseudo-codice):

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

E ho quindi implementato questo approccio iterativo nel linguaggio basato su stack Whitespace, usando lo stack predefinito.

Esempi di esecuzione:

Ingresso: 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

Provalo online (solo con spazi non elaborati, schede e nuove righe).
Si interrompe con errore: uscita non definita.

Ingresso: 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

Provalo online (solo con spazi non elaborati, schede e nuove righe).
Si interrompe con errore: uscita non definita.


A questo punto, perché non scrivere assembly? Inoltre ho un metodo iterativo leggermente più semplice nella mia risposta codegolf.stackexchange.com/a/161833/17360
qwr

Ho semplificato ulteriormente il mio pseudocodice python.
qwr

1
@qwr Il tuo codice Python è quasi uguale al codice Java visualizzato. Java è solo più prolisso e soggetto a errori. L'unica differenza è che il mio codice Java è un ciclo while nidificato e il tuo è separato. Potrei farlo anche in Java, ma dato che è nidificato in Whitespace ho scelto di scriverlo come tale anche nello pseudo-codice Java. Inoltre, Whitespace non ha alcun modo di conoscere il numero di elementi rimasti nello stack, motivo per cui premo lo 0 all'inizio, e nella parte INNER_LOOP del codice fare: scambiare, controllare se 0, scambiare indietro. Bella risposta dell'Assemblea, però. Quindi l'ho fatto +1. :)
Kevin Cruijssen,

Penso ancora che puoi sbarazzarti del n < 1controllo spingendo i valori fino a quando n è 0 e poi saltandoli fino a quando non raggiungi il valore limite (0). La profondità dello stack non ha bisogno di essere memorizzata in modo esplicito e non dovrebbe nemmeno essere necessario scambiare (se intendi scambiare i primi due valori come in lisp)
qwr

@qwr " Penso ancora che puoi sbarazzarti del controllo n <1 spingendo i valori fino a quando n è 0 " Umm .. controllando se n < 1(o n == 0) IS spingendo i valori fino a quando nè 0 .. O sto fraintendendo qualcosa qui ..: S " Non è necessario che la profondità dello stack sia memorizzata in modo esplicito " In Java, altrimenti non posso creare l'array. Avrei potuto usare un java.util.Stackinvece, ma ho appena usato un array per renderlo meno dettagliato. In Whitespace la pila ha dimensioni indefinite.
Kevin Cruijssen,

2

Brain-Flak , 74 byte

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

Provalo online!

Versione "leggibile"

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






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.