Wyzwanie:
Utwórz program, który akceptuje dodatnią liczbę całkowitą i sprawdza, czy można go zapisać w postaci (3 ^ x) -1, gdzie X to kolejna dodatnia liczba całkowita .
Jeśli to możliwe, wypisz X
Jeśli nie, wypisz -1 lub instrukcję fałszowania .
Przykładowe wejścia / wyjścia
Wejście:
2
Można go zapisać jako (3 ^ 1) - 1, więc wypisujemy x, który jest 1
Wynik:
1
Wejście:
26
26 można zapisać jako (3 ^ 3) - 1, więc wypisujemy x (3)
Wynik:
3
Wejście:
1024
1024 nie można zapisać w postaci (3 ^ x) - 1, więc wypisujemy -1
Wynik:
-1
To jest golf golfowy, więc wygrywa najmniej bajtów
Powiązany OEIS: A024023
3^0-1
prawidłowym wyjściem, a zatem nie byłby użyteczny jako fałsz,log()
w swojej odpowiedzi, powinien potwierdzić, że poda prawidłową odpowiedź,5
gdy242
zostanie wprowadzona.Odpowiedzi:
Mathematica,
2116 bajtówWykorzystuje obliczenia symboliczne Mathematica. Jeśli
#+1
jest potęgą trzech, wówczasLog[3,#+1]
wyliczy liczbę całkowitą, która jest wartością atomową. W przeciwnym razie dostaniemyLog[#+1]/Log[3]
jak jest. Ponieważ nie jest to wartość atomowa, jest to wyrażenie, które zawsze ma formęhead[val1,val2,...]
. W tym przypadku tak naprawdę jest coś takiegoTimes[Power[Log[3], -1], Log[#+1]]
.Rozróżniamy te dwa przypadki, stosując do wyniku inną funkcję. Zastosowanie naprawdę polega na tym, że zastępuje
head
część wyrażenia. Ponieważ wyniki liczb całkowitych są atomowe, zastosowanie do nich dowolnej funkcji nic nie robi. W szczególnościf @@ atom == atom
.Jednak w drugim przypadku głowa zostaje wymieniona. Używamy funkcji,
-1&
która jest prostą funkcją, która ignoruje argumenty i zwraca-1
. Otrzymujemy więc coś-1&[Power[Log[3], -1], Log[#+1]]
w przypadkach niecałkowitych, co ocenia bezpośrednio na-1
. Specjalna obudowa dzięki magii.źródło
Python,
4644 bajtówWypróbuj online!
W tym przypadku
0
byłaby to wartość fałszowania. Dzięki @ mbomb007 za wskazanie mojej niepoprawnej pracy oraz 2 bajtów braku[]
oszczędności.źródło
[n for n in range(x)if 3**n-1==x]
na -4 bajty, pusta lista jako fałszHaskell, 35 bajtów
Przykład użycia:
f 26
->3
.źródło
05AB1E , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
<3zm©.ïi®
jest najbliżej, że nie używam zakresów tak jak on.3DÝms<k
... Nieważne ... Nie mogę zgolić jeszcze jednego bajta, mógłbym przysiąc, że mógłbym.Galaretka , 5 bajtów
Wyprowadza x lub 0 (fałsz).
Wypróbuj online!
Jak to działa
źródło
Python 2, 41 bajtów
Funkcja rekurencyjna, która zwraca
0
niepasujące dane wejściowe. Kilkakrotnie piętro dzieli dane wejściowe przez 3, licząc liczbę krokówi
, które są wysyłane na końcu. Ale jeśli jakikolwiek krok daje wartość,n
która nie jest równa 2 modulo 0, liczba nie była dla3^i-1
, więc wynik jest mnożony przez 0.źródło
Perl, 31 bajtów
Wymaga
-E
flagi do uruchomienia:Objaśnienia:
grep{3**$_-1==$i}0..($i=<>)
zwraca listę elementów zakresu0..$_
(tj. Od 0 do wejścia), które spełniają test3**$_-1==$i
. Tylko jeden element może spełnić ten test, więc instrukcja zwróci tablicę 0 lub 1 element. Następnie drukujemy tę listę: alboX
albo nic (co jest fałszem).źródło
Pyth, 11 bajtów
Konwertuje na bazę 3 i sprawdza równość na
[2, 2, ..., 2]
.źródło
?-2JjQ3ZlJ
, ponieważ<col> <num>
i<num> <col>
są one wymienne-
w Pyth.JavaScript (ES7),
383634 bajtówLub tylko
3029 bajtów, jeśli można wyjść z błędem w przypadku niepowodzenia:Test
Pokaż fragment kodu
źródło
Java 8,
375867 bajtówTa lambda pasuje do
Function<Integer, Integer>
odniesienia i wykorzystuje prostą sztuczkę base 3.Tym razem powinno działać poprawnie.
źródło
i->
. Ponadto, jeśli weźmieszi
jako aLong
, możesz użyća.toString(...)
(ides poda ostrzeżenia o niepoprawnym używaniu funkcji statycznych, ale powinno się skompilować). Jednak, jak powiedział OP, musisz zwrócić wartość, a nie tylko Prawdę czy Fałsz.Przetwarzanie,
6056 bajtówWysyła,
-1
jeśli jest fałsz.Wyjaśnienie
void
jest o 1 bajt krótszy niż użyciefloat
, dlatego funkcja ta wyświetla bezpośrednio dane zamiast zwracać wartość.Alternatywne rozwiązanie
dla 63 bajtów, ale myślę, że ten alt może być golfowany krótszy niż oryginalne rozwiązanie. Pracuję nad tym.
źródło
0
teraz wrócić ?0
nigdy nie jest fałszem w Javie / Przetwarzaniu, które znam.Brachylog , 8 bajtów
Wypróbuj online!
Zwraca wartość, jeśli jest to prawda, a
false.
jeśli jest to niemożliwe.Wyjaśnienie
To jest bezpośrednia transkrypcja danej relacji:
źródło
+~^r~:3
, ale niestety~:
nie robi tego, czego możesz się spodziewać (prawdopodobnie dlatego, że:
jest składnią, a nie wbudowaną) i wydaje się być traktowane identycznie:
.:
jest symbolem kontrolnym i~
działa tylko w predykatach.Perl 6 ,
2524 bajtówSpróbuj
Usuwanie miejsca po zakończeniu
**
pracy, ponieważ jest ono dłuższe niż inny operator poprawki, który może pasować*
.Więc
…***…
jest parsowany jako… ** * …
raczej niż… * ** …
.Spróbuj
Rozszerzony:
źródło
R, 24 bajty
Inne podejście niż odpowiedź plannapa i jeden bajt krótszy!
Generuje wszystkie liczby całkowite od
3^1-1
do3^99-1
i sprawdza, czy standardowe wejście jest zgodne. Jeśli tak, zwraca indeks, do którego pasuje, czylix
. Jeśli nie, zwracaNA
wartość falsy.Nawiasem mówiąc, zaakceptuje wiele wartości jako dane wejściowe i przetestuje je wszystkie, co jest fajną cechą.
źródło
Prolog, 20 bajtów
Ten język jest świetny jak diabli.
źródło
05AB1E , 9 bajtów
Wypróbuj online!
Drukuje -1 dla fałszu.
źródło
MATL , 8 bajtów
Daje to liczbę,
x
jeśli istnieje, lub w inny sposób nic nie daje, co jest fałszem.Wypróbuj online!
Wyjaśnienie
źródło
Japt , 11 bajtów
Wypróbuj tutaj .
Ogromne podziękowania dla ETHproductions za pomoc!
źródło
Python 3,
746664 bajtów-10 bajtów dzięki @ mbomb007, @FlipTack i @ nmjcman101
źródło
from math import*
. Równieżreturn n==3**x-1and x
.STDOUT
, dzięki czemu można zmienić powrót do wydruku.import math
imath.ceil
dla jednego bajtu. Możesz także zwrócić się3**x-1==n and x
dox*(3**x-1==n)
Rubinowy, 30 bajtów
Zwraca
nil
(wartość falsy), jeśli nie znaleziono żadnej liczby. [Wypróbuj online]źródło
C, 56 bajtów
dodaj jeden do wejścia, a następnie kilkakrotnie podziel przez trzy, aż do znalezienia reszty, jeśli jeden zostanie osiągnięty, zwróć liczbę podziałów -1
źródło
a%3<1
zamiast!(a%3)
. Jeszcze jedno z0
falsy.a=--a?-1:n;
, że zaoszczędzisz 5 bajtów. jeśli funkcja nie-void nie ma powrotu, użyje tylko ostatniego przypisania. Także to, co powiedział @Titus.a%3?0:(a/=3)
zamiast!(a%3)&&(a/=3)
Narzędzia Bash / Unix,
3735 bajtówWypróbuj online!
Używa dc do konwersji do podstawy 3, sprawdza, czy wynikowy ciąg składa się z 2, zlicza liczbę znaków (łącznie z nową linią), a następnie używa bc do odejmowania 1.
Jeśli liczba w bazie 3 to nie wszystkie 2 s, to grep nic nie wypisuje (nawet nowej linii), więc liczba znaków wynosi 0, a odjęcie 1 daje -1.
źródło
C skompilowany z Clang 3.8.1,
53,52,54, 51 bajtów@ SteadyBox już opublikował rozwiązanie w C, ale używam innego podejścia.
@Dziękujemy Jasen za pomoc w oszczędzaniu bajtów.
źródło
log
zwraca,double
więc może to zadziała.C, 42 bajty, zoptymalizowane przez Wade'a Tylera
Próbować
C, 37 bajtów, bez
return
Próbować
n
ma charakter globalny, ale(I)MUL
może mieć tylko operand przeznaczenia w rejestrze, więc należy wprowadzićEAX
(zwykły wybór) i przenieść się tamJavaScript 6, 32 bajtów
Jeśli „fałsz” musi być taki sam, 33 bajty:
źródło
Pyt ,
109 bajtówWyjaśnienie:
Zapisano bajt za pomocą funkcji inkrementacji zamiast jawnego dodawania 1
źródło
Python, 64 bajty
Wyprowadzane,
False
jeśli liczby nie można zapisać w tym formacie.Działa to również w 64 bajtach i wyświetla pusty ciąg znaków jako wynik wyjściowy falsy:
Kreatywne rozwiązanie dla 65 bajtów, generujące
0
falsy:źródło
x
ani-1
.x
zamiastn
w przypadku dopasowania.Pyth, 10 bajtów
Wypróbuj tutaj!
źródło
Julia, 30 bajtów
Jest to prosta funkcja - tworzy wektor, który ma
true
tylko w odpowiedniej pozycji w3^a-1
, gdziea
wektor zawiera liczby całkowite od 0 don
. Znajduje „pierwszą” pozycję, która jest,true
i odejmuje 1 (jeśli to wszystkofalse
, znalezisko jest oceniane na zero i zwraca -1).Jak
0:n
ma0
na pierwszym miejscu, odjąć 1 koryguje indeksowania, a także pozwala na-1
fałszywą odpowiedź.źródło
Pyke,
96 bajtówWypróbuj tutaj!
Stara 9-bajtowa wersja:
Wypróbuj tutaj!
źródło
Pyth 8 bajtów
Wypróbuj tutaj
źródło