Każdy termin w sekwencji kwadratu, x n , jest tworzony przez pobranie x n-1 , podniesienie go do kwadratu i usunięcie wszystkich oprócz pierwszych czterech cyfr.
Sekwencja zawsze zaczyna się od x 1 = 1111 . Kwadrat ten daje 1234321, więc x 2 = 1234
Pierwsze kilka warunków to:
1111
1234
1522
2316
5363
...
Wyzwanie
Twoim zadaniem jest, biorąc pod uwagę nieujemną liczbę całkowitą n , obliczyć x n . Możesz przesłać pełny program wykonujący operacje we / wy lub funkcję, która przyjmuje parametr n jako parametr.
Twoje rozwiązanie może mieć zero lub jeden indeks, o ile określisz, które.
Ponieważ wszystkie terminy w tej sekwencji są krótsze niż 5 cyfr, Twój kod powinien być tak krótki, jak to możliwe. Obowiązują standardowe luki w kodzie golfowym .
Niech zwycięży najlepszy golfista!
Przypadki testowe
Uwaga: są one indeksowane 1.
1 -> 1111
8 -> 6840
15 -> 7584
20 -> 1425
80 -> 4717
Odpowiedzi:
05AB1E ,
87 bajtówKod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
JavaScript (ES7),
444336 bajtówTo świetny przykład nadużywania przymusu typu:
**
konwertuje oba argumenty na liczby i+
konwertuje oba argumenty na ciągi znaków, chyba że oba są liczbami. Oznacza to, żef(n)**2+f
najpierw konwertujef(n)
się na liczbę i podnosi ją do kwadratu, a następnie łączy wynik z reprezentacją ciąguf
. Następnie możemy użyć.slice
do pobrania pierwszych 4 znaków ciągu.Oto kilka alternatywnych podejść, które nie używają ciągów:
Testowy fragment kodu
Pokaż fragment kodu
Uwaga: ta funkcja jest używana,
Math.pow
ponieważ**
nie jest obsługiwana we wszystkich przeglądarkach.źródło
Haskell, 40 bajtów
Jest to sekwencja oparta na 0. Przykład użycia:
((iterate(read.take 4.show.(^2))1111)!!) 79
->4717
.Jak to działa:
źródło
Mathematica, 48 bajtów
Funkcja bez nazwy przyjmująca argument liczby całkowitej; 0-indeksowane. Wykorzystuje cztery trzy bajtowe znaki
⌊⌊⌋⌋
: Mathematica używa albo,Floor[x]
albo⌊x⌋
zaokrągla liczbę rzeczywistą w dół do liczby całkowitej, a ta ostatnia jest zazwyczaj o jeden mniej bajta. Nazwy poleceń w Mathematica do konwersji liczb całkowitych na ciągi są zbyt długie, dlatego zamiast tego wykonujemy obliczenia matematyczne, aby znaleźć pierwsze cztery cyfry x ^ 2: bierzemy logarytm dziesiętny x ^ 2, odejmujemy jego część całkowitą, podnosimy 10 z powrotem do tej mocy, pomnóż przez 1000 i zaokrąglaj w dół.tl; dr: logarithms ftw
źródło
Python 2,
514644 bajtówZnowu źle! Funkcja rekurencyjna powraca. Jest to jeden indeks.Chciałbym się pozbyć niezgrabnego,Okazuje się, że momentif
jeśli to możliwe, ale myślę, żeexec
może być krótszy ..exec
jest krótszy.Alternatywne 46-bajtowe rozwiązanie z
exec
:Alternatywne 49-bajtowe rozwiązanie rekurencyjne:
Dziękuję Flp.Tkc za uratowanie bajtu, przypominając mi, że kwadraty nie wymagają potęgowania :)
źródło
f=lambda n:1111if n<2else int(`f(n-1)**2`[:4])
V , 19 bajtów
Wypróbuj online!
Korzysta z indeksowania opartego na 0.
Oczywiście, ponieważ liczby nie są dokładnie V za forte , to nie jest bardzo Golfy. Jednak pokazuje jedną fajną przewagę V nad vimem. Możesz uruchomić makro 0 razy, co nie jest możliwe w vimie, ponieważ „0” jest poleceniem, a nie liczbą.
Zawiera wiele niedrukowalnych znaków, więc oto zrzut heksowy:
A oto czytelna wersja:
Wyjaśnienie:
źródło
Galaretka ,
129 bajtów-3 bajty dzięki Dennisowi stosującemu indeksowanie 1 i
ṁ
atomowi formy / zmiany kształtu. Zapraszamy do gry w golfa! Wypróbuj online!Ungolfing
źródło
1
zamiast⁽¡n
.Perl, 37 bajtów
36 bajtów kodu +
-p
flaga.Aby uruchomić:
źródło
PowerShell,
7355 bajtówOgromne podziękowania dla TimmyD za zmniejszenie liczby 18 bajtów!
Kod:
for($A=1111;$args[0]---1;$A=-join"$(+$A*$A)"[0..3]){}$A
$A=1111;1..($n=2)|%{[string]$B=[math]::pow($A,2);$A=$B.substring(0,4)};$A
$n
jest N w X N-1Objaśnienie i rozbity kod:
Niektóre uwagi:
1..($n=4)|%
ustawi $ n na 4, a następnie uruchomi pętlę, która uruchamia $ n razy.1
można zmienić na dowolną liczbę całkowitą, która zapętli $ n- [twoja liczba całkowita] +1 razy.[math]::
w PowerShell jest podwójny. W powyższym kodzie musimy jawnie rzutować$B
na ciąg, abyśmy mogli go wywołać.substring()
, ponieważ.substring()
w Powershell nie ma funkcji podwójnej.źródło
Python 2,
4441 bajtów-3 bajty dzięki xnor (użyj podziału na liczby całkowite, aby uniknąć
and
)repl.it
Funkcja rekurencyjna oparta na 1.
Kiedy
n>1
dzielenie przez liczby całkowite1/n
powoduje0
, to0*1111=0
jest falsey, więcor
oceniane jest prawo od , która przyjmuje pierwsze cztery znaki reprezentacji kwadratun-1
wyniku; jest to następnie przesyłane doint
.Kiedy
n=1
podział na liczby całkowite1/n
, skutkuje1
, to1*1111=1111
jest prawdą, aint
1111
rzut na anint
jest1111
.źródło
int
zewnątrz. Jeśli masz indeks 1, możesz wykonać krótszą skrzynkę podstawowąg=lambda n:int(1/n*1111or`g(n-1)**2`[:4])
.
s!Groovy, 49 bajtów
źródło
Pyke, 10 bajtów
Wypróbuj tutaj!
źródło
MATL ,
14, 13 bajtówWypróbuj online!
Wyjaśnienie:
źródło
U
(kwadratowy, do wprowadzania numerycznego) na przykładt*
R,
58565553 bajtówBierze
N
od standardowego. 3334 to praktycznie X_0, co jest potrzebne, ponieważ pętla for musi zostać wykonana co najmniej raz (dłuższe byłoby pominięcie).R to naprawdę okropny język do przyjmowania pierwszych czterech cyfr liczby, ale ponieważ liczba przypadków jest ograniczona, musimy się tylko martwić o kwadraty,
x<3163
ax>3162
te pierwsze dają liczbę 6-cyfrową, a druga 7-cyfrową .Reszta jest dość prosta,
%/%
dzieli i ignoruje resztę.x
jest drukowane na standardowe wyjście.Zaoszczędź 2 bajty dzięki @ETHproductions
źródło
3334
(a może3333
)?3333^2 = 11108889
więc dałoby się1110
, i .... gdy sprawdzam to, widzę,3334
że zadziałałoby: | . Nie jestem pewien, dlaczego już tego nie sprawdziłem.Javagony - 153 bajty
Javagony jest ograniczoną wersją języka Java, która nie zezwala na żaden przepływ sterowania oprócz rekurencji i
try-catch
, nie dla pętli, while i pętli if. Kodowanie w nim jest zabawnym ćwiczeniem, ale frustrującym. Nie to, że zwykła Java sama w sobie nie jest tak frustrująca.źródło
PHP,
5552 bajtówZapisano 3 bajty dzięki @ user59178
Uruchom z wiersza poleceń, indeksowany od zera.
Dzięki, że nie dbam o to, jakiego typu są moje zmienne, PHP! Tutaj po prostu poprawiamy liczbę i usuwamy wszystko poza pierwszymi 4 cyframi, od niechcenia na przemian między liczbą i łańcuchem bez opieki na świecie.
źródło
$argv[1]--
jako licznika pętli.Brachylog , 18 bajtów
Wypróbuj online!
Ta odpowiedź ma indeks 0.
Wyjaśnienie
źródło
C, 56 bajtów
Jeden indeksowany.
źródło
Clojure, 76 bajtów
Pierwszy golf Clojure (wydaje się fajnym językiem). Jest to indeks 1.
Wyjaśni kod później.
źródło
C #,
6460 bajtówZapisane 4 bajty wykonując Olivier Grégoire „s komentarz na odpowiedź Java!
Poprzednia wersja ( 64 bajty ):
Pełny program z nieprzylepioną metodą i przypadkami testowymi:
źródło
n-->1
Ruby, 47 bajtów
Pierwszy golf! Zapisuje bajty z
-n
opcją (ale nadal liczy się jako 1! :)).0-indeksowane. Aby uruchomić:
źródło
Pyth,
1312 bajtówDzięki @Jakube za -1 bajt
Program, który pobiera liczbę całkowitą zindeksowaną 1 i wypisuje wynik.
Zestaw testowy
Wykorzystuje to podobne podejście do odpowiedzi @ Adnan .
Jak to działa
źródło
*GG
zamiast^G2<space>
CJam , 15 bajtów
Korzysta z indeksowania opartego na 0.
Wypróbuj online!
źródło
Partia, 82 bajty
Podobnie jak Perl, liczby całkowite są łańcuchami, ale w przeciwieństwie do Perla, mogę jedynie pobierać podłańcuch zmiennej, a pobieranie podciągów w pętli jest nieco niewygodne.
źródło
Perl 6 , 36 bajtów
Wyjaśnienie:
Test:
źródło
Matlab,
79, 78 bajtówPrzypadki testowe:
Nie jest to niesamowite rozwiązanie. Jestem pewien, że musi istnieć lepszy sposób na obcięcie do 4 cyfr, ale dzisiaj nie wiem.
Edycja: Ogolono bajt, ustawiając 0,5 -> .5
źródło
Java 8,
779374716978 bajtówKażde powtórzenie składa się
n
z pierwszych 4 znakówn*n
.Wypróbuj Javę online !
Historia postów:
77 bajtów: kod początkowy (niekompletny)
+16 bajtów, autor: Olivier Grégoire: uzupełniał kod, czyniąc go funkcją Lambda.
-19 bajtów zamienić
while
zfor
cyklu.-4 bajty: używane
long
s zamiastint
s-2 bajty, autor: Roman Gräf: usunięto niepotrzebne nawiasy
+9 bajtów, brak
return
instrukcjiDzięki @ OlivierGrégoire i @ RomanGräf za wskazanie niektórych problemów!
Czekaj, Java bije ... (drumroll) Clojure i Matlab tutaj! Wielkie brawa dla Javy, proszę!
źródło
x
nie jest zadeklarowany. Powinna to być funkcja lub pełny program. Nie fragment kodu.x->{int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4));}return n;}
(dla całkowitej liczby bajtów 91). Wynika to z faktu, że fragmenty nie są dozwolone: tylko funkcje lub pełne programy.x->{Long n=1111;for(;--x>0;)n=n.valueOf((n*n+"").substring(0,4));return n;}
z kilkoma zastosowanymi technikami (kiedyśLong
była w stanie używaćLong.valueOf
mniej bajtów, nie jest to zalecane w normalnym programowaniu, ale całkowicie w golfie; usunięte,m
ponieważ nie jest konieczne, jeśli zmniejszymyx
zamiast tego usunięto niepotrzebne aparaty ortodontyczne)Perl, 36 bajtów
Inne podejście niż inne rozwiązanie Perla, co prowadzi do nieco krótszego kodu. Nie są potrzebne argumenty wiersza poleceń (inne niż zwykły argument wyboru wersji
-M5.010
, który nie jest liczony do liczby bajtów), co oznacza, że jest to ta sama ilość kodu, ale z mniejszą liczbą kar, co daje lepszy ogólny wynik.Tworzymy pętlę typu niedociążenia poprzez powtarzanie i
eval
-ing łańcucha; Eksperymentowałem z rozpoczynaniem struny na środku, ale rozpoczęcie od początku okazuje się najkrótsze. Mnożymy$&
(wynik ostatniego dopasowania wyrażenia regularnego), aby go wyrównać; jeśli wynik jest zerowy, używamy1x4
(tzn.1111
Perl ma operator do powtarzania rzeczy, w tym cyfr liczby) zamiast wyniku. Następnie regexujemy pierwsze cztery znaki. Całość działa w kontekście listy, ponieważ znajduje się w środkusay
, dlatego końcowym wynikiemeval
będzie zawartość nawiasów końcowego dopasowania.źródło
Java,
79676664 bajtówDzięki @Oliver Grégoire.
Dzięki @ETHProduction.
Zastąpiłem podciągi i inne rzeczy pomysłem z @Xanderhall
Chociaż istnieją krótsze rozwiązania, chciałem opublikować jeden rekursywny :). I jestem najkrótszą „prawdziwą” funkcją :). Edycja: Wygląda na to, że jestem teraz najkrótszy :)))
źródło
for(i*=i;i>1e4;)i/=10;
? To oszczędziłoby bajt.long
s? Możesz zabić dwa bajty za pomocąint
s.Pushy ,
2620 bajtówDać argumenty w wierszu poleceń:
$ pushy sqseq.pshy 79
.Ładnie sformatowany, z wyjaśnieniem:
źródło