Setiap istilah dalam urutan kuadrat, x n , dibuat dengan mengambil x n-1 , mengkuadratkannya, dan menghapus semua kecuali empat digit pertama.
Urutan selalu dimulai dengan x 1 = 1111 . Mengkuadratkan ini menghasilkan 1234321, jadi x 2 = 1234
Beberapa istilah pertama adalah:
1111
1234
1522
2316
5363
...
Tantangan
Tugas Anda adalah, dengan bilangan bulat n -negatif , hitung x n . Anda dapat mengirimkan program lengkap yang menjalankan I / O, atau fungsi yang menggunakan n sebagai parameter.
Solusi Anda bisa nol atau satu diindeks, selama Anda menentukan yang mana.
Karena semua istilah dalam urutan ini lebih pendek dari 5 digit, kode Anda juga harus sesingkat mungkin. Lubang kode standar golf berlaku.
Semoga pegolf terbaik menang!
Uji Kasus
Catatan: Ini adalah 1-diindeks.
1 -> 1111
8 -> 6840
15 -> 7584
20 -> 1425
80 -> 4717
Jawaban:
05AB1E ,
87 byteKode:
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
JavaScript (ES7),
444336 byteIni adalah contoh yang bagus dari penyalahgunaan tipe paksaan:
**
mengonversi kedua argumennya menjadi angka, dan+
mengonversi kedua argumennya menjadi string kecuali keduanya adalah angka. Ini berarti bahwaf(n)**2+f
pertama mengkonversif(n)
ke nomor dan kuadratkan, kemudian menyatukan hasilnya dengan representasi stringf
. Kita kemudian dapat menggunakan.slice
untuk mengambil 4 karakter pertama dari string.Berikut adalah beberapa pendekatan alternatif yang tidak menggunakan string:
Cuplikan tes
Tampilkan cuplikan kode
Catatan: ini digunakan
Math.pow
karena**
tidak didukung di semua browser.sumber
Haskell, 40 byte
Ini adalah urutan berbasis 0. Contoh penggunaan:
((iterate(read.take 4.show.(^2))1111)!!) 79
->4717
.Bagaimana itu bekerja:
sumber
Mathematica, 48 byte
Fungsi tanpa nama mengambil argumen integer; Diindeks 0. Menggunakan empat karakter tiga byte
⌊⌊⌋⌋
: Mathematica menggunakan salah satuFloor[x]
atau⌊x⌋
untuk membulatkan bilangan real ke integer, dan yang terakhir umumnya satu byte lebih sedikit. Nama perintah di Mathematica untuk mengonversi bilangan bulat menjadi string terlalu panjang, jadi alih-alih kami melakukan perhitungan matematis untuk menemukan empat digit pertama x ^ 2: kami mengambil basis-10 logaritma x ^ 2, kurangi bagian bilangan bulatnya, naikkan 10 kembali ke kekuatan itu, dan kalikan dengan 1000 dan bulatkan.tl; dr: logaritma ftw
sumber
Python 2,
514644 BytesSalah lagi! Fungsi rekursif kembali. Ini satu-diindeks.Saya ingin menyingkirkan kikukTernyata untuk saatif
jika memungkinkan, tapi saya pikirexec
bisa lebih pendek ..exec
ini lebih pendek.Solusi 46 byte alternatif dengan
exec
:Solusi rekursif 49 byte alternatif:
Terima kasih kepada Flp.Tkc untuk menyimpan byte dengan mengingatkan saya bahwa mengkuadratkan tidak perlu eksponensial :)
sumber
f=lambda n:1111if n<2else int(`f(n-1)**2`[:4])
V , 19 byte
Cobalah online!
Ini menggunakan pengindeksan berbasis 0.
Tentu saja, karena angka bukan keahlian V , ini bukan golf. Namun, itu memang menunjukkan satu keunggulan bagus yang V miliki lebih dari vim. Anda dapat menjalankan makro 0 kali, yang tidak dimungkinkan dalam vim karena '0' adalah perintah bukan hitungan.
Ini mengandung banyak karakter yang tidak patut dicetak, jadi ini adalah hexdump:
Dan ini adalah versi yang dapat dibaca:
Penjelasan:
sumber
Jelly ,
129 byte-3 byte berkat Dennis menggunakan pengindeksan berbasis 1 dan
ṁ
atom cetakan / pembentukan kembali. Selamat datang saran bermain golf! Cobalah online!Tidak melakukanolf
sumber
1
bukan⁽¡n
.Perl, 37 byte
36 byte kode +
-p
bendera.Untuk menjalankannya:
sumber
Powershell,
7355 byteTerima kasih banyak kepada TimmyD karena telah memangkas 18 byte!
Kode:
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
adalah n dalam x n-1Penjelasan dan kode yang meledak:
Beberapa catatan:
1..($n=4)|%
akan menetapkan $ n ke 4 dan kemudian memulai loop yang berjalan $ n kali.1
dapat diubah ke integer apa saja dan itu akan mengulang $ n- [integer Anda] +1 kali.[math]::
di Powershell adalah ganda. Dalam kode di atas, kita harus secara eksplisit melemparkan$B
ke string sehingga kita dapat memanggilnya.substring()
karena tidak ada.substring()
fungsi untuk ganda di Powershell.sumber
Python 2,
4441 byte-3 byte terima kasih kepada xnor (gunakan divisi integer untuk menghindari
and
)repl.it
Fungsi rekursif 1 berbasis.
Ketika
n>1
pembagian bilangan bulat1/n
,, menghasilkan0
, maka0*1111=0
yang falsey, sehingga hakor
dievaluasi, yang mengambil empat karakter pertama dari representasi kuadrat darin-1
hasil th; ini kemudian dilemparkan ke sebuahint
.Ketika
n=1
pembagian bilangan bulat1/n
,, menghasilkan1
, maka1*1111=1111
, yang benar, danint
1111
dilemparkan ke sebuahint
adalah1111
.sumber
int
luar. Jika Anda 1-indeks, Anda dapat melakukan lebih pendek dengan kasus dasarg=lambda n:int(1/n*1111or`g(n-1)**2`[:4])
.
s!Groovy, 49 byte
sumber
Pyke, 10 byte
Coba di sini!
sumber
MATL ,
14, 13 byteCobalah online!
Penjelasan:
sumber
U
insted (persegi, untuk input numerik)t*
R,
58565553 byteDibutuhkan
N
dari stdin. 3334 bisa dibilang X_0, yang diperlukan karena for-loop perlu dijalankan setidaknya sekali (akan lebih lama untuk melewati).R benar-benar bahasa yang mengerikan untuk mengambil empat digit angka pertama, tetapi karena jumlah kasus terbatas, kita hanya perlu khawatir tentang kuadrat dari angka.
x<3163
danx>3162
, yang pertama menghasilkan angka 6 digit, yang terakhir angka 7 digit .Sisanya cukup mudah,
%/%
membagi dan mengabaikan sisanya.x
dicetak ke stdout.Disimpan 2 byte berkat produk @ETH
sumber
3334
(atau mungkin3333
)?3333^2 = 11108889
jadi akan menghasilkan1110
, dan .... karena saya memeriksa ini saya lihat3334
akan bekerja: | . Tidak yakin mengapa saya tidak memeriksanya lagi.Javagony - 153 byte
Javagony adalah versi terbatas dari Java, yang tidak mengizinkan aliran kontrol apa pun kecuali rekursi dan
try-catch
, tidak untuk loop, saat loop, atau jika. Pengkodean di dalamnya adalah latihan yang cukup menyenangkan, tetapi membuat frustrasi. Bukan berarti Java biasa hampir tidak frustasi dengan sendirinya.sumber
PHP,
5552 byteDisimpan 3 byte berkat @ user59178
Jalankan dari baris perintah, diindeks nol.
Terima kasih karena tidak peduli apa jenis variabel saya, PHP! Di sini kita cukup menguadratkan angka dan memotong semuanya melewati 4 digit pertama, dengan santai berganti-ganti antara angka dan string tanpa peduli di dunia.
sumber
$argv[1]--
sebagai penghitung lingkaran.Brachylog , 18 byte
Cobalah online!
Jawaban ini diindeks 0.
Penjelasan
sumber
C, 56 byte
Diindeks satu.
sumber
Clojure, 76 byte
Golf Clojure pertama (sepertinya bahasa yang bagus). Ini 1-diindeks.
Akan dijelaskan kodenya nanti.
sumber
C #,
6460 byteDisimpan 4 byte dengan mengikuti Olivier Grégoire 's komentar pada jawaban Java!
Versi sebelumnya ( 64 byte ):
Program lengkap dengan metode ungolfed dan uji kasus:
sumber
n-->1
Ruby, 47 byte
Golf pertama! Menghemat byte dengan
-n
opsi (tetapi masih dihitung sebagai 1! :)).Diindeks 0. Untuk menjalankannya:
sumber
Pyth,
1312 byteBerkat @ Jakube untuk -1 byte
Suatu program yang mengambil input dari integer 1-indexed dan mencetak hasilnya.
Suite uji
Ini menggunakan pendekatan yang mirip dengan jawaban @ Adnan .
Bagaimana itu bekerja
sumber
*GG
bukannya^G2<space>
CJam , 15 byte
Menggunakan pengindeksan berbasis 0.
Cobalah online!
sumber
Batch, 82 byte
Seperti Perl, integer adalah string, tetapi tidak seperti Perl, saya hanya bisa mengambil substring dari variabel, dan mengambil substring di dalam sebuah loop agak canggung.
sumber
Perl 6 , 36 byte
Penjelasan:
Uji:
sumber
Matlab,
79, 78 BytesKasus uji:
Bukan solusi yang luar biasa. Saya yakin pasti ada cara yang lebih baik untuk memotong hingga 4 digit tapi saya tidak tahu hari ini.
Sunting: Mencukur satu byte dengan mengatur 0,5 -> 0,5
sumber
Java 8,
779374716978 byteSetiap pengulangan membuat
n
4 karakter pertaman*n
.Coba Java online !
Posting sejarah:
77 byte: kode awal (tidak lengkap)
+16 byte, oleh Olivier Grégoire: kode lengkap dengan menjadikannya fungsi Lambda.
-19 byte: ganti
while
denganfor
cycle.-4 byte: digunakan
long
s bukanint
s-2 byte, oleh Roman Gräf: menghapus tanda kurung yang tidak perlu
+9 byte,
return
pernyataan tidak adaTerima kasih kepada @ OlivierGrégoire dan @ RomanGräf karena telah menunjukkan beberapa masalah!
Tunggu, Java beats ... (drumroll) Clojure dan Matlab di sini! Tepuk tangan meriah untuk Jawa!
sumber
x
tidak dinyatakan. Ini harus berupa fungsi atau program lengkap. Bukan cuplikan kode.x->{int n=1111;int m=1;while(x>m++){n=Integer.parseInt((n*n+"").substring(0,4));}return n;}
(untuk jumlah byte total 91). Ini karena snippet tidak diperbolehkan: hanya fungsi atau program lengkap.x->{Long n=1111;for(;--x>0;)n=n.valueOf((n*n+"").substring(0,4));return n;}
dengan beberapa teknik yang digunakan (duluLong
dapat digunakanLong.valueOf
dengan lebih sedikit byte, itu tidak disarankan dalam pemrograman normal, tetapi sepenuhnya dalam golf; dihapusm
karena tidak perlu jika kita mengurangix
sebagai gantinya, hapus kawat gigi yang tidak dibutuhkan)Perl, 36 byte
Pendekatan yang berbeda dari solusi Perl lainnya, mengarah ke kode yang sedikit lebih pendek. Tidak ada argumen baris perintah yang diperlukan (selain argumen pemilihan versi biasa
-M5.010
,, yang tidak dihitung terhadap jumlah byte), yang berarti bahwa ini adalah jumlah kode yang sama tetapi dengan penalti yang lebih sedikit, memberikan skor keseluruhan yang lebih baik.Kami membuat loop Underload-style melalui pengulangan dan
eval
-ing sebuah string; Saya bereksperimen dengan memulai string di tengah, tetapi memulainya di awal ternyata menjadi yang terpendek. Kami mengalikannya$&
(hasil dari pertandingan regex terakhir) dengan sendirinya untuk membuatnya kuadrat; jika hasilnya nol, kami menggunakan1x4
(yaitu1111
; Perl memiliki operator untuk mengulangi hal-hal, termasuk angka angka) alih-alih hasilnya. Kemudian kita regex empat karakter pertama. Semuanya berjalan dalam konteks daftar karena berada di dalamsay
, dengan demikian hasil akhir darieval
akan menjadi tanda kurung pertandingan final.sumber
Java,
79676664 byteTerima kasih kepada @Oliver Grégoire.
Terima kasih kepada @ETHProduction.
Substring diganti dan hal-hal dengan ide dari @Xanderhall
Meskipun ada solusi yang lebih pendek saya ingin memposting satu rekursif :). Dan saya adalah fungsi "nyata" terpendek :). Sunting: Sepertinya saya yang terpendek sekarang :)))
sumber
for(i*=i;i>1e4;)i/=10;
? Itu akan menghemat satu byte.long
s? Anda dapat membunuh dua byte dengan menggunakanint
s.Pushy ,
2620 byteBerikan argumen pada commandline:
$ pushy sqseq.pshy 79
.Diformat dengan baik, dengan penjelasan:
sumber