Pemenangnya (cukup jelas) adalah Dennis ♦, yang menggunakan Jelly dengan 10 byte!
Tantangan ini masih akan ada di sini, namun hasilnya tidak akan diambil lagi.
Kekuatan sebuah angka adalah konsep oleh John Conway (yang juga terkenal karena membuat Permainan Kehidupan Conway, tetapi bukan itu intinya). Ini didefinisikan sebagai:
Untuk angka apa pun ..., powertrain nomornya adalah ... (yaitu setiap digit ke-2, dari kiri ke kanan, adalah kekuatan digit sebelum itu). Proses ini diulang sampai hasilnya satu digit.
CONTOH:
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Tantangan Anda adalah, untuk angka apa pun n
dalam input, kembalikan powertrain(n)
(yaitu n
setelah dekomposisi powertrain selesai) sebagai output.
Ini adalah kode golf, sehingga jumlah terpendek byte menang.
HAL-HAL DISCLAIMER:
- Anda dapat memiliki jumlah digit ganjil dalam input, digit terakhir tidak akan memiliki kekuatan.
- 0 ^ 0 adalah 1, karena jika itu 0, maka banyak angka akan langsung runtuh ke 0 atau 1.
- Jika angka tersebut tidak dapat dihancurkan di bagian mana pun dari proses perhitungan (mis. Jika berakhir dengan
2592
), maka Anda dapat menampilkan nomor tersebut. - Jika inputnya
< 10
(yaitu semua angka dan negatif satu digit), output input.
Saya mungkin akan mengumumkan pemenang setelah beberapa jam hari.
Papan peringkat saat ini:
- Jelly ( Dennis ♦ ): 10
- Pyth ( DenkerAffe ): 16
- MATL ( Don Muesli ): 21
- Perl ( Ton Hospel ): 42
- Haskell ( Damien ): 64
- Javascript ES6 ( edc65 ): 71
- Mathematica ( murphy ): 74
- Mathematica ( LegionMammal978 ) dan Haskell ( Renzeee ): 77
- Python 2 ( mathmandan ): 111
- Python 3 ( Erwan ): 161
- Java 8 ( Biru ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
dan-42
Sangat mudah untuk melewatkan aturan tentang kasus tepi jika tidak muncul dalam kasus uji.Jawaban:
Jelly,
15141210 byteCobalah online!
Bagaimana itu bekerja
sumber
n
kali, tapi saya tidak punya bukti bahwa itu bekerja untuk semua input yang mungkin.D*2/Pµ¡
Haskell,
6764 byte(>> = (==)) >> = hingga $ p.show adalah fungsi tanpa nama yang mengambil integer sebagai input dan mengembalikan powertrainnya.
Disimpan 3 byte berkat Zgarb
sumber
((==)=<<g)
menghemat dua byte lebih(\n->g n==n)
.(>>=(==))>>=
benar-benar terlihat seperti kereta api!Perl, 42
48byteSertakan +2 untuk
-lp
(Anda juga bisa menghapus-l
tapi saya suka baris baru)Jalankan dengan input pada STDIN, mis
powertrain.pl
:(pada perl yang lebih lama Anda juga dapat menjatuhkan spasi antara regex dan sampai)
Ini tidak akan dapat menangani titik tetap
24547284284866560000000000
tetapi nilai sebesar itu tidak akan bekerja karena pada saat itu perl beralih ke notasi eksponensial.Versi di atas sebenarnya akan bekerja cepat (paling banyak
2592
loop) untuk semua angka yang perl dapat wakili tanpa menggunakan notasi eksponensial karena terbukti tidak ada titik tetap antara2592
dan24547284284866560000000000
( https://oeis.org/A135385 )Namun ini mengasumsikan sesuatu yang belum terbukti. Pada prinsipnya mungkin ada pengurangan yang membutuhkan lebih dari
X=10^7
langkah - langkah (diperkirakan bahwa tidak ada titik tidak-tetap mengambil lebih dari 16 langkah, https://oeis.org/A133503 ) yang nilainya turun di bawahX
(tetapi di atas10^7
) dan kemudian naik lagi. Jika itu masalahnya saya harus kembali ke:Penjelasan
Kode berfungsi dengan menempatkan
**
dan*
(berganti-ganti) di antara digitsehingga
2592
menjadi2**5*9**2
dan12345
menjadi1**2*3**4*5
. Ini adalah ekspresi perl yang valid yang dapat dievaluasi dengan(
0**0
Adalah1
di perl). Kemudian letakkan lingkaran di sekelilingnya dengan penghitung yang membuatnya kedaluwarsa. Karena kecuali untuk titik-titik tertentu, nilainya turun dengan sangat cepat, seri powertrain menyatu sebelum penghitung mendapat kesempatan untuk benar-benar berjalansumber
Pyth,
25181116 byteCoba di sini!
714 byte disimpan dengan bantuan dari @ JakubePenjelasan
sumber
Python 2, 111 byte
Idenya adalah untuk membuat string di mana digit
n
dipisahkan oleh operasi yang bergantian antara*
dan**
, dan kemudianeval
string itu. (Solusi lain menggunakan ide yang sama; lihat misalnya jawaban Ton Hospel's Perl .)Jadi, operasi berganti-ganti antara
'**'[0:]
, yang mana**
, dan'**'[-1:]
mana yang adil*
.Namun, pada akhir
for
-loop, string berakhir dengan operasi (satu atau yang lain), jadi kita harus menghentikan operasi terakhir, atau menambahkan digit lain, agar string masuk akal.Untungnya, menambahkan huruf a
1
pada akhirnya akan bekerja tidak peduli operasi mana yang terakhir. (Jika Anda suka,1
adalah identitas sepihak dari kanan, untuk penggandaan dan eksponensial. Cara lain untuk mengatakan ini adalahpowertrain(n) == powertrain(10*n + 1)
untuk semuan>0
.)Akhirnya, jika hasil
eval
kebetulan sama dengan input (seperti dalam1
siklus panjang), fungsi berakhir. Jika tidak, fungsi memanggil dirinya sendiri pada hasilnya. (Ini akan menggantung selamanya pada siklus panjang apa pun> 1
, tetapi menurut komentar OP, saya diizinkan mengasumsikan tidak ada siklus seperti itu.)(Catatan: penjelasan di atas berfungsi untuk bilangan bulat positif satu digit, karena input satu digit
n
akan selesain**1
yang akan menghasilkan1
siklus-. Namun, kami juga perlu menerima input non-positif, sehingga ada kondisi di memulai hubung-pendek itu jika inputnya kurang dari1
. Kita bisa menghilangkan garis itu, dan menghemat 17 byte, jika inputnya dijamin non-negatif.)sumber
Java 8,
265244229 byteIni adalah jawaban pertama saya, tetapi saya telah membaca situs ini sebentar dan berpikir saya tahu apa yang saya lakukan. Setidaknya itu mengalahkan befunge dan SQL ...
Sayangnya, seperti jawaban lain, jawaban ini tidak berfungsi untuk 24547284284866560000000000 karena java'a bawaan pembatasan bagaimana bilangan bulat besar bisa didapat.
Disimpan 36 byte berkat @JackAmmo
Penjelasan Tidak Dikunci
sumber
if(n<10)return n;else{...}
yang lain tidak perlu karena secara logis semua yang ada di blok lain hanya akan tetap berjalan ketika n <10 salah. Menghapus yang lain dan 2 kawat gigi yang cocok akan menghemat 6 byte. Ada situasi yang mirip dengan yang terakhir Anda jika ... lainif(n==t)return n;else return p(t);
menghapus yang lain dan ruang setelah itu untuk menyimpan 5 byte lainnya. Bahkan Anda dapat mempersingkat lebih jauh jika Anda menggunakan operator triadik alih-alih jika ... lain seperti itureturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
Fungsi rekursif, berhenti ketika pengulangan ditemukan. Ini tidak dapat bekerja untuk loop yang lebih lama (2 pengulangan nilai atau lebih) tetapi tampaknya ini tidak dapat terjadi, setidaknya dalam kisaran ketepatan jumlah javascript terbatas (17 digit)
Uji
sumber
+'1'
untuk membunuh dua burung dengan satu batu!replace
adalah 1 byte lebih lama:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 byte
Fungsi anonim. Tidak terlalu rumit.
sumber
Melewati
720490 byteTidak bisa menolak untuk melakukan satu lagi setelah Never tell me odds . Jadi, saya sudah mengoptimalkan "ASCII-fier" dari yang sebelumnya. Dalam hal ini saya melihat tidak perlu membiarkan penunjuk instruksi berjalan di atas angka untuk membacanya, jadi saya belum mengambil upaya untuk membuat mereka dapat dibaca manusia. Jadi sekarang lebih digitifier.
Sekali lagi, jika kalian ingin penjelasan, beri tahu saya di komentar, saya akan mencoba membuat beberapa deskripsi yang bermanfaat. Anda dapat menyalin rekatkan kode ke juru bahasa . Saya telah menemukan bahwa contoh 2454728428486656000000000000 menghasilkan 0, tetapi itu tampaknya menjadi masalah dengan mendapatkan nilai sebesar itu dari suatu titik di grid, karena Anda dapat dengan jelas melihat nilai yang benar disimpan dalam langkah-langkah terakhir.
Versi ini juga mendukung input negatif. Ini merupakan peningkatan besar pada versi sebelumnya, jika saya mengatakannya sendiri. Setidaknya 1 bug diperbaiki dan ukurannya sangat berkurang.
sumber
Haskell,
1007977 byteTidak golf:
Fungsi ini membagi input menjadi digit dan melakukan trik melalui
i
.Sunting: Terima kasih kepada nimi untuk beberapa kiat.
sumber
i(a:[])=a
adalahi[a]=a
, b) tidak perlu untukmax 1
, karena0^0 = 1
di Haskell, c) ganti(:[])
denganpure
, d) pindahkan bagianlet
dalamg
ke fungsi yang terpisah dan gantiif ... then ... else
dengan penjaga:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
bukan di Prelude, tapi sisa tipsnya bekerja, terima kasih. Saya mencoba untuk melakukannya dengan penjaga, tetapi akhirnya menggunakan;
sebelum penjaga dan itu tidak berhasil, tetapi sekarang saya tahu bagaimana seharusnya bekerja.pure
ada di Prelude yang datang dengan basis-4.8.2.0. Tidak tahu kapan itu diperkenalkan. Anda tidak perlu( )
masuki([a])=a
.Mathematica, 74 byte
Penjelasan
Solusi ini menggunakan fungsi helper
f
, yang mengambil digit nomor sebagai argumen dan menerapkan satu iterasi dari operasi power train. Baris terakhir adalah fungsi murni yang dibuat untuk mengeksploitasiReplaceRepeated
fungsi (atau//.
singkatnya), yang menerapkan aturan pada ekspresi (dalam hal ini argumen#
fungsi murni) hingga tidak berubah lagi. Aturan inii_/;i>0:>f@@IntegerDigits@i
menggantikan apa pun yang tidak negatif dengan fungsi yangf
diterapkan ke digit desimalnya.sumber
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
Kesalahan kedua menghilang ketika saya menggunakan:=
vs=
.;
s bukannya ganti baris:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL , 21 byte
Mungkin butuh beberapa detik untuk menghasilkan output.
EDIT (30 Juli 2016): kode tertaut menggantikan
9L
dengan1L
untuk beradaptasi dengan perubahan terbaru dalam bahasa.Cobalah online!
Ini menggunakan dua trik berikut untuk mengurangi jumlah byte dengan mengorbankan efisiensi kode:
n
waktu alih-alih menunggu hingga ditemukan siklus. Ini dapat diterima sesuai komentar OP.1
harus ditambahkan untuk menyelesaikan operasi daya final. Alih-alih itu, jumlah yang ditambahkan1
adalah jumlah digit. Ini memastikan angka genap, sehingga semua operasi daya dapat dilakukan (bahkan jika yang terakhir adalah1^1
operasi yang tidak perlu ).Kode:
sumber
a, b, a, b
ad infinitum (lebih dari satu istilah). Jika satu istilah diulang, maka Anda harus menampilkan nomor itu. Maaf kalau itu tidak terlalu jelas.2592
input, sepertinya tidak menghasilkan apa-apa untuk sementara waktu.Python 3,
169161 byteUngoldfed
Hasil
sumber
;
cara ini. Anda menghemat ruang putih maksud Anda. Anda juga dapat meletakkan tubuh for for pada baris yang sama.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
dalam argumen default tidak berfungsi untuk saya karena menimbulkan kesalahan `tidak didefinisikan`Oracle SQL 11.2, 456 byte
Tidak bermain golf
v adalah tampilan rekursif, parameternya adalah
n: angka untuk dibagi menjadi 2 digit bagian
c: jumlah bagian 2 digit
i: bagian 2 digit saat ini untuk dihitung
f: string menyatukan kekuatan dengan * sebagai pemisah
t: evaluasi f
DECODEs beralih ke nomor berikutnya untuk dipecah dan dihitung ketika semua bagian dari angka saat ini selesai.
XMLTABLE (f) mengambil ekspresi dan mengevaluasinya, menempatkan hasilnya di kolom semu "column_value". Ini adalah versi golf dari http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE adalah build oracle dalam pendeteksian siklus dan digunakan sebagai kondisi keluar.
Karena hasil untuk: 1 <10 adalah: 1 dan v tidak mengembalikan baris untuk kasus tersebut, SUM memaksa baris dengan NULL sebagai nilainya. NVL mengembalikan: 1 sebagai hasilnya jika barisnya nol.
sumber