Tantangan:
Ada teka-teki konyol yang beredar di jejaring sosial yang berbunyi:
8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?
Menerapkan fungsi atau operator yang, ketika diberi dua angka bilangan bulat positif x
dan y
sedemikian rupa x > y > 0
, menghasilkan jawaban yang benar sebagai bilangan bulat , di mana digit jawaban adalah digit x * y
diikuti oleh digit x + y
diikuti oleh digit x - y
. Sangat sederhana.
Aturan:
- Celah standar tidak diijinkan.
- Ini adalah kode-golf sehingga kode terpendek dalam byte menang.
- Validasi data input tidak diperlukan. Program ini dapat macet atau mengembalikan sampah saat diberikan input yang tidak valid.
- Anda diperbolehkan menggunakan fungsi numerik dan operator (termasuk integer dan floating point, fungsi perpustakaan matematika, dan fungsi lain yang menerima dan mengembalikan angka).
- Anda diizinkan menggunakan fungsi yang mengembalikan jumlah digit suatu angka, jika berlaku.
- Anda tidak diizinkan menggunakan string atau jenis penggabungan apa pun di dalam kode Anda.
- Hasilnya dapat dikembalikan atau didorong ke tumpukan, mana yang berlaku dalam bahasa. Hasilnya harus berupa bilangan bulat, bukan string.
Kode sampel:
Kode berikut membuat operator diad bernama X
.
X ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}
Penjelasan:
Di APL, Anda mengevaluasi dari kanan ke kiri.
⍺ and ⍵
adalah operan kiri dan kanan, masing-masing⌊10⍟⍺-⍵
berbunyi:floor of log10(⍺-⍵)
. Pertama melakukan substraksi kemudian logaritma kemudian lantai. Dari kanan ke kiri. log10 dilakukan untuk menghitung digit⍺-⍵
(Anda harus menjumlahkan 1 setelahnya).⍺×⍵×10*(...)
berbunyi:10 to the (...)th power, multiplied by ⍵, multiplied by ⍺
Karenanya,
⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵
adalah produk, bergeser ke kiri dengan jumlah jumlah digit dan perbedaan. Mengalikan dengan kekuatan 10 akan menggeser bilangan bulat ke kiri.((⍺+⍵)×10*1+⌊10⍟⍺-⍵)
adalah jumlah, bergeser ke kiri dengan jumlah digit perbedaan.(⍺-⍵)
bedanya. Tidak ada pergeseran diperlukan di sini.X←{...}
adalah cara Anda mendefinisikan operator di APL.
Contoh:
8 X 2
16106
5 X 4
2091
9 X 6
54153
GNU dc:
Kode berikut membuat makro bernama a
:
[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa
Penjelasan:
sx
dansy
pop elemen dari tumpukan dan simpan di registerx
dany
, masing-masing.lx
danly
memuat elemen dari registerx
dany
masing-masing dan mendorongnya ke tumpukan.d
menduplikasi elemen terakhir di stack.^
menghitung kekuatan dua angka.Z
muncul nomor dan mengembalikan jumlah digitnya. Ini dilakukan karenadc
tidak memiliki fungsi logaritma.[...]sa
menyimpan makro dalam registera
.la
memuatnya.x
mengeksekusi makro di bagian atas tumpukan.
Contoh:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153
sumber
Jawaban:
JavaScript (ES7),
636159 byteDisimpan 4 byte berkat Neil .
sumber
10**-~Math.log10(c)
. (Tapi +1 untuk digunakanreduce
, tentu saja.)async
/await
dan operator eksponensial**
**
sangat berguna, saya setuju. Itu seharusnya di ES6.C,
7975 byteTerima kasih kepada @GB untuk menghemat 4 byte!
Cobalah online!
sumber
Bash, 66
Cobalah online .
sumber
$[...]
tunduk pada ekspansi parameter tanpa eksplisit$
(misalnya,d
bukannya$d
), menyimpan dua karakter.((s=$1+$2,d=$1-$2))
untuk menginternalisasi dua variabel.EXCEL, 61 Bytes
Excel, 18 Bytes tidak valid
sumber
Ditumpuk , 36 byte
Cobalah online!
Sebelumnya:
,@A$(-+*){!A...n!}"!:inits$#'"!$summap:[email protected]\^1\,\*sum
Saya akan mencoba memeras satu atau dua byte sebelum menulis penjelasan. (
#'
= ukuran, dan"
"lakukan pada masing-masing", tanpa pamrih di sini.)Tidak bersaing di 26 bytes:
$(*+-)#!!:{%y#'10\^x*y+}#\
.sumber
TI-Basic,
3433 bytesumber
Prompt A,B
juga harus bekerjaGNU dc, 36
Menentukan makro
m
yang mengambil dua anggota teratas tumpukan, menerapkan makro dan meninggalkan hasilnya di tumpukan (seperti contoh dalam pertanyaan):Cobalah online .
sumber
Perl 6 ,
81 6158 byteCobalah
Cobalah
Cobalah
sumber
x-y
adalah pengidentifikasi yang valid.Jelly , 27 byte
Menentukan hubungan / fungsi diadik, yang dapat dipanggil dengan
ç
. Mengambil dua bilangan bulat sebagai input dan mengembalikan bilangan bulat. Ini memiliki bonus tambahan untuk dapat mengambil<
xy atau>
xy dengan menggunakan perbedaan absolut.Cobalah online!
Penjelasan:
Detail:
sumber
PHP,
7975 bytedua versi:
mengambil input dari argumen baris perintah; jalankan bersama
-r
.Saya kira
strlen
memenuhi syarat sebagai "fungsi yang mengembalikan jumlah digit",meskipun menggunakan angka sebagai string. Beritahu saya jika tidak.
sumber
strlen
valid.C (gcc) , 70 byte
Cobalah online!
berdasarkan jawaban Steadybox , menempatkan semuanya dalam makro untuk golf sedikit lebih
(Catatan: menugaskan hasil
d
alih-aliha
bekerja, tiba-tiba. Saya telah melihat kode perakitan yang dihasilkan dan tampaknya ok.)sumber
Haskell, 54 byte
Teka-teki diimplementasikan melalui fungsi infiks
#
, misalnya8#2 = 16106
. Fungsi lainnya%
,, mendefinisikan base-10 concatenation (dengan asumsi RHS lebih besar dari 0).sumber
Dyalog APL, 31 byte
{a⊥⍨10*1+⌊10⍟a←(⍺×⍵)(⍺+⍵)(⍺-⍵)}
berdasarkan sampel kode APL dari pernyataan masalah
sumber
PHP, 87 Bytes
dan solusi yang tidak valid untuk 37 Bytes
sumber
Ruby, 61 byte
Yang mencurigakan sangat mirip dengan jawaban Javascript ini , tetapi tanpa menggunakan logaritma.
sumber
Python,
9291 CharsTerima kasih atas saran Penyihir;)
sumber
)
danif
.R (3.3.1), 104 byte
mengembalikan fungsi anonim.
Ini adalah upaya golf pertama saya, jadi umpan balik sangat dihargai.
sumber
REXX, 70 byte
Tentu saja, cara asli akan jauh lebih pendek:
sumber
PowerShell, 88 Bytes
PowerShell tidak memiliki operator daya yang tidak membantu. Juga tidak dapat menghitung panjang bilangan bulat kecuali jika Anda menghitungnya sebagai string, yang tidak dapat kami lakukan, jadi saya memeriksa untuk mengetahui apakah bilangan bulat
-gt
9 mengetahui panjangnya. Mungkin bisa lebih singkat tetapi saya harus kembali bekerja.sumber
Python 2.7,
10996 byteDiperbaiki setelah mengikuti aturan kontes. Kredit ke mbomb007 untuk menurunkan kode dari 109 byte menjadi 96 byte
sumber
•You're not allowed to use strings or any kind of concatenation anywhere in your code.
a
lambda.a=lambda n:10**int(...
. Anda juga dapat melakukannyab,c=input()
, memberikan dua input Anda dipisahkan dengan koma.J , 25 byte
*;+;-
Kotak hasil setiap operasi.10#.inv&.>
Konversikan setiap hasil menjadi array dengan basis-10 digit. (inv
adalah^:_1
)[:;
Buka kotak dan bergabunglah dengan array.10#.
Ubah array angka dasar-10 menjadi bilangan bulat.X=.
tentukan di atas sebagai operatorX
.Hasil:
sumber
X=.
Mathematica, 67 byte
Mengambil
x-y
, lalu mengambil log10x-y
, mengumpulkannya, menghitung 10 pangkat itu dan kemudian mengalikannya denganx+y
. Tapi kita juga perlu mempertimbangkanlog10(x-y)
0, jadi kita ganti 0 dengan 1. Lalu kita ambil log10 dari2x
, dibulatkan, ditambah 1, dan temukan 10 pangkat dari itu. Lipat gandakan denganxy
, dan tambahkan itu.sumber
05AB1E ,
232216 byteCobalah online!
Kita bisa menyimpan beberapa byte jika kita diizinkan menggunakan string dalam program (tetapi tidak dalam perhitungan) dengan mengulangi string yang berisi operasi
"-+*"
, karena kode yang dilakukan untuk setiap operasi adalah sama.Tentu saja, jika kami diizinkan menggunakan penggabungan kami akan menghemat lebih banyak.
sumber
R, 64 byte
Pemakaian:
sumber