Tantangan
Terapkan tetrasi (alias Power Tower atau Hyperexponentiation) dengan jumlah karakter paling sedikit.
Ketentuannya
- Jangan menggunakan 'kekuatan' operator atau setara (seperti
pow(x,y)
,x^y
,x**y
, dll) - Input diberikan sebagai:
x y
(dipisahkan oleh spasi) x
adalah eksponensial dengany
waktu itu sendiri .- Metode Anda harus dapat menghitung setidaknya
4 3
(4 kali dengan sendirinya 3 kali)
Skor
- Kemenangan skor terendah: (# karakter)
- Pengurangan bonus jika Anda tidak menggunakan operator perkalian (-5 poin).
- Tidak ada persyaratan Kecepatan / Memori. Ambil selama yang Anda inginkan.
Contohnya
x, 0 -> 1
2, 2 -> 2^2 = 4
2, 4 -> 2^(2^(2^2)) = 65536
4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Terbuka untuk saran / perubahan / pertanyaan
*
adalah perkalian dalam beberapa konteks, tetapi juga operator perulangan sederhana:{block}N*
setara dengan gaya-Cfor(i=0;i<N;i++){block}
. Kasing tepi yang rumit adalah perkalian string / array ('a'3*
memberi'aaa'
), tetapi itu tidak mungkin menjadi masalah mengingat bahwa array4***3
elemen akan meluap RAM.x 0
=> 1. Solusi asli saya tidak menangani case itu.Jawaban:
J, skor 7 (12 karakter - 5 poin untuk menghindari perkalian)
+/@$/@$~/@$~
pemakaian:
Hanya beberapa lipatan bersarang:
*/@$~/@$~
^/@$~
tempat$~
menciptakan array,/
adalah fungsi lipat.sumber
pad
sini? Maaf, bahasa Inggris bukan bahasa ibu saya.@$~
dalam hubungannya?/
, tapi ya. Anda hanya melipat sebanyak yang dibutuhkan daripada fungsi lipat bersarang.Haskell,
8785 - 5 == 8082Tidak menggunakan eksponensial, perkalian, atau penambahan (!), Cukup daftarkan operasi. Demonstrasi:
...
ahm ... Anda tidak mengatakan apa-apa tentang kinerja atau memori, bukan? Tetapi mengingat cukup milyaran tahun dan beberapa petabyte RAM, ini masih akan menghasilkan hasil yang benar (genericLength dapat menggunakan bigInt untuk menghitung panjang daftar).
sumber
GolfScript,
1518 karakterYa, salah satunya
*
adalah operator perkalian (latihan: yang mana?) Jadi saya tidak memenuhi syarat untuk bonus 5 char. Meski begitu, ini hanya lebih pendek dari solusi Peter .Versi 15-char sebelumnya ini adalah sama, tetapi tidak menghasilkan output ketika argumen kedua adalah 0. Terima kasih kepada res karena telah menemukan bug.
sumber
"2 3" ~])*{[]+*{*}*}*
.;
untuk menghapus string input aktual yang diletakkan penerjemah pada tumpukan saat start-up. Atau hanya menambahkan[
kode: keduanya;"2 3" ~])*{[]+*{*}*}*
dan"2 3" [~])*{[]+*{*}*}*
berfungsi dengan baik untuk saya.ruby golfscript.rb my_script.gs
pada baris perintah, tanpa mengetahui bahwa itu menyebabkan sesuatu ("", tampaknya) berada di tumpukan sebelum skrip dijalankan - yang kadang-kadang berfungsi, kadang tidak. (Juga, denganecho 2 3 | ruby golfscript.rb my_script.gs
, program Anda berfungsi sebagaimana mestinya.)J,
161912 karakteratau sebagai kata kerja (17 karakter):
pemakaian:
atau mengambil input dari keyboard (
242720 karakter):dengan terima kasih kepada FUZxxl untuk menunjukkan kebodohan saya. :-)
Penjelasan:
J dibaca dari kanan ke kiri, jadi gunakan
2 4
:/
digunakan untuk menyisipkan kata kerja$~
antara setiap pasangan item dalam daftar.$~
mengambil item kiri dan membentuknya$
menggunakan item kanan (~
membalikkan argumen) - jadi ini akan setara dengan4 $ 2
yang memberi Anda daftar2
s yang panjangnya empat item2 2 2 2
.Sekarang kita menambahkan 1 ke daftar
1,~
dan kemudian melakukan hal yang sama lagi;/
masukkan kata kerja di*/@$~
antara setiap pasangan item dalam daftar. Kata kerja ini dimulai dengan cara yang sama$~
tetapi kali ini/
menyisipkan*
antara setiap item dari daftar yang baru dibuat. The@
hanya memastikan bahwa*/@$~
karya-karya sebagai salah satu kata kerja bukan dua. Ini memberi2
dikalikan dengan sendirinya cukup waktu untuk menjadi setara dengan2^4
.Halaman kosa kata J - Saya menemukan pemecahan masalah dengan J fun hanya karena perbedaan cara terkadang melakukan sesuatu.
Menambahkan satu iterasi lebih lanjut untuk menghapus
*
operator memiliki 2 masalahItu muncul di 17 karakter (+/@$~/,@$~/1,~$~/
) yang, bahkan dengan bonus -5, terlalu lama4 3
sumber
^/]$[
yang membuat daftar2 2 2 2
dan menempelkan operator eksponensial di antara mereka. Apa yang dilakukan adalah melangkah lebih jauh dan melakukan eksponensial dengan perkalian berulang.GolfScript (24 karakter - 5 = 19 poin)
sangat lambat.
(atau 20 karakter)
jauh lebih cepat.
sumber
Python, 70
Ini menggunakan
eval
panggilan bersarang , akhirnya menghasilkan string"a*a*a*a...*a"
yang dievaluasi. Hampir setengah dari skor terbuang untuk mendapatkan argumen ... meskipun saya perhatikan bahwa beberapa solusi lain tidak peduli dengan itu.sumber
input()
atau menggunakaneval(raw_input())
Cheersexec"eval('a*'*"*b+'1'+"+'1')"*b
Scala: 110
ungolfed:
penjelasan:
ditambah, mul, tinggi (: = pow), tetrasi semua bekerja dengan cara yang sama. Pola umum dapat diekstraksi sebagai metode rekursif, yang membutuhkan dua BigInts dan fungsi dasar:
Garis bawah adalah placeholder untuk sesuatu yang dipanggil dalam urutan ini, misalnya penambahan plus (a, b) = (a + b); Oleh karena itu ( + ) adalah fungsi yang mengambil dua argumen dan menambahkannya (a + b).
sayangnya, saya mendapatkan masalah dengan ukuran tumpukan. Ini berfungsi untuk nilai kecil untuk 4 (misalnya: 2) atau jika saya mengurangi kedalaman untuk satu langkah:
Kode asli adalah 112 karakter dan akan mencetak skor, jika valid, 107. Mungkin saya mencari tahu cara meningkatkan tumpukan.
Algoritma yang diperluas dapat ditransformasikan menjadi panggilan berulang:
Panggilan tailrecursive lebih panjang dari metode asli, tetapi tidak meningkatkan aliran stackover dalam versi lama - namun tidak menghasilkan hasil dalam waktu yang wajar. t (2,4) baik-baik saja, tetapi t (3,3) sudah dihentikan oleh saya setelah 5 menit. Namun, ini sangat elegan, bukan?
Dan sekarang sama seperti di atas: gunakan perkalian bau (kita bahkan untung sambil menolak bonus 5, karena kita menyimpan 7 karakter: win = 4 karakter :)
doa:
runtime: 1ms.
sumber
Br ** nfuck, 128-5 = 123 byte
Input berupa karakter dengan titik kode angka yang diinginkan sebagai input. Outputnya sama.
Penjelasan akan
datang ketika saya memiliki waktu dibawah ini. Apakah saya mendapatkan poin bonus karena tidak menggunakan eksponensial, multiplikasi, ATAU bahkan penambahan?Ini bekerja (diuji) untuk
x 0
,0 x
,x 1
,1 x
,x 2
,2 3
, dan2 4
. Saya mencoba3 3
, tetapi itu berjalan selama beberapa jam tanpa menyelesaikan (dalam implementasi Java saya - mungkin tidak optimal) (EDIT: di @ Timwi's EsotericIDE [Ini hebat! Kalian harus mencobanya] juga. Tidak beruntung.). Secara teori, ini bekerja hingga ukuran sel dari implementasi spesifik.sumber
Python, 161 - 5 (no * operator) = 156
memohon:
sumber
4***3
?!m
fungsi Anda denganm=lambda x,y:sum(x for _ in r(y))
Perl, 61 karakter
ini yang aneh
pemakaian:
sumber
Mathematica ,
4033Ini tidak cukup sesuai dengan aturan tetapi tidak dalam pertentangan untuk kode terpendek, dan saya harap itu akan menarik bagi seseorang.
Ini membangun fungsi "tetrasi" ketika dijalankan, tetapi argumen harus diberikan dalam urutan terbalik. Contoh:
sumber
Fold[g, 1, #2~Table~{#}] &[3, 4]
akan menghasilkang[g[g[1, 4], 4], 4]
misalnya.m[Times]
menghasilkanFold[Times, 1, Table[#2, {#1}]] &
, yang merupakan fungsi daya:m[Times][5, x]
--->x^5
; metode yang sama digunakan untuk fungsi daya baru ini untuk menghasilkan fungsi tetrasi. Logikanya bisa dimulai denganPlus
tetapi itu gagal segera.t[h_, n_] := Sum[h, {i, n}]
. Kemudian jalankanm[m@t][3, 4]
.Sum[h, n]
.)Haskell:
5851 karakter, dengan atau tanpa perkalian.Tidak Terkumpul:
Definisi yang lebih pendek berasal dari inlining "bump", dan mendefinisikan versi kustom "iterate". Sayangnya hasilnya sangat tidak efisien, tetapi mulai dengan (*) bukannya (+) memberikan kecepatan yang layak. Di
ghci
:sumber
Ruby
6659 karaktersumber
1
) ketika nomor input kedua adalah0
; alih-alih,e(x,0)
mengembalikan nilaix
.Python, 112 karakter
Angka-angka harus menjadi argumen 1 dan 2:
python this.py 4 3
**
operator tidak digunakan.*
bekas. Ini cukup sepele untuk diterapkan, persis seperti**
, tetapi biaya lebih dari 5 karakter.sumber
*
implementasinya, saya percaya kedalaman rekursi akan terlalu besar untuk4 3
.C,
11710599 karakterEDIT: Menggabungkan dua fungsi
p
danr
menjadi satu, menghemat beberapa karakter.Dari 99 karakter, 52 melakukan perhitungan aktual (termasuk definisi variabel). 47 lainnya untuk menangani input dan output.
BUG: Buruk menangani kekuatan 0 (misalnyaIni bukan bug, saya lupa itu0 2
). Harus menemukan perbaikan biaya minimum.0 2
tidak terdefinisi.Berhasil menangani
4 3
, dan bahkan memberikan hasil yang tepat. Namun, bisa jadi tidak akurat untuk beberapa nomor yang lebih kecil.Mencetak nomor dengan trailing
.000000
.sumber
Faktor, 187 karakter
Sebelum golf:
Saya tidak menghapus operator perkalian
*
. Jika saya melakukannya, maka saya perlu menambahkan beberapa logika yang menyatakan bahwa jumlah urutan kosong adalah 0, bukan 1. Logika ekstra ini akan menelan biaya lebih dari -5 bonus.Pemutus aturan, 124 + 10 = 134 karakter
Program ini memiliki skor lebih rendah, tetapi operator eksponensial
^
melanggar aturan. Aturan mengatakan "(# karakter) + (10 * (# operator 'kekuatan'))", jadi saya menerapkan penalti +10. Namun, aturan itu juga mengatakan "Jangan gunakan operator 'kekuatan', jadi setiap program yang mengambil penalti ini melanggar aturan. Oleh karena itu, program dengan 134 karakter ini bukan jawaban yang benar, dan saya harus menyajikan program saya yang lebih panjang dari 187 karakter sebagai jawaban.sumber
Haskell 110 - 5 = 105
Gaya Tetano Peano. Ini adalah solusi paling lambat yang mungkin, hanya sebuah peringatan, tetapi juga menghindari penambahan.
Ini bergantung pada Anda memiliki kesabaran untuk mengetikkan angka Peano (dan tidak akan menunjukkan jawabannya, Jika Anda benar-benar ingin menjalankannya, tambahkan beberapa baris ini (90 karakter):
sumber
Ruby,
47 4645t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}
sumber
Lua: 133 karakter, tanpa perkalian
Saya awalnya akan menggunakan peretasan pengulangan string untuk melakukan perkalian palsu, tetapi suka gagal pada nilai-nilai besar. Saya mungkin bisa menggunakan kompilasi dinamis dan loadstring untuk membuatnya lebih kecil, tetapi sudah terlambat di sini ... Saya perlu tidur.
Memasukkan "4 3" ke dalam output stdin:
sumber
VBA, 90 Karakter
* Mungkin bonus no multiplication tidak cukup baik. Saya pikir jawaban tidak ada multiplikasi jauh lebih menarik, tapi ini kode golf, jadi itu bukan yang terbaik. Inilah jawaban tanpa
*
, dan jawaban yang lebih baik (lebih pendek, dan skor lebih baik):90 karakter, tanpa operator daya, menggunakan perkalian = 90
116 karakter, tidak ada operator daya, tidak ada bonus multiplikasi (-5) = 111
CATATAN: VBA memiliki masalah mencetak nomor ketika hasilnya sangat besar (yaitu
4, 3
), tetapi menghitung dengan benar, jadi jika, misalnya, Anda ingin MENGGUNAKAN nomor itu, Anda akan baik untuk pergi. Juga, bahkan angka yang LEBIH BESAR melimpah (yaitu3, 4
).sumber
Perl 6 , 32 byte
Cobalah online!
(1, { [*] a xx $_ } ... *)
adalah urutan malas yang menghasilkan menara listrik, setiap elemen menjadi daftar yang terdiri dari parameter input pertamaa
direplikasi (xx
) beberapa kali sama dengan elemen sebelumnya ($_
), daftar itu kemudian dikurangi dengan perkalian ([*]
). Dari urutan itu kita cukup mencabutb
elemen -th.sumber
Kalkulus Lambda, 10-5
(Menggunakan encoding Gereja dan indeces De Bruijn )
λλ(1λ13)λ1
Penjelasan
Tanpa De Bruijn indeces
λa,b.(b λc.ca)λc.c
::Jika Anda mendefinisikan
exp_a(x)=a^x
program ini menentukan dia↑↑b=exp_a^b(1)
mana^b
menunjukkan itterasi fungsi.Saya tidak yakin apakah ini diizinkan karena
ca
secara teknis setara dengana^c
seberapa pernah itu bukan built-in dan hanya efek samping dari cara bilangan bulat dikodekan dalam kalkulus lambda.sumber
Javascript: 116 karakter
t ('4 3') Keluaran:
sumber
Python
(111)(113) no *6 *** 3 - 36k digit))
Pembaruan: Harus menambahkan nilai awal, agar sesuai dengan t (X, 0) = 1
sumber
Haskell: 88-5 karakter tanpa multiplikasi, 59 karakter dengan multiplikasi
Tanpa multiplikasi:
Mungkin ada beberapa cara yang bisa saya lakukan untuk bermain golf.
Dengan multiplikasi:
Dan akhirnya, program tanpa kulit:
Ini mungkin cara paling sederhana untuk melakukan masalah ini, yang mendefinisikan perkalian sebagai penambahan berulang, eksponensial sebagai perkalian berulang, dan tetrasi sebagai eksponensial berulang.
sumber
Racket 58 (no *)
sumber
Common Lisp, 85 karakter
Saya mencoba melakukan perkalian melalui penambahan berulang, tapi itu jauh lebih dari 5 karakter. Hal yang sama dengan macrolets, deklarasi tidak sebanding dengan keuntungannya.
Solusi lain, terinspirasi oleh solusi python boothby. Ini 1 karakter kurang dari solusi di atas.
sumber
Python 3 - 68
(termasuk penalti 10 poin untuk operator listrik)
sumber
Yabasic , 71 byte
Fungsi yang mengambil input
a
danb
sebagai string yang dibatasi ruang.Cobalah online!
sumber
R , 71 - 5 = 66 byte
Cobalah online!
-5 untuk menghindari *, yang lebih sulit dari yang saya harapkan. Ini meledak sangat cepat dan tidak akan berfungsi (kecuali jika memiliki lebih banyak memori) tetapi memenuhi semua kriteria yang diperlukan.
sumber