Operator yang menggabungkan jumlah, produk, dan perbedaan antara dua angka


28

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 xdan ysedemikian rupa x > y > 0, menghasilkan jawaban yang benar sebagai bilangan bulat , di mana digit jawaban adalah digit x * ydiikuti oleh digit x + ydiikuti oleh digit x - y. Sangat sederhana.

Aturan:

  • Celah standar tidak diijinkan.
  • Ini adalah 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:

Dyalog APL :

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:

  • sxdan sypop elemen dari tumpukan dan simpan di register xdan y, masing-masing.

  • lxdan lymemuat elemen dari register xdan ymasing-masing dan mendorongnya ke tumpukan.

  • d menduplikasi elemen terakhir di stack.

  • ^ menghitung kekuatan dua angka.

  • Zmuncul nomor dan mengembalikan jumlah digitnya. Ini dilakukan karena dctidak memiliki fungsi logaritma.

  • [...]samenyimpan makro dalam register a. lamemuatnya. xmengeksekusi makro di bagian atas tumpukan.

Contoh:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

Saya menganggap konversi dari integer ke string tidak valid?
Anthony Pham

2
Saya pikir kami memiliki tantangan seperti ini tetapi tidak tahu istilah apa yang akan menemukan korban penipuan.
xnor

2
@AnthonyPham "Anda tidak diizinkan menggunakan string atau jenis penggabungan apa pun di dalam kode Anda."
ASCII

1
Bisakah kita mengambil sepasang bilangan bulat sebagai input?
Conor O'Brien

1
Bisakah saya membuat program lengkap alih-alih fungsi?
Erik the Outgolfer

Jawaban:


10

JavaScript (ES7), 63 61 59 byte

Disimpan 4 byte berkat Neil .

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


Simpan beberapa byte menggunakan 10**-~Math.log10(c). (Tapi +1 untuk digunakan reduce, tentu saja.)
Neil

"ES7" Oh, untuk cinta coding ... Mereka membuat yang lain?
Feathercrown

@Feathercrown Ya, tetapi apakah ini benar-benar lebih buruk daripada mendengar "Java 9"? Plus itu memiliki hal-hal yang berguna seperti async/ awaitdan operator eksponensial**
ASCII-saja

@ ASCII-only **sangat berguna, saya setuju. Itu seharusnya di ES6.
Feathercrown

8

C, 79 75 byte

Terima kasih kepada @GB untuk menghemat 4 byte!

#define X for(c=1;(c*=10)<=a
c,d;f(a,b){X+b;);d=c*a*b+a+b;X-b;);a=d*c+a-b;}

Cobalah online!


1
Simpan beberapa byte dengan menggunakan define bukan fungsi: tio.run/nexus/…
GB

6

Bash, 66

  • 2 byte disimpan berkat @chepner.
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

Cobalah online .


Dimungkinkan untuk membuat ini hampir dua kali lebih pendek jika Anda menempatkan variabel Anda (s, d dan yang lainnya untuk perkalian yang tidak Anda tetapkan) di samping satu sama lain dan mengevaluasi itu sebagai ekspresi aritmatika.
Maxim Mikhaylov

3
@ MaxLawnboy Ya, meskipun itu terdengar sangat mirip dengan penggabungan string yang dilarang untuk saya.
Digital Trauma

1
Nama pengidentifikasi di dalam $[...]tunduk pada ekspansi parameter tanpa eksplisit $(misalnya, dbukannya $d), menyimpan dua karakter.
chepner

@ chepner ya - terima kasih - Saya merindukan itu.
Digital Trauma

Menemukan dua lainnya; gunakan ((s=$1+$2,d=$1-$2))untuk menginternalisasi dua variabel.
chepner

5

EXCEL, 61 Bytes

=A1-B1+(A1+B1)*10^LEN(A1-B1)+A1*B1*10^(LEN(A1-B1)+LEN(A1+B1))

Excel, 18 Bytes tidak valid

=A1*B1&A1+B1&A1-B1

5

Ditumpuk , 36 byte

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

Cobalah online!

Sebelumnya: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^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+}#\.



4

GNU dc, 36

Menentukan makro myang mengambil dua anggota teratas tumpukan, menerapkan makro dan meninggalkan hasilnya di tumpukan (seperti contoh dalam pertanyaan):

[sadsbla-dZAr^lalb+*+dZAr^lalb**+]sm

Cobalah online .


3

Perl 6 ,  81 61  58 byte

->\x,\y{($/=($/=x- y)+(x+y)*({10**$++}...*>$/).tail)+x*y*({10**$++}...*>$/).tail}

Cobalah

->\x,\y{(x*y,x+y,x- y).reduce:{$^a*10**Int(1+log10($^b))+$b}}

Cobalah

->\x,\y{[[&({$^a*10**Int(1+$^b.log10)+$b})]] x*y,x+y,x- y}

Cobalah


Tidak mengetahui Perl 6, saya sedikit terkejut menemukan bahwa itu x-yadalah pengidentifikasi yang valid.
Neil

3

Jelly , 27 byte

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

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:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

Detail:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP, 79 75 byte

dua versi:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

mengambil input dari argumen baris perintah; jalankan bersama -r.

Saya kira strlenmemenuhi syarat sebagai "fungsi yang mengembalikan jumlah digit",
meskipun menggunakan angka sebagai string. Beritahu saya jika tidak.


'Anda tidak diizinkan menggunakan string atau jenis rangkaian apa pun di dalam kode Anda.', Jadi saya rasa itu tidak strlenvalid.
numbermaniac

@numbermaniac Biarkan OP yang memutuskan. Imo pembatasannya adalah untuk memaksa solusi untuk menciptakan satu hasil, bukan hanya mencetak tiga hasil setelah satu sama lain. Segala sesuatu di luar itu adalah nitpicking.
Titus

2

C (gcc) , 70 byte

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

Cobalah online!

berdasarkan jawaban Steadybox , menempatkan semuanya dalam makro untuk golf sedikit lebih

(Catatan: menugaskan hasil dalih-alih abekerja, tiba-tiba. Saya telah melihat kode perakitan yang dihasilkan dan tampaknya ok.)


2

Haskell, 54 byte

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

Teka-teki diimplementasikan melalui fungsi infiks #, misalnya 8#2 = 16106. Fungsi lainnya %,, mendefinisikan base-10 concatenation (dengan asumsi RHS lebih besar dari 0).



1

PHP, 87 Bytes

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

dan solusi yang tidak valid untuk 37 Bytes

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

Ruby, 61 byte

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

Yang mencurigakan sangat mirip dengan jawaban Javascript ini , tetapi tanpa menggunakan logaritma.


1

Python, 92 91 Chars

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

Terima kasih atas saran Penyihir;)


Selamat datang di situs ini! Anda tidak perlu ruang antara )dan if.
Wheat Wizard

1

R (3.3.1), 104 byte

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

mengembalikan fungsi anonim.

Ini adalah upaya golf pertama saya, jadi umpan balik sangat dihargai.


1
Saya akan mengatakan untuk mencoba menghindari mendefinisikan fungsi melalui kata 'fungsi' yang dicadangkan jika memungkinkan, itu menggunakan banyak byte. Lakukan saja perhitungannya.
user11599

0

REXX, 70 byte

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

Tentu saja, cara asli akan jauh lebih pendek:

f:arg a b
return a*b||a+b||a-b

0

PowerShell, 88 Bytes

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

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 -gt9 mengetahui panjangnya. Mungkin bisa lebih singkat tetapi saya harus kembali bekerja.


0

Python 2.7, 109 96 byte

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

Diperbaiki setelah mengikuti aturan kontes. Kredit ke mbomb007 untuk menurunkan kode dari 109 byte menjadi 96 byte


1
Dari aturan tantangan ini -•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork

Anda dapat menyimpan beberapa byte dengan membuat alambda. a=lambda n:10**int(.... Anda juga dapat melakukannya b,c=input(), memberikan dua input Anda dipisahkan dengan koma.
mbomb007

@ mbomb007 b, c = input () memberikan TypeError: objek 'int' tidak dapat diubah. Saya sudah mencobanya. Dan fungsi lambda tidak akan menyimpan byte karena saya memanggil fungsi dua kali dalam kode. mencobanya juga. :(
Koishore Roy

@ KoishoreRoy Saya tidak berpikir Anda mengerti maksud saya. 96 byte
mbomb007

0

J , 25 byte

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- Kotak hasil setiap operasi.
  2. 10#.inv&.>Konversikan setiap hasil menjadi array dengan basis-10 digit. ( invadalah^:_1 )
  3. [:; Buka kotak dan bergabunglah dengan array.
  4. 10#. Ubah array angka dasar-10 menjadi bilangan bulat.
  5. X=.tentukan di atas sebagai operator X.

Hasil:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

Anda tidak perluX=.
Cyoce

@Cyoce - contoh kode APL dalam tantangan menentukan operator. Saya cukup yakin kita seharusnya mendefinisikan operator yang dapat digunakan kembali untuk tantangan ini.
Dane

"3. [:; Buka kotak dan bergabunglah dengan array." - "Anda tidak diizinkan menggunakan string atau jenis rangkaian apa pun di dalam kode Anda."
ngn

@ ngn - Perluas komentar Anda. Tidak ada string yang digunakan.
Dane

Saya hanya ingin menunjukkan bahwa "bergabung" ("tautan"?) Mungkin merupakan "semacam rangkaian", meskipun saya tidak terlalu akrab dengan J, dan saya tidak yakin bagaimana menafsirkan pernyataan masalah dalam kasus ini. . Solusi saya sendiri menimbulkan pertanyaan serupa - saya menggunakan stranding (menyandingkan kata benda di APL membentuk vektor) yang mungkin sama dengan "tautan" J tetapi tanpa mesin terbang untuk mewakilinya.
ngn

0

Mathematica, 67 byte

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

Mengambil x-y, lalu mengambil log10 x-y, mengumpulkannya, menghitung 10 pangkat itu dan kemudian mengalikannya dengan x+y. Tapi kita juga perlu mempertimbangkan log10(x-y)0, jadi kita ganti 0 dengan 1. Lalu kita ambil log10 dari 2x, dibulatkan, ditambah 1, dan temukan 10 pangkat dari itu. Lipat gandakan dengan xy, dan tambahkan itu.


0

05AB1E , 23 22 16 byte

-Dg°¹²+*Dg°¹²**O

Cobalah 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.


0

R, 64 byte

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

Pemakaian:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.