Questo numero può essere scritto nel formato (3 ^ x) - 1?


41

Sfida:

Crea un programma che accetta un numero intero positivo e controlla se può essere scritto sotto forma di (3 ^ x) -1, dove X è un altro numero intero positivo .

Se possibile, invia X

In caso contrario, emettere -1 o un'istruzione falsy .

Esempi di ingressi / uscite

Ingresso:

2

Può essere scritto come (3 ^ 1) - 1, quindi produciamo x che è 1

Produzione:

1

Ingresso:

26

26 può essere scritto come (3 ^ 3) - 1, quindi produciamo x (3)

Produzione:

3

Ingresso:

1024

1024 non può essere scritto nella forma di (3 ^ x) - 1, quindi produciamo -1

Produzione:

-1

Questo è quindi vince il minor numero di byte


OEIS correlato: A024023


4
Chiedo di produrre X perché credo che sia più impegnativo in questo modo. Secondo me, semplicemente scoprire se è di formato 3 ^ x - 1 sarebbe troppo facile per una sfida.
P. Ktinos,

2
A meno che non sia una dichiarazione falsa nel tuo linguaggio di programmazione, allora no.
P. Ktinos,

2
Posso desiderare che il numero sia inserito in ternario?
John Dvorak,

2
dover gestire interger non negativi renderebbe 0 3^0-1 un output valido e quindi non utilizzabile come falso,
Jasen

2
chiunque log()stia pensando di usare la propria risposta dovrebbe confermare che fornisce la risposta corretta 5quando 242 viene inserito.
Jasen,

Risposte:


23

Mathematica, 21 16 byte

-1&@@Log[3,#+1]&

Utilizza il calcolo simbolico di Mathematica. Se #+1è una potenza di tre Log[3,#+1], calcolerà un risultato intero che è un valore atomico. Altrimenti otterremo così Log[#+1]/Log[3]com'è. Poiché questo non è un valore atomico, è un'espressione che è sempre della forma head[val1,val2,...]. In questo caso è in realtà qualcosa di simile Times[Power[Log[3], -1], Log[#+1]].

Distinguiamo tra i due casi applicando un'altra funzione al risultato. Quello che fa davvero l'applicazione è che sostituisce la headparte di un'espressione. Poiché i risultati di numeri interi sono atomici, l'applicazione di qualsiasi funzione non fa nulla. In particolare f @@ atom == atom.

Tuttavia, nell'altro caso, la testa viene sostituita. La funzione che stiamo utilizzando è quella -1&che è una semplice funzione che ignora i suoi argomenti e restituisce -1. Quindi otteniamo qualcosa -1&[Power[Log[3], -1], Log[#+1]]in casi non interi, che valuta direttamente -1. Involucro speciale tramite magia.


13

Python, 46 44 byte

lambda x:max(n*(3**n-1==x)for n in range(x))

Provalo online!

In questo caso, 0sarebbe il valore falso. Grazie a @ mbomb007 per aver segnalato l'output errato e un []risparmio di 2 byte .


puoi riscrivere come [n for n in range(x)if 3**n-1==x]-4 byte, svuotare la lista come falsy
Rod

Risolto, grazie! @Rod quindi ritornerebbe [n] invece di n penso
nmjcman101

@ nmjcman101 che non dovrebbe essere un problema
Rod

@Rod Preferirei aderire rigorosamente alle specifiche per ora
nmjcman101

@Rod Se è necessario emettere un numero intero, non è possibile emetterlo in un elenco a meno che l'OP non lo consenta espressamente.
mbomb007,


11

05AB1E , 7 byte

3IÝm<¹k

Provalo online!

Spiegazione

3        # push 3 
 I       # push input
  Ý      # range [0 ... input]
   m     # 3^[0 ... input]
    <    # -1
     ¹k  # find index of input, return -1 if not found

05AB1E è apparentemente bravo nella conversione di base è davvero questo l'approccio migliore?
Jasen

1
@Jasen: i miei tentativi con la conversione di base si sono rivelati più lunghi. Se c'è un modo migliore di questo non lo vedo. Sentiti libero di dimostrarmi che ho torto :)
Emigna,

abbastanza giusto, ho letto solo la descrizione della lingua e, quindi, mi aspetto di vedere una soluzione a 5 byte ....
Jasen,

1
@Jasen <3zm©.ïi®è il più vicino che non ho usato gamme come ha fatto lui.
Magic Octopus Urn

1
3DÝms<k... Non importa ... Non riesco a togliermi un altro byte, potrei giurare di poterlo fare.
Magic Octopus Urn

9

Gelatina , 5 byte

R3*’i

Emette x o 0 (falsy).

Provalo online!

Come funziona

R3*’i  Main link. Argument: n

R      Range; yield [1, ..., n].
 3*    Map each k to 3**k.
   ’   Decrement the results.
    i  First index of n (0 if not found).

6

Python 2, 41 byte

f=lambda n,i=0:i*0**n or n%3/2*f(n/3,i+1)

Una funzione ricorsiva che ritorna 0per input non corrispondenti. Ripetutamente il pavimento divide l'input per 3, contando il numero di passaggi i, che viene emesso alla fine. Tuttavia, se un passaggio produce un valore ndiverso da 2 modulo 0, il numero non era per 3^i-1, quindi l'output viene moltiplicato per 0.


6

Perl, 31 byte

say grep{3**$_-1==$i}0..($i=<>)

Richiede -Eflag per funzionare:

perl -E 'say grep{3**$_-1==$i}0..($i=<>)' <<< 26

Spiegazioni:
grep{3**$_-1==$i}0..($i=<>)restituisce un elenco degli elementi dell'intervallo 0..$_(ovvero da 0 all'ingresso) che soddisfano il test 3**$_-1==$i. Solo un elemento al massimo può soddisfare questo test, quindi questa istruzione restituirà un array di 0 o 1 elemento. Quindi stampiamo questo elenco: o il Xniente (che è falso).


5

Pyth, 11 byte

?-JjQ3 2ZlJ

Converte in base 3 e verifica l'uguaglianza in [2, 2, ..., 2].


Puoi ridurlo di un byte con ?-2JjQ3ZlJ, poiché <col> <num>e <num> <col>sono intercambiabili -in Pyth.
Notjagan,

5

JavaScript (ES7), 38 36 34 byte

f=(n,k=33)=>3**k-n-1&&--k?f(n,k):k

O solo 30 29 byte se va bene uscire con un errore in caso di errore:

f=(n,k)=>~(n-3**k)?f(n,-~k):k

Test


5

Java 8, 37 58 67 byte

i->{String s=i.toString(i,3);return s.matches("2*")?s.length():-1;}

Questo lambda si inserisce in un Function<Integer, Integer>riferimento e utilizza il semplice trucco base 3.

Questa volta dovrebbe funzionare correttamente.


3
Non verrebbe stampato True o False solo quando può essere scritto nel formato? Ma ho chiesto l'esponente quando il risultato è True
P. Ktinos il

2
È geniale! +1 per un approccio molto intelligente
DJMcMayhem

È intelligente ... credo che tu possa rimuovere le parentesi e farcela i->. Inoltre, se lo prendi icome a Long, puoi usare a.toString(...)(gli id ​​daranno alcuni avvertimenti sull'uso errato delle funzioni statiche, ma dovrebbero essere compilati). Tuttavia, come ha detto OP, è necessario restituire il valore, non solo Vero o Falso.
FlipTack

Se la lambda è memorizzata in un diverso tipo di funzione, il trucco statico funziona. Ho anche corretto il valore di ritorno. Devo aver perso quella parte.

5

Elaborazione, 60 56 byte

void q(float n){n=log(n+1)/log(3);print(n>(int)n?-1:n);}

Output -1se falsi.

Spiegazione

void q(float n){              // n is input
  n=log(n+1)/log(3);          // finds X in 3^X+1=n as a float (here we'll storing that in n)
  print(n>(int)n?-1:n);       // checks if the float is greater than
                              // the number rounded down (by int casting)
                              // if it is greater, output -1
                              // otherwise output X
}

voidè 1 byte più corto dell'uso float, quindi questa funzione emette direttamente invece di restituire un valore.

Soluzione alternativa

void z(float n){int c=0;for(++n;n>1;c++)n/=3;print(n==1?c:-1);}

per 63 byte, ma penso che questo alt possa essere golfato per essere più corto della soluzione originale. Ci sto lavorando.


@FlipTack Sì, sapevo che non sarebbe stato in Java. Ho chiesto solo perché non ero sicuro che Processing non avesse aggiunto qualcosa del genere. Il "valore distinto" da usare era però -1, non 0. È stato modificato da allora, quindi probabilmente ripulirò i miei commenti al riguardo.
Geobits il

Aspetta, quindi posso tornare 0ora?
Kritixi Lithos,

Direi ancora di no. La domanda fornisce un valore intero alternativo da utilizzare se falsy, ma 0non è mai falsa in Java / Processing di cui sono a conoscenza.
Geobits il

Pensavo che l'elaborazione fosse meno versbose di Java
Pavel

@Pavel Ma non uso lambdas: /
Kritixi Lithos il

4

Brachylog , 8 byte

,3:.^-?,

Provalo online!

Emette il valore se vero e false.se questo è impossibile.

Spiegazione

Questa è una trascrizione diretta della relazione data:

,     ,      (Disable implicit unification)
 3:.^        3^Output…
     -?              … - 1 = Input

Puoi quasi giocare a golf fino a 7 byte come +~^r~:3, ma sfortunatamente ~:non fa quello che ti aspetteresti (probabilmente perché :è una sintassi piuttosto che un built-in) e sembra essere trattato in modo identico :.

@ ais523 È corretto, :è un simbolo di controllo e ~funziona solo su predicati.
Fatalizza il

3

Perl 6 ,  25  24 byte

{first $_==3** *-1,0..$_}

Provalo

{first $_==3***-1,0..$_}

Rimuovere lo spazio dopo il **lavoro perché è più lungo dell'altro operatore infisso che potrebbe corrispondere *.
Quindi …***…viene analizzato come … ** * …piuttosto che … * ** ….

Provalo

Allargato:

{  # bare block lambda with implicit parameter 「$_」

  first
    $_ == 3 ** * - 1,   # WhateverCode lambda
    #          ^- current value

    0 .. $_             # a Range up-to (and including) the input

}

3

R, 24 byte

Un approccio diverso dalla risposta di plannapus e un byte più breve!

match(scan(),3^(1:99)-1)

Genera tutti i numeri interi da 3^1-1a 3^99-1e verifica se lo stdin corrisponde. In tal caso, restituisce l'indice a cui corrisponde, ovvero x. In caso contrario, restituisce NAun valore errato.

Per inciso, accetterà più valori come input e li testerà tutti, il che è una caratteristica accurata.


3

Prolog, 20 byte

d(A,X):-A#=(3**X)-1.

Questa lingua è fantastica da morire.

| ?- d(1024,X).

no
| ?- d(26,X).

X = 3

yes
| ?- d(2,X).

X = 1

yes

2

05AB1E , 9 byte

DÝ3sm<Q1k

Provalo online!

Stampa -1 per falsa.

D         # Duplicate the input
 Ý3sm     # Push [0 .. input]^3 (e.g. [0^3, 1^3, 2^3, 4^3 ...])
     <    # subtract 1
      Q   # push a 1 everywhere that equals the input, and 0 everywhere else
       1k # push the index of the 1, or -1 if not found
          # implicit output

2

MATL , 8 byte

3i:^qG=f

Questo genera il numero xse esiste, o altrimenti non produce nulla, il che è falso.

Provalo online!

Spiegazione

3    % Push 3
i    % Input n
:    % Range: gives `[1 2 ... n]
^    % Power, element-wise. Gives [3^1 3^2 ... 3^n]
q    % Subtract 1, element-wise. Gives [3^1-1 3^2-1 ... 3^n-1]
=    % Test for equality. Contains 'true' at the position x, if any,
     % where 3^x-1 equals n
f    % Find. Gives index of the 'true' position, which ix x; or gives
     % an empty array if no such position exists. Implicitly display

2

Japt , 11 byte

o æ@U+1¥3pX

Provalo qui .

Grazie mille a ETHproductions per l'aiuto!


2

Python 3, 74 66 64 byte

-10 byte grazie a @ mbomb007, @FlipTack e @ nmjcman101

from math import*
def f(n):x=ceil(log(n,3));print((3**x-1==n)*x)

Puoi mettere tutto il tuo codice su una riga e utilizzarlo from math import*. Inoltre return n==3**x-1and x.
mbomb007,


@ mbomb007 Le funzioni sono autorizzate a stampare il risultato STDOUT, quindi è possibile modificarlo per tornare a una stampa.
FlipTack

Se lo presenti come soluzione SageMath anziché come Python, puoi eliminare completamente la prima riga.
Federico Poloni,

Insieme all'altra riduzione a 65 byte, è possibile utilizzare import mathe math.ceilper un singolo byte. Inoltre puoi 3**x-1==n and xx*(3**x-1==n)
passare


2

C, 56 byte

 n;f(a){n=0;for(a++;!(a%3)&&(a/=3);++n);return --a?-1:n;}

aggiungi uno all'input e poi dividi ripetutamente per tre fino a quando non viene trovato un resto, se quello viene raggiunto restituisci il conteggio delle divisioni -1


Salva un byte con a%3<1invece di !(a%3). Ancora uno con 0falsy.
Tito

Supponendo che tu stia utilizzando GCC per compilare, puoi salvare un totale di 10 (11) byte: non è necessario inizializzare n su zero se sai che chiamerai questa funzione solo una volta da allora, allora n sarà zero per impostazione predefinita ( perché è globale) - 4 byte in meno; inoltre non hai bisogno dell'istruzione return, scrivendo a=--a?-1:n;risparmierai 5 byte. se una funzione non nulla non ha ritorno, utilizzerà solo l'ultimo incarico. Anche quello che ha detto @Titus.
Etaoin Shrdlu,

1
Suggerisci a%3?0:(a/=3)invece di!(a%3)&&(a/=3)
ceilingcat l'

2

Utilità Bash / Unix, 37 35 byte

bc<<<`dc<<<3o$1p|grep ^2*$|wc -c`-1

Provalo online!

Usa dc per convertire in base 3, controlla che la stringa risultante sia tutta 2s, conta il numero di caratteri (inclusa una nuova riga), quindi usa bc per sottrarre 1.

Se il numero nella base 3 non è tutto 2s, grep non produce nulla (nemmeno una nuova riga), quindi il conteggio dei caratteri è 0 e sottraendo 1 si ottiene -1.


2

C compilato con Clang 3.8.1, 53 , 52 , 54 , 51 byte

n;f(y){y++;for(n=0;y%3==0;y/=3)n++;return y^1?0:n;}

@SteadyBox ha già pubblicato una soluzione in C, ma sto usando un approccio diverso.

@Grazie a Jasen per l'aiuto nel salvataggio dei byte.


1
sì, ma funziona? confrontare i float per l'uguaglianza è spesso una ricetta per un fallimento imprevisto (provare input di grandi dimensioni)
Jasen

@Jasen Hmm, non l'ho provato, ma in C logritorna doublequindi forse potrebbe funzionare.
Wade Tyler,

double è un tipo di valore in virgola mobile, quindi il problema persiste.
Jasen

sembra funzionare bene per 3 ^ 19 che è probabilmente abbastanza grande.
Jasen,

@Jasen Non funziona per 3 ^ 10
Wade Tyler

2

C, 42 byte, ottimizzato da Wade Tyler's

n;f(y){for(n=0;y%3>1;y/=3)n++;return!y*n;}

Provare

C, 37 byte, senza return

n;f(y){for(n=0;y%3>1;y/=3)n++;n*=!y;}

Provare

nè globale ma (I)MULpuò solo avere il suo operando dest in un registro, quindi bisogna inserirlo EAX(la solita scelta) e spostarlo lì

JavaScript 6, 32 byte

f=(y,n)=>y%3>1?f(y/3|0,-~n):!y*n
;[1,2,3,8,12,43046720].forEach(x=>console.log(f(x)))

Se il "falso" deve essere lo stesso, 33 byte:

f=(y,n)=>y%3>1?f(y/3|0,-~n):!y&&n

2

Pyt , 10 9 byte

←⁺3ĽĐĐƖ=*

Spiegazione:

←                Get input
 ⁺               Add one
  3Ľ             Log base 3
    ĐĐ           Triplicate top of stack
      Ɩ          Convert top of stack to integer
       =         Check for equality between top two on stack
        *        Multiply by log_3(input+1)


Salvato un byte utilizzando la funzione di incremento invece di aggiungere esplicitamente 1


in quale code page sono quei 9 byte? (in UTF-8 sono 17 byte)
Jasen l'

1

Python, 64 byte

Emette Falsese il numero non può essere scritto in quel formato.

def f(n):L=[3**x-1for x in range(n)];print n in L and L.index(n)

Funziona anche con 64 byte e stampa una stringa vuota come output errato:

def f(n):
 try:print[3**x-1for x in range(n)].index(n)
 except:0

Una soluzione creativa per 65 byte, 0risultando falsa:

lambda n:-~",".join(`3**x-1`for x in range(n+1)).find(',%s,'%n)/2

Non emette x-1.
Dfernan,

Il programma dovrebbe essere emesso xinvece che nin caso di corrispondenza.
Dfernan,

No, dovrebbe generare un numero intero positivo che, se sostituito con X, ottiene l'input. La domanda si riferisce a X come una variabile, non come una stringa
P. Ktinos,

@ P.Ktinos Risolto il problema.
mbomb007,


1

Julia, 30 byte

n->findfirst(n.==3.^(0:n)-1)-1

È una funzione semplice: crea un vettore che ha un truesolo nella posizione corrispondente in 3^a-1, dove aè un vettore contenente numeri interi compresi tra 0 e n. Trova la "prima" posizione che è truee sottrae 1 (se è tutto false, la ricerca restituisce zero e restituisce -1).

Come 0:nha 0in primo luogo, i sottrarre 1 corregge per l'indicizzazione e consente inoltre di -1risposta falsa.



1

Pyth 8 byte

xm^3dUQh

     UQ  # generate all values 1..Q (Q is the input)
 m^3d    # map 3^d over this ^ list
x      h # find the input+1 (hQ) in the result of the last command

Prova qui

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.