Tugas Anda adalah, diberi bilangan bulat positif n
, untuk menghasilkan ekspresi yang sama dengan angka n
.
Tangkapannya adalah: Anda hanya diizinkan nomor 1
dalam output.
Operator yang Anda inginkan adalah:
+
,-
,*
Dan/
/
adalah divisi floating-point (jadi5/2 = 2.5
).
sqrt
(ass
)ceil
danfloor
( masingc
-f
masing dan setiap )!
(faktorial)- Faktorial, dalam hal ini, hanya berfungsi untuk bilangan bulat positif.
Anda juga diizinkan untuk menumpuk 1
bersama, jadi sesuatu seperti 11
dapat diterima di output. Namun, mereka dihitung sebagai jumlah yang sama 1
dengan yang ada di angka (jadi 11
dihitung sebagai 2 1
's)
Anda juga harus menyertakan tanda kurung di output, sehingga ekspresi dalam output, ketika dieksekusi melalui urutan operasi, akan menghasilkan input. Mereka tidak dihitung sebagai operasi.
Contoh:
- Input = 24, satu kemungkinan output =
(1+1+1+1)!
- Input = 11, satu kemungkinan output =
11
- Input = 5, satu kemungkinan output =
c(s((1+1+1+1)!))
- Langit-langit akar kuadrat
24
adalah5
.
- Langit-langit akar kuadrat
Aturan:
- Anda dijamin bahwa input adalah bilangan bulat positif dari
1
hingga2^31-1
. - Program Anda harus bekerja untuk setiap bilangan bulat positif hingga
2^31-1
, bahkan jika mereka tidak diuji. - Program Anda harus selesai memproses semua output untuk semua angka dalam set dalam 1 jam.
- Hasil untuk setiap menjalankan program harus persis sama - juga, tidak ada biji.
- Anda hanya diperbolehkan untuk membuat hardcode ekspresi hingga maksimum 10 nilai numerik.
- Anda tidak diizinkan memiliki angka imajiner di output mana pun (jadi tidak
s(some negative number)
). - Anda juga tidak diperbolehkan memiliki angka yang lebih besar
2^31-1
atau lebih kecil dari-2^31+1
di mana pun dalam output, bahkan ketika merekasqrt
ed atau/
ed (jadi tidak ada(((1+1+1)!)!)!
atau((1+1+1+1)!)!
).
Set Bilangan:
945536, 16878234, 32608778, 42017515, 48950830, 51483452, 52970263, 54278649, 63636656, 78817406, 89918907, 90757642, 95364861, 102706605, 113965374, 122448605, 126594161, 148064959, 150735075, 154382918, 172057472, 192280850, 194713795, 207721209, 220946392, 225230299, 227043979, 241011012, 248906099, 249796314, 250546528, 258452706, 276862988, 277140688, 280158490, 286074562, 308946627, 310972897, 322612091, 324445400, 336060042, 346729632, 349428326, 352769482, 363039453, 363851029, 392168304, 401975104, 407890409, 407971913, 425780757, 459441559, 465592122, 475898732, 482826596, 484263150, 506235403, 548951531, 554295842, 580536366, 587051904, 588265985, 588298051, 590968352, 601194306, 607771869, 618578932, 626776380, 667919873, 681786366, 689854904, 692055400, 697665495, 711608194, 734027104, 750869335, 757710567, 759967747, 777616154, 830071127, 833809927, 835873060, 836438554, 836945593, 863728236, 864158514, 871273503, 881615667, 891619600, 897181691, 918159061, 920521050, 924502226, 929983535, 943162304, 950210939, 950214176, 962610357, 974842859, 988572832
(Ini adalah 100 angka acak dari 1 hingga 1 miliar.)
Sistem penilaian:
Skor Anda ditentukan seperti ini:
- Program Anda akan diuji dengan angka acak di set.
- Anda harus memberikan output yang dihasilkan menggunakan angka acak di set (baik di dalam jawaban Anda atau sebagai tautan pastebin).
- Anda kemudian memiliki dua "skor": Skor primer dan skor sekunder.
- Skor utama Anda adalah
(no. of 1's in output)*(no. of operators in output)
. Jika skor utama Anda adalah yang terendah, Anda menang. - Skor sekunder Anda adalah waktu unggahan Anda, dalam GMT, dan dalam waktu 24 jam. Jadi, jika Anda mengunggah program Anda pada 12 September, 00:00 GMT, maka skor Anda adalah
12/09/2016, 00:00
(gunakanDD/MM/YYYY HH:MM
untuk pemformatan Anda).
- Skor utama Anda adalah
Tampilkan skor Anda seperti ini:
(language name)
Primary Score = (primary score)
Secondary Score = (secondary score)
(no. of 1's) `1`'s, (no. of operators) operators
Ganti semua hal dalam kurung dengan nama bahasa Anda, skor utama dan skor sekunder masing-masing.
Pemenang saat ini:
Pemenang saat ini adalah @ChrisJefferson, yang memiliki skor utama 3,810,660
.
sumber
Jawaban:
C ++ 11
Pembaruan kecil lebih lanjut: Jangan menambahkan terlalu sedikit, dan coba semua nomor formulir A * B + C. Saya percaya bahwa, dalam batas waktu, ini cukup dekat dengan optimal, dengan asumsi Anda hanya menggunakan
+
,*
dan!
. Saya meninggalkan operator lain kepada orang-orang dengan waktu lebih banyak daripada saya!Pembaruan kecil: Berusaha lebih keras untuk menggunakan faktorial dan angka seperti 11 .... 111. Juga memperbaiki bug yang tidak
!
saya hitung dalam penetapan biayaHasil baru:
Skor Utama = 3.810.660
Skor Sekunder = 12/09/2016 20:00
2532
1
s, 1505 operator.Berbagai trik disatukan. Program saya mulai dengan mengatur program terpendek untuk semua faktorial dan angka dari formulir 111..111 (Saya tidak berpikir ini melanggar aturan pengkabelan, karena ini adalah cara terpendek untuk membuat angka-angka ini. Saya bisa mengatur ulang kode saya jadi saya memeriksa pola-pola ini di pemrograman dinamis saya jika Anda mau). Kemudian lakukan pendekatan pemrograman dinamis parsial, dengan mencoba berbagai bentuk:
Sayangnya saya tidak dapat mencoba semua cara penguraian angka, jadi saya memilih untuk faktorial dan 11 ... 11 untuk hanya mencoba angka terdekat, untuk A + B untuk mencoba hal-hal di dekat A / 2, dan untuk A * B + C untuk mencoba As hanya cukup kecil.
Akan mudah untuk memperpanjang ini untuk mencoba beberapa '-'s, dengan mencoba untuk melampaui sedikit kadang-kadang (khususnya di A * B - C), tetapi saya cukup suka hanya mencoba untuk tumbuh.
Juga, sangat sulit untuk mengoptimalkan kondisi optimisasi (saya tidak suka itu!) Karena pada prinsipnya Anda tidak dapat memberikan nilai 'terbaik' untuk setiap angka secara terpisah, Anda harus mempertimbangkan set jawaban Anda secara global (yang saya tidak ingin lakukan).
Peringatan: Program ini membutuhkan mesin 64-bit, dan memori sekitar 10GB (karena saya tidak efisien membuat array raksasa untuk semua hasil yang dihitung sebagian).
Program:
Hasil:
sumber
!
. Saya pikir itu 1632 operator, bukan 1407 (yang masih mengarah ke skor yang bagus.)long maxval
menggerutu menggerutuHaskell
Skor primer: 27242281
Skor sekunder: 12/09/2016 09:01
11891
1
, 2291 operatorIni pada dasarnya menemukan cara terpendek untuk membuatnya hanya menggunakan + dan -
Keluaran:
sumber
Python, skor 17136288
skor sekunder: 12/09/2016 08:53
(4784 orang dan 3582 operasi)
Bekerja dalam proses tetapi OP meminta kode saya saat ini ...
Output - catatan bahwa
t
adalah fungsi faktorial, agar tidak menjadi bingung denganf
untukfloor
jika akan digunakan - Saya mengevaluasi masing-masing menggunakan fungsit
(atas) untuk periksa bahwa mereka semua benar:sumber
t
dalam output?JavaScript (ES6), 27212498, 2016-09-12 09: 46: 34Z
Hanya menggunakan + dan -. Berdasarkan jawaban saya untuk Meminimalkan Mereka
sumber
Python
Skor Utama = 2214138604871819402525
Skor Sekunder = 12/09/2016, 07:53
Ini kodenya:
Hanya untuk mendapatkan bolanya.
Pada dasarnya keluaran
1+1+1...+1
, di mana jumlah1
dalam ekspresi yang dihasilkan sama dengann
.Secara total, ada
47054634305
1
untuk set angka, dan47054634205
operator (yang semuanya+
).Tidak akan memposting pastebin di sini, karena Anda mendapatkan idenya.
sumber
2**31-1
.n-1
? Ini bekerja dengan baik untuk saya.awk
skor primer 46933701
skor sekunder 12/09/2016 19:20
(6901 yang, 6801 ops)
Cukup cetak representasi biner yang dihitung dari kiri ke kanan.
Misalnya 19 adalah 10011 yaitu ((((( 1 ) * 2 + 0 ) * 2 + 0 ) * 2 + 1 ) * 2 + 1 ).
Saya hanya meninggalkan
+0
dan menulis2
sebagai(1+1)
.Saya hanya ingin tahu tentang bagaimana metode ini akan mencetak gol.
Keluaran:
sumber
Python 3
Skor Utama:
69720516
Skor Sekunder:
09:30 14/09/2016
Sunting: Sekarang menggunakan perkalian untuk sangat mengurangi skor.
Ini sangat memanfaatkan faktorial dan rekursi. Secara total, program ini menggunakan:
5958
yang11702
operatorIde itu!
sumber
JAWA
Skor Utama
1045978739
Skor sekunder
12/09/2016 16:05
37193
1s
28123
operators
sumber
1
di awal masing-masing(1*11*11*...*11)
.Emacs Lisp
Skor primer: 81638725
Skor sekunder: 12/09/2016 09:35
Pada dasarnya membangun jumlah di atas domain (1, 11, 111, ...) yang setara dengan n.
sumber
111+11+1+1
, kan? (Koreksi saya jika saya salah.)1
s di seluruh jumlah keluaran 100 dan mengalikannya dengan total+
operasi di seluruh keluaran?AWK , 15642720
Skor Sekunder = 30/05/2017, 21:11
Cobalah online!
Yang: 4590
Ops: 3408 Skor Utama = 15642720 Skor Sekunder = 30/05/2017 21:11
sumber