Anda harus mengambil 2 input string dan output jumlah dari dua string ini tanpa mengubahnya menjadi int atau menggunakan tipe data numerik apa pun.
ex.
string one = "123";
string two = "456";
string sum = "579";
Asumsikan string tidak akan lebih besar dari 10 digit.
Ini adalah kode golf dan jawaban terpendek dalam karakter menang. Sunting jawaban di C # akan membuat saya tersenyum :).
Sunting: Konversi ke int dapat didefinisikan sebagai sesuatu yang bersifat ini
Int.TryParse
, (int)
, Convert.ToInt
Dll
code-golf
string
arithmetic
CSharper
sumber
sumber
Jawaban:
80836 Majelis (
5753 byte)Ini menambahkan, digit demi digit, kanan ke kiri, tanpa mengonversi digit ascii
'0'-'9'
ke integer0-9
, dan meneruskan sesuai kebutuhan. Bytecode adalah kode untuk suatu fungsi, yang dapat disebut dalam C (lihat di bawah).Bytecode di atas ditulis dengan tangan, dari majelis berikut (gaya NASM, berkomentar):
Untuk mencoba ini di C (gcc, linux, prosesor intel):
sumber
Ruby,
10971Keju Jika Anda tidak dapat membawa Mohammad ke gunung ....
Algoritma:
Changelog
71 lebih pendek sebagai sebuah array.
85 menghapus deklarasi metode dan menggabungkan panggilan ke
n.to_s
92 menerapkan beberapa tips
101 simpan char
102 gunakan x untuk menambah
109 komit awal
sumber
succ
atauprev
.... tapi itu tidak menyenangkan untuk bermain golf.sed, 359 byte (tanpa format mewah)
Saya masih tidak yakin apakah ini adalah dup dari Tambah tanpa tambahan (atau salah satu dari 4 operator aritmatika dasar) . Sementara itu, biarkan saya mengirim jawaban saya untuk pertanyaan itu. Ini tidak akan memenangkan golf apa pun, tapi ini permulaan, dan saya pikir mudah memenuhi spesifikasi:
Input diambil dari STDIN dalam bentuk "x y". Itu pertama kali diubah menjadi "x: 0 :: y:". Lalu, kami menambah semua angka yang muncul setelah karakter ":", hingga kami mendapatkan "x: x: :( x + y):". Kemudian kami akhirnya kembali (x + y).
Keluaran
Perhatikan bahwa ini hanya berfungsi untuk bilangan asli. Namun (setidaknya dalam teori) ini berfungsi untuk bilangan bulat besar yang sewenang-wenang. Karena kita sedang melakukan operasi kenaikan x pada y, memesan dapat membuat perbedaan besar pada kecepatan: x <y akan lebih cepat daripada x> y.
sumber
y
dikonversi menjadiy+1
hanya menggunakan regex? dan tidak ada penambahan aktual? Bagus!Ruby -
485432265Ini tampaknya lebih dalam semangat apa yang Anda cari dalam pertanyaan.
Ini pada dasarnya memecahkan masalah bagaimana manusia akan di atas kertas - dengan "menghafal" semua hasil penambahan satu digit, menambahkan setiap kolom, dan memahami bagaimana "membawa satu" ketika diperlukan.
Ini juga menggunakan satu "tipe data numerik" (variabel i), yang dilarang oleh pertanyaan, tetapi hanya untuk pengindeksan string. Saya akan mencoba menghapus ini dan mengedit jawaban saya.
Agak tidak terserang:
EDIT: Menggunakan beberapa ide dari komentar untuk menghasilkan tabel pemetaan "hafal" bukan hanya hardcoding saja.
sumber
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
lebih baik daripadazip
/#{x+y}/
lebih pendek dariRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
memberi Anda array regex Anda.i
) ... pasti ada cara lain untuk itu ... mungkin hanya digunakaneach_cons(10)
sebagai enumerator dannext
melalui set?CJam,
95 92 80 72 7044 karakteryang diterjemahkan menjadi
Ini pasti bisa bermain golf banyak. Saya benar-benar tidak tahu apakah pendekatan saya optimal atau belum.
UPDATE - sebariskan jumlah penciptaan matriks untuk menyimpan byte. Karena ini, program sekarang berjalan 10 kali lebih lambat, tetapi masih waktu yang konstan untuk segala jenis input.
Cobalah online di sini
Membaca baris yang berisi dua angka dari STDIN sebagai string dan output sebagai array karakter yang merupakan string itu sendiri.
Sebagai contoh:
Outputnya berisi sebelumnya
0
. Beritahu saya jika itu adalah masalah.sumber
C # -
128108104Terima kasih kepada Compass, BMac dan Shawn karena telah menyarankan peningkatan.
Coba pertama kali di Code Golf, dan menggunakan C # tampaknya menjadi kendala di sini ...
Dengan menggunakan
.Compute()
Anda dapat menggunakan nilai string dan menjumlahkannya secara langsung. Sebagai bonus, ini berfungsi untuk operator lain selain dari hanya "+".Golf:
Tidak Disatukan:
Panggilan
t("123","456");
membuat Anda 579.sumber
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
untuk menggunakan untuk menyimpan 4 byteGNU sed, 266 byte
Menggunakan pendekatan yang berbeda dari solusi DigitalTrauma. Sebagai akibatnya, yang ini melakukan lebih buruk, menggunakan O (m + n) . Ubah kedua operan menjadi unary, concatenate, convert kembali ke desimal (semua menggunakan regex tentu saja - sed tidak memiliki konsep integer).
Sebagai bonus, program ini merangkum semua bilangan bulat alami yang diberikan pada stdin (di baris pertama), yang berarti Anda tidak dapat memberi makan apa-apa, satu angka atau sepuluh angka dan itu akan melakukan hal yang benar.
Gagasan di balik kode ini samar-samar terinspirasi oleh pengiriman lama PPCG saya, meskipun saya tidak ingat untuk pertanyaan apa itu adalah jawaban.
Ini dia, "cukup" -cetak untuk "kenyamanan" Anda, untuk meminjam ide lain dari DigitalTrauma. : D
(Untuk mendapatkan versi 266-byte, hapus tanda titik koma, spasi kosong terkemuka dan komentar terakhir, sebaiknya gunakan sed.)
Meminjam beberapa tes dari DigitalTrauma:
Saya mengubah sedikit tes yang sangat besar karena efisiensi ruang yang sangat buruk. Karena penggunaan
q
hanya baris pertama yang diproses, makawhile
loop dalam tes.sumber
Java 6 (181 karakter)
Tidak mau kalah dengan cacat yang dikenal sebagai C # , Jawa dalam semua kemuliaan. Begitu banyak boilerplate! Penggunaan menyediakan argumen yang dipisahkan oleh spasi, yaitu
123 456
Tidak Disatukan:
Dengan menggunakan mesin JavaScript yang tersedia di
javax
, kami dapat membuat bahasa lain melakukan pekerjaan untuk kami, dan secara teknis mengikuti aturan tidak menggunakan jenis numerik apa pun dalam bahasa asli, atau mengonversi.Pembenaran untuk menggunakan
eval
Kami belum mengonversi nilai menjadi int agar JavaScript dapat dievaluasi. Kami telah membuat String
"123+456"
yang bukan angka. Mesin JS mencerna rumus dan mengevaluasi String sebagai literal angka, yang bukan tipe data numerik. Logika Java cheesy! Selain itu, ini juga berfungsi untukdouble
matematika.sumber
dc -e"$1 $2+p"
teknis saya belum pernah menggunakan tipe angka di bash asli itu hanya meneruskan string ke beberapa detail implementasiAPL (61)
Saya pikir ini termasuk dalam aturan.
Ini adalah fungsi yang mengambil dua argumen string, dan mengembalikan string:
Ini juga cukup cepat, ia menambahkan angka yang dibentuk oleh 999999
9
dengan sendirinya dalam sekejap.Ia menemukan indeks masing-masing karakter dalam
⎕D
(yang merupakan string '0123456789'), kemudian melakukan penambahan sekolah dasar pada setiap indeks secara terpisah, membawa sesuai kebutuhan, kemudian mencari digit yang dihasilkan di⎕D
. (Saya pikir⎕D
pencarian termasuk dalam aturan, pada dasarnya hanya melakukan'x'-48
).Penjelasan:
⎕D∘⍳¨⍺⍵
: lihat indeks⎕D
untuk setiap karakter di kedua string.¯1+
: kurangi1
dari masing-masing, karena array berbasis 1 secara default.⌽↑⌽¨
: membalikkan keduanya, berubah menjadi matriks (mengisi kotak kosong dengan nol), lalu balikkan matriks.+⌿
: jumlah kolom dari matriks{
...}
: bawa:∨/T←9<Z←0,⍵
: tambahkan tambahan0
di depan daftar. Cari tahu 'angka' mana yang lebih tinggi dari 9, dan simpan diT
. Jika ada angka yang lebih tinggi dari 10:Z-10×T
: kurangi10
dari setiap posisi yang lebih tinggi dari 10,T←(1⌽T)+
: tambahkan1
ke setiap posisi di sebelah setiap posisi yang lebih tinggi dari 10, dan simpan diT
.T↓⍨~×⊃T
: jikaT
dimulai dengan nol, hapus,∇
: terapkan fungsi carry ke hasilnya.⋄⍵
: jika tidak, kembalikan nilainya tidak berubah1+
: tambahkan satu untuk setiap posisi (karena array 1-diindeks)⎕D[
...]
: gunakan hasilnya sebagai indeks⎕D
.sumber
Perl -
136119115 byteSaya belajar Perl, ini sepertinya latihan yang bagus. Tips sangat dihargai!
Jawaban murahan, untuk menghindarinya:
Jawaban aktual:
Terkompresi:
sumber
($x,$y)=@ARGV
dan menggunakansay
bukannyaprint
akan mencukur beberapa karakter.say
adalah hal Perl 6 (atau Anda bisa menggunakannya di Perl 5 dengan instruksi ini , tetapi itu akan terlalu lama). Alih-alihsay
, gunakanwarn
untuk mencukur karakter. Itu akan menampilkan ke STDERR bukan STDOUT, tapi itu tidak melanggar aturan yang satu ini. :-)Java 7, Skor = 252
Tidak menggunakan bilangan bulat, panjang, byte, celana pendek, ganda, mengapung, atau fungsi perpustakaan bawaan untuk ditambahkan. Bungkus dengan tubuh kelas dan panggil dengan
t(String1,String2)
. Harap pad string dengan 0 sehingga mereka memiliki panjang yang sama.t("123","234")
kembali"0357"
.Golf:
Golf Diperluas dengan kelas:
Golf sebagian diperluas:
100% Diperluas:
sumber
char
adalah tipe data numerik ._.\u0030
ke string, saya"0"
tidak mengerti"48"
.Java - 257 Karakter
karena semua orang tahu java tidak ada bahasa yang lebih baik untuk bermain golf selain java
ini adalah solusi tanpa lemak
sumber
Haskell -
9894 bytesumber
JavaScript (ES6),
55 6659 ** Ini membuat beberapa asumsi:
Input didefinisikan dalam variabel a dan b, mis:Diubah untuk mendapatkan input dari prompt (+11).var a='123',b=321';
sumber
Python 2.7,
196137 karakterversi 2 (lebih pendek dengan menginisialisasi kamus dengan kode):
Versi sebelumnya 1 (196 karakter):
misalnya
Kunci kamus adalah string, nilai kamus hanya menyertakan konstanta angka untuk mempersingkat kode, dan perhitungan dilakukan dengan menggabungkan dua string dan mendapatkan panjang yang dihasilkan, jadi saya harap ini dihitung sebagai "tidak mengubahnya menjadi int".
Versi aturan-cheat versi Python kecil-cetak
catatan:
Tipe z adalah tipe kustom yang saya definisikan sebagai: jelas bukan tipe numerik menurut definisi apa pun yang digunakan si penanya, tetapi berperilaku cukup dekat dengan tipe numerik untuk berguna dalam keadaan terbatas . Perilaku tipe z hanya sebagian diimplementasikan dalam sampel kode ini, dan jika juru bahasa CPython menggunakan 'int' untuk mengimplementasikan z , itu hanyalah detail implementasi dan tidak terkait dengan masalah yang dihadapi.
sumber