Bu numara (3 ^ x) - 1 formatında yazılabilir mi?


41

Meydan okuma:

Pozitif bir tamsayı kabul eden ve X'in başka bir pozitif tamsayı olduğu (3 ^ x) -1 şeklinde yazılıp yazılmadığını kontrol eden bir program oluşturun .

Olabilirse, X çıktısını alın

Olmazsa , -1 veya sahte bir deyim çıktı .

Örnek girişler / çıkışlar

Giriş:

2

(3 ^ 1) - 1 olarak yazılabilir, bu yüzden 1 olan x çıktısını alırız.

Çıktı:

1

Giriş:

26

26 (3 ^ 3) - 1 olarak yazılabilir, bu yüzden x (3) çıktısını alırız.

Çıktı:

3

Giriş:

1024

1024 (3 ^ x) - 1 biçiminde yazılamaz, bu nedenle -1 çıktı

Çıktı:

-1

Bu yani en az bayt miktarı kazanır.


İlgili OEIS : A024023


4
X çıktısını istiyorum çünkü daha zorlu olduğuna inanıyorum. Basitçe 3 ^ x - 1 biçiminde olup olmadığını bulmak, bence bir meydan okuma için çok kolay olurdu.
P. Ktinos

2
Programlama dilinizde yanlış bir ifade yoksa, o zaman hayır.
P. Ktinos,

2
Sayının üçlü olarak girilmesini isteyebilir miyim?
John Dvorak

2
Negatif olmayan interger'lerle uğraşmak, 0 değerini 3^0-1 geçerli bir çıktı yapar ve bu nedenle false olarak kullanılamaz,
Jasen

2
log()Cevaplarında kullanmayı düşünen herhangi biri , girdi 5olduğunda doğru cevabı verdiğini onaylamalıdır 242.
Jasen

Yanıtlar:


23

Mathematica, 21 16 bayt

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

Mathematica'nın sembolik hesaplamasını kullanır. Eğer #+1üçün gücü ise o Log[3,#+1]zaman atomik bir değer olan bir tamsayı sonucu hesaplayacaktır. Aksi takdirde Log[#+1]/Log[3]olduğu gibi alacağız . Bu bir atomik değer olmadığından, daima formda olan bir ifadedir head[val1,val2,...]. Bu durumda aslında böyle bir şey Times[Power[Log[3], -1], Log[#+1]].

Sonucu başka bir fonksiyonla uygulayarak iki durumu birbirinden ayırıyoruz. Gerçekten uygulama yapan şey head, bir ifadenin yerini almasıdır. Tamsayı sonuçları atomik olduğundan, bunlara herhangi bir işlevi uygulamak hiçbir şey yapmaz. Özellikle f @@ atom == atom.

Bununla birlikte, diğer durumda, kafa değiştirilir. Kullandığımız işlev -1&, argümanlarını görmezden gelen ve döndüren basit bir işlevdir -1. Böylece -1&[Power[Log[3], -1], Log[#+1]]tamsayı olmayan durumlarda doğrudan değerlendirilen bir şey elde ederiz -1. Büyü ile özel kasa.


13

Python, 46 44 bayt

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

Çevrimiçi deneyin!

Bu durumda, 0sahte değer olacaktır. Hatalı çıktımı ve 2 bayt []tasarrufu göstermediğim için @ mbomb007 sayesinde .


[n for n in range(x)if 3**n-1==x]-4 bayt için yeniden yazabilirsiniz , sahte olarak boş liste
Rod

Sabit, teşekkür ederim! @Rod sonra n sanırım n yerine [n] olur
nmjcman101

@ nmjcman101 bu bir problem olmamalı
Rod

@Rod kesinlikle şimdilik belirtime uymayı tercih ederim
nmjcman101 16

@Rod Bir tamsayı çıkarmanız gerekiyorsa, OP özellikle izin vermediği sürece bir listede çıkarmazsınız.
mbomb007


11

05AB1E , 7 bayt

3IÝm<¹k

Çevrimiçi deneyin!

açıklama

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 görünüşe göre baz dönüşümde iyidir, bu gerçekten en iyi yaklaşım mı?
Jasen

1
@Jasen: Temel dönüştürme girişimlerimin tümü daha uzun sürdü. Bundan daha iyi bir yol varsa, göremiyorum. Bana yanlış olduğunu kanıtlamaktan çekinmeyin :)
Emigna

yeterince adil, sadece dilin tanımını okudum ve 5 baytlık bir çözüm görmeyi
bekledim

1
@ Jasen <3zm©.ïi®, yaptığı gibi aralıkları kullanmadığım en yakın şey.
Sihirli Ahtapot Urn

1
3DÝms<k... Nevermind ... Bir bayt daha kesemem, yemin edebilirim.
Magic Octopus Urn

9

Jöle , 5 bayt

R3*’i

Çıktılar x veya 0 (yanlış).

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

0Eşleşmeyen girişler için dönen bir özyinelemeli işlev . Tekrar tekrar zemine girişi i, sonunda çıkan adım sayısını sayarak 3'e böler . Ancak, herhangi bir adım n2 modulo 0 olmayan bir değer üretiyorsa , sayı için değildi 3^i-1, bu nedenle çıktı 0 ile çarpılır.


6

Perl, 31 bayt

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

-EÇalıştırmak için bayrak gerektirir :

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

Açıklamalar: testi sağlayan
grep{3**$_-1==$i}0..($i=<>)aralıktaki elemanların bir listesini 0..$_(ör. 0'dan girişe) döndürür 3**$_-1==$i. En fazla yalnızca bir eleman bu testi karşılayabilir, bu nedenle bu komut 0 veya 1 elemanlı bir dizi döndürür. Daha sonra bu listeyi yazdırıyoruz: ya Xhiç ya da hiçbir şey (ki bu sahtedir).


5

Pyth, 11 bayt

?-JjQ3 2ZlJ

Tabana 3 dönüştürür ve eşitliği kontrol eder [2, 2, ..., 2].


Sen sadece bir byte bu azaltabilir ?-2JjQ3ZlJçünkü <col> <num>ve <num> <col>için birbirleriyle değiştirilebilir -Pyth içinde.
değil

5

JavaScript (ES7), 38 36 34 bayt

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

Veya başarısızlıkla ilgili bir hatayla çıkmak uygunsa, sadece 30 29 bayt:

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

Ölçek


5

Java 8, 37 58 67 bayt

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

Bu lambda Function<Integer, Integer>referansa uyuyor ve basit 3 tabancasını kullanıyor.

Bu sefer düzgün çalışması gerekir.


3
Bu yalnızca biçiminde yazılabildiğinde Doğru veya Yanlış olarak yazdırılmaz mı? Ama sonuç True olduğunda üs için sordum
P. Ktinos

2
Bu dahi! Çok akıllıca bir yaklaşım için +1
DJMcMayhem

Bu akıllıca ... parenleri çıkarabileceğinizi ve başarabileceğinizi düşünüyorum i->. Ayrıca, ia olarak Longalırsanız, kullanabilirsiniz a.toString(...)(ides statik fonksiyonları yanlış kullanma konusunda bazı uyarılar verecektir, fakat derlemelidir). Ancak, OP’nin dediği gibi, yalnızca Doğru veya Yanlış değil, değeri de döndürmeniz gerekir.
FlipTack

Lambda farklı bir fonksiyon tipinde saklanırsa, statik numara çalışır. Ben de dönüş değerini düzelttim. O kısmı özlemiş olmalıyım.

5

İşlem, 60 56 bayt

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

Çıkışlar -1falsy eğer.

açıklama

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
}

voidkullanımdan 1 bayt daha kısadır float, bu nedenle bu işlev bir değer döndürmek yerine doğrudan çıktı verir.

Alternatif çözüm

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

63 bayt için, ancak bu alt orijinal çözümden daha kısa olması için golf olabilir düşünüyorum. Üzerinde çalışıyorum.


@FlipTack Evet, Java'da olmayacağını biliyordum. Sadece sordum, çünkü İşleme'nin bu satırlar boyunca bir şey eklemediğinden emin değildim. Kullanılacak "farklı değer" -1 olsa da, 0 değildi. O zamandan beri değişti, bu yüzden muhtemelen bu konudaki yorumlarımı temizleyeceğim.
Geobits

Bekle, 0şimdi geri dönebilir miyim ?
Kritixi Lithos,

Hala hayır derdim. Soru, eğer sahte olursa kullanmak için alternatif bir tamsayı değeri verir, ancak 0Java / İşlemde bildiğim kadarıyla asla sahte değildir.
Geobits

İşleme yestoday ben olması gerekiyordu az daha versbose Java
Pavel

@Pavel Ama lambdas kullanmıyorum: /
Kritixi Lithos

4

Brachylog , 8 bayt

,3:.^-?,

Çevrimiçi deneyin!

True ve false.bu imkansız ise değeri verir .

açıklama

Bu verilen ilişkinin doğrudan bir kopyasıdır:

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

Neredeyse 7 bayta kadar bu golf oynayabilirsiniz +~^r~:3, ancak ne yazık ki ~:beklediğiniz şeyi yapmaz (muhtemelen :bir yerleşik yerine sözdizimi olduğu için) ve aynı şekilde ele alınmış gibi görünüyor :.

@ ais523 Bu doğru, :bir kontrol sembolüdür ve ~yalnızca tahminlerde işe yarar .
17'de

3

Perl 6 ,  25  24 bayt

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

Dene

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

Çalışdıktan sonra boşluğu kaldırmak, **eşleşebilecek diğer infix operatöründen daha uzun olduğu için *.
Öyle değil …***…ayrıştırılır .… ** * …… * ** …

Dene

Expanded:

{  # 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 bayt

Plannapus'un cevabından farklı bir yaklaşım ve bir bayt daha kısa!

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

Tüm tamsayıları oluşturur 3^1-1etmek 3^99-1ve kontroller Stdin eşleşirse. Öyleyse, eşleştiği dizini döndürür, ki bu x. Değilse, NAsahte değer olarak döner .

Bu arada, girdi olarak çoklu değerleri kabul edecek ve temiz bir özellik olan hepsini test edecektir.


3

Prolog, 20 bayt

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

Bu dil cehennem kadar havalı.

| ?- d(1024,X).

no
| ?- d(26,X).

X = 3

yes
| ?- d(2,X).

X = 1

yes

2

05AB1E , 9 bayt

DÝ3sm<Q1k

Çevrimiçi deneyin!

Sahte için -1 yazdırır.

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 bayt

3i:^qG=f

Bu, sayı xvarsa veya aksi takdirde hiçbir şey çıkmadığında çıktısını alır;

Çevrimiçi deneyin!

açıklama

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

Python 3, 74 66 64 bayt

-10 bayt @ mbomb007, @FlipTack ve @ nmjcman101 sayesinde

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

Tüm kodunuzu tek bir satıra koyabilir ve kullanabilirsiniz from math import*. Ayrıca return n==3**x-1and x.
mbomb007


@ mbomb007 Fonksiyonun sonucu yazdırabilmesine izin verir STDOUT, böylece bir baskıya geri dönüşünü değiştirebilirsiniz.
FlipTack

Bunu bir Python yerine SageMath çözümü olarak sunarsanız , ilk satırı tamamen bırakabilirsiniz.
Federico Poloni

65 bayt diğer azalma ile birlikte, kullanabileceğiniz import mathve math.ceiltek bir bayt için. Ayrıca açabilirsiniz 3**x-1==n and xiçinx*(3**x-1==n)
nmjcman101


2

C, 56 bayt

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

girişe bir tane ekleyin ve sonra kalanı bulunana kadar art arda üçe bölün, birine ulaşılırsa, diğer -1 sayısını döndürün


a%3<1Bunun yerine bir bayt kaydedin !(a%3). Daha Tek 0falsy için.
Titus

Derlemek için GCC kullandığınızı varsayarsak, toplam 10 (11) bayt kaydedebilirsiniz: eğer bu işlevi sadece bir kez çağıracağınızı biliyorsanız n'nin sıfır olması gerekmeyecektir. çünkü bu global) - 4 bayt daha az; Ayrıca return ifadesine ihtiyacınız yoktur, yazarak a=--a?-1:n;5 bayt kaydedersiniz. Boş olmayan bir fonksiyonun geri dönüşü yoksa, sadece son ödevi kullanır. Ayrıca @Titus'un dediği gibi.
Etaoin Shrdlu

1
Öner a%3?0:(a/=3)yerine!(a%3)&&(a/=3)
ceilingcat

2

Bash / Unix yardımcı programları, 37 35 bayt

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

Çevrimiçi deneyin!

Base 3'e dönüştürmek için dc'yi kullanır, elde edilen dizenin tümünün 2s olduğunu kontrol eder, karakter sayısını (bir yeni satır dahil) sayar ve sonra 1'i çıkarmak için bc'yi kullanır.

Taban 3'teki sayı 2'nin tümü değilse , grep hiçbir şey çıkarmaz (yeni satır bile değil), bu nedenle karakter sayısı 0 olur ve 1 çıkarılırsa -1 olur.


2

Clang 3.8.1, 53 , 52 , 54 , 51 Bayt ile derlenen C

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

@SteadyBox C'ye zaten bir çözüm yolladı, ancak farklı bir yaklaşım kullanıyorum.

@ Baytları kurtarmaya yardımcı olduğu için Jasen'a teşekkür ederiz.


1
evet, ama işe yarıyor mu? float'ları eşitlik için karşılaştırmak çoğu zaman beklenmedik bir başarısızlık için bir reçetedir (büyük girdiler deneyin)
Jasen

@ Jasen Hmm, bunu denemedim, ama C loggeri döndüğü doubleiçin işe yarayabilir.
Wade Tyler

double bir tür kayar nokta değeridir, bu yüzden problemi devam eder.
Jasen

Tamam, muhtemelen yeterince büyük olan 3 ^ 19 için çalışıyor gibi görünüyor.
Jasen

@Jasen 3 ^ 10 için çalışmıyor
Wade Tyler

2

C, 42 Bayt, Wade Tyler’dan optimize edildi

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

Deneyin

C, 37 Bayt, olmadan return

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

Deneyin

nküreseldir ancak (I)MULkayıt işleyişini sadece bir kayıt defterinde tutabilir, o zaman EAX(her zamanki seçim) yerine koymalı ve hareket etmelidir.

JavaScript 6, 32 Bayt

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

"Sahte" nin aynı olması gerekiyorsa, 33 Bayt:

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

2

Pyt , 10 9 bayt

←⁺3ĽĐĐƖ=*

Açıklama:

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


Açıkça eklemek yerine, artırma işlevini kullanarak bir bayt kaydedildi 1


Hangi kod sayfasında 9 bayt? (UTF-8’de 17 bayttır)
Jasen

1

Python, 64 bayt

Çıkışlar Falsenumarası o biçiminde yazılmış edilemezse.

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

Bu ayrıca 64 baytta çalışır ve boş dizeyi sahte çıktı olarak yazdırır:

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

0Sahte çıktılar için 65 baytlık yaratıcı bir çözüm :

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

Çıkmıyor xda -1.
dfernan

Bir eşleşme xyerine programın çıkması gerekir n.
dfernan

Hayır, X ile değiştirildiğinde girdi aldığınız pozitif tamsayıyı vermelidir. Soru, X'i bir dize olarak değil, bir değişken olarak ifade eder
P. Ktinos,

@ P.Ktinos Sabitledi.
mbomb007


1

Julia, 30 bayt

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

Bu basit bir fonksiyondur - truesadece içinde 0 ile tamsayı içeren bir vektörün 3^a-1bulunduğu karşılık gelen konumda olan abir vektör oluşturur n. Bulunan "ilk" konumunu bulur trueve 1'i çıkarır (hepsi falseise, bulma sıfıra döner ve -1 ile döner).

Olarak 0:nbulunur 0, ilk nokta, aynı zamanda çıkarma 1 indeksleme için düzeltir ve etkinleştirme -1yanlış cevap.



1

Pyth 8 bayt

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

Burada dene

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.