Ada banyak tantangan "Lakukan __ tanpa _ _" sebelumnya, tapi saya harap ini adalah salah satu yang paling menantang.
Tantangan
Anda harus menulis sebuah program yang mengambil dua bilangan asli (bilangan bulat> 0) dari STDIN, dan mencetak jumlah dari dua angka itu ke STDOUT. Tantangannya adalah Anda harus menggunakan sesedikit mungkin +
dan -
menandainya sebagai tanda. Anda tidak diperbolehkan menggunakan fungsi jumlah atau negasi.
Contohnya
memasukkan
123
468
keluaran
591
memasukkan
702
720
keluaran
1422
Tie Breaker:
Jika dua program memiliki jumlah +
dan -
karakter yang sama, pemenangnya adalah orang dengan jumlah lebih sedikit /
*
(
)
=
.
,
dan 0-9
karakter.
Tidak Diizinkan: Bahasa di mana operator penambahan / pengurangan standar dan kenaikan / pengurangan adalah simbol selain +
atau -
tidak diizinkan. Ini berarti bahwa Whitespace bahasa tidak diperbolehkan.
sumber
+
atau-
...+
,-
dan karakter tie breaker? ... atau apakah Anda perlu mengubah aturan lagi :-)Jawaban:
Perl (no +/-, tanpa tie-breaker, 29 karakter)
Sebagai bonus, Anda dapat membuat jumlah kode lebih dari dua angka dengan menambahkan lebih banyak
x
kes!!xx!
.Atau, berikut adalah dua solusi 21-char dengan masing-masing 1 dan 3 tie-breaker
Catatan: Solusi ini menggunakan
say
fungsi, tersedia sejak Perl 5.10.0 dengan-E
saklar baris perintah atau denganuse 5.010
. Lihat riwayat edit jawaban ini untuk versi yang bekerja pada perl yang lebih lama.Bagaimana solusi tanpa tie-breaker bekerja?
s!!xx!
adalah operator pengganti regexp , yang beroperasi secara default pada$_
variabel, yang menggantikan string kosong dengan stringxx
. (Biasanya/
digunakan sebagai pembatas regexp di Perl, tetapi benar-benar hampir semua karakter dapat digunakan. Saya memilih!
karena ini bukan tie-breaker.) Ini hanya cara mewah untuk membuat pronoming"xx"
ke$_
- atau, sejak$_
mulai kosong (tidak terdefinisi, sebenarnya), itu benar-benar cara untuk menulis$_ = "xx"
tanpa menggunakan tanda sama dengan (dan dengan satu karakter lebih sedikit, juga).s!x!$"x<>!eg
adalah pengganti regexp lain, kali ini menggantikan masing-masingx
di$_
dengan nilai ekspresi$" x <>
. (g
Sakelar menentukan penggantian global,e
menetapkan bahwa penggantian harus dievaluasi sebagai kode Perl alih-alih digunakan sebagai string literal.)$"
Adalah variabel khusus yang nilai default-nya adalah spasi tunggal; menggunakannya daripada" "
menyimpan satu char. (Variabel lain apa pun yang diketahui memiliki nilai satu karakter, seperti$&
atau$/
, akan bekerja dengan baik di sini, kecuali bahwa menggunakan$/
akan dikenakan biaya bagi saya sebagai pemutus hubungan.)The
<>
Operator baris masukan , dalam konteks skalar, membaca satu baris dari input standar dan kembali itu. Yangx
sebelumnya adalah operator pengulangan string Perl , dan benar-benar inti dari solusi ini: ia mengembalikan operan kirinya (karakter spasi tunggal) mengulangi berapa kali yang diberikan oleh operan kanannya (baris yang baru saja kita baca sebagai input).y!!!c
hanyalah cara yang tidak jelas untuk (ab) menggunakan operator transliterasi untuk menghitung karakter dalam string ($_
secara default, lagi). Saya bisa saja menulissay length
, tetapi versi yang dikaburkan adalah satu karakter lebih pendek. :)sumber
code-golf
dengan beberapa pembatasan sumber?R (24 karakter)
Apa yang dilakukan:
scan
membaca input dari STDIN (atau file)sequence
menghasilkan urutan integer mulai dari 1 dan menyatukan urutan. Misalnya,sequence(c(2, 3))
hasil dalam vektor1 2 1 2 3
length
menghitung jumlah elemen dalam vektor gabunganContoh 1:
Contoh 2:
sumber
D
sedikit memutar untuk menang
sebagai bonus, kode yang dikompilasi tidak mengandung operasi tambah (meskipun tidak dapat berbicara untuk panggilan readf)
sumber
Python 2, 43 byte
sumber
print sum(input(),input())
GolfScript
Tidak ada +/- atau tie-breaker:
Versi yang jauh lebih sederhana dengan dua karakter tie-breaker, menggunakan trik daftar-gabungan yang sama yang digunakan orang lain:
Saya berasumsi bahwa GolfScript tidak didiskualifikasi karena memiliki
)
operator tambahan, karena saya sebenarnya tidak menggunakannya.sumber
C (hanya 32bit)
Pointer aritmatika sama baiknya.
Bagaimana cocok dengan persyaratan?
* Tidak ada
+
atau-
* ada
/
,=
,.
,0
-9
* Hanya 3 pasang kurung, yang menurut saya minimal (Anda perlu
main
,scanf
,printf
).* Satu
*
(pendekatan pointer memerlukannya).* Empat
,
(bisa menyimpan satu dengan mendefinisikan variabel normal, bukanac,av
)sumber
C ++ 0 +/-, 3 tie-breaker
sumber
Haskell, 0 + 2
Ini tidak menggunakan
+
atau-
karakter, dan hanya dua=
dari set karakter pemutus dasi, salah satunya adalah wajib untuk mengikatmain
. Jumlahnya dilakukan dengan menggabungkan daftar panjang yang sesuai.sumber
Sunting Ini telah diposting SEBELUM aturan diubah untuk melarang
sum
...Bahasa R: Tidak ada panggilan ke
+
atau-
... Dan 9 karakter tie-breaker!Contoh:
The
[1] 579
adalah jawaban 579 (yang[1]
adalah untuk melacak di mana dalam vektor hasil Anda karena dalam R semua nilai-nilai vektor - dalam hal ini panjang 1)Perhatikan bahwa R memiliki
+
operator seperti kebanyakan bahasa - kebetulan bahwa Rsum
juga memiliki jumlah vektor.Dalam hal ini,
readLines
mengembalikan vektor string dengan panjang 2. Saya kemudian memaksa untuk numerik (ganda) dan jumlahkan ...Hanya untuk menunjukkan beberapa fitur R:
sumber
colSums
bukan ... Mungkin juga melarang "negasi-seperti fungsi" saat Anda di itu ...Bahasa R.
Aturan baru, jawaban baru, bahasa yang sama. Tidak ada panggilan ke
+
atau-
PEMBARUAN Menggunakan
scan
, itu turun menjadi 11 karakter tie-breaker (dan 27 karakter di semua).Asli: 13 karakter tie-breaker!
Contoh:
Kali ini hasilnya dicapai dengan perkalian matriks. Jawabannya ditampilkan sebagai matriks 1x1.
sumber
scan()
bukannyareadlines(n=2)
Haskell, 0
+
/-
,62 tie-breakers (=
)(tidak menggunakan trik penggabungan string / daftar)
sumber
Javascript, 56
Terima kasih kepada @ JiminP pada tip ~~! Aku akan untuk byte, jadi penghematan 1 byte pada p = prompt; masih sepadan. Saya mengerti argumen Anda tentang tie-breaker chars, tetapi jujur saja bukan Anda yang paling tidak byte :-p
Versi, 69
Berkat beberapa umpan balik dari @Ilmari dan @JiminP, saya telah mencukur 13 byte dari solusi asli saya.
Awalnya, 82
sumber
concat
dan memasukkan perhitunganalert
lebih pendek.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
BTW, saya tidak tahu bahwaArray(n)
mengembalikan array dengan panjangn
. Konsol Google Chrome memberi saya[]
dan saya pikir tidak ada ...p=prompt
itu tidak baik. Dan,parseInt(x)
hampir setara dengan~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 tie-breaker chars) PS. Saya bisa menggunakan ini sebagai entri saya, tetapi itu hanya memberi saya perasaan mencuri.C
sumber
APL (no +/-, tanpa pemutus dasi, 8 atau 10 karakter)
Entri ini mirip dengan yang lain yang merangkai urutan yang dihasilkan dari input dan menemukan panjangnya ... tapi itu di APL, yang dapat tampak membingungkan bahkan untuk masalah kecil seperti ini. Saya menggunakan Dyalog APL , yang menawarkan lisensi pendidikan gratis.
Kode:
Dari kanan ke kiri:
⎕
) meminta input dari pengguna dan mengevaluasinya.¨
) menerapkan fungsi generator indeks (⍳
) untuk setiap item dalam array di sebelah kanannya./
), yang melipat array menggunakan fungsi gabungan (,
). Demi tantangan ini, operator reduksi satu dimensi (⌿
) digunakan, bersama dengan operator gabungan sepanjang sumbu pertama (⍪
).⊃
) memberi kami konten dari array terlampir (kantong).⍴
) memberi kita panjang dimensi array. Dalam hal ini, kami memiliki array satu dimensi, jadi kami memperoleh jumlah item dalam array, yang merupakan hasil kami.Jika kita perlu secara eksplisit menampilkan hasilnya, kita dapat melakukannya seperti ini:
Kode Python yang sebanding, dengan simbol APL yang sesuai di atas:
Saya ingin tahu apakah ada versi yang lebih pendek mungkin dalam APL - lain, versi sederhana saya datang dengan yang memiliki lebih pemutus dasi (meskipun masih di 8 karakter) adalah:
⍴(⍳⎕),⍳⎕
.sumber
Saya tidak melihat ada yang melakukannya dengan cara Teknik Listrik, jadi inilah pendapat saya (dalam ruby):
Agak jelek, tapi itu menyelesaikan pekerjaan. Kedua nilai tersebut dibandingkan dengan bitwise
AND
. Jika mereka tidak memiliki bit yang sama, tidak ada "carry" ke kolom biner berikutnya, sehingga penambahan dapat diselesaikan dengan bitwise padaXOR
mereka. Jika ada carry, Anda harus menambahkan carry ke bitwiseXOR
. Inilah skrip ruby kecil yang saya gunakan untuk memastikan logika digital saya tidak terlalu berkarat:Tepuk tangan!
sumber
Seed ,
3904384611 byte, 0 + / -, 10 pemutus dasisumber
Shell, 52
Ini pada dasarnya jawaban yang sama yang saya berikan untuk masalah lain.
sumber
xargs -n1 jot | wc -l
yang mengambil-
pengurangan yang samaawk
tetapi saya tidak bisa melihat bagaimana cara menghindarinyaxargs
C
sumber
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
C #
Ini bukan yang terpendek oleh peregangan apa pun:
sumber
J,
157 karakter, 1 tie breaker, program tidak lengkapIni adalah usaha J saya. Ini bukan program lengkap, karena saya belum menemukan cara menulisnya. Cukup letakkan baris itu dalam skrip untuk mendapatkan fungsi
p
yang dapat digunakan untuk menambahkan jumlah angka yang berubah-ubah. Ini adalah monad dan membutuhkan daftar angka untuk ditambahkan (sepertip 1 2 3 4
):Idenya sangat sederhana. Fungsi ini ditulis dalam gaya tacit alias pointless. Berikut adalah definisi yang runcing:
Baca dari kanan ke kiri. Dalam versi diam-diam,
@
buat bagian-bagian fungsi. (seperti ∘ dalam matematika [(f∘g) (x) = f (g (x)])y
adalah parameter darip
.~
membuat kata kerja refleksif. Untuk beberapa kata kerjam
,m~ a
sama dengana m a
.#
(Salin,a#b
): Setiap elemen dalama
direplikasii
kali, di manai
elemen pada indeks yang sama dengan elemen saat inia
darib
. Dengan demikian,#~
mereplikasi waktu itemn
n
.#
(hitung,#b
): Menghitung jumlah elemen dalamb
.Kesimpulan: J adalah awsome dan kurang terbaca dari Perl (yang membuatnya lebih awsome)
Suntingan
#
sebagai gantinyai.
. Ya! Lebih sedikit karakter daripada skrip golf.Lebih banyak program
Yang ini meminta masukan, tetapi itu masih bukan program lengkap: (13 karakter, 3 pemutus)
sumber
Javascript (17 karakter pemutus)
: P ("Mengaburkan" untuk mengurangi jumlah karakter tie-breaker. Secara internal, itu
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
.)sumber
C #,
Program bekerja pada 1 baris; dipisahkan pada beberapa baris untuk menghindari pengguliran horizontal.
sumber
Clojure (44 karakter)
Sunting: diperbaiki untuk mencetak pada STDOUT bukan hanya mengembalikan jumlah.
sumber
Scala
Kode:
sumber
K, 11
Trik penggabungan yang sama dengan solusi R. Membaca dari kanan ke kiri: Menghitung dua variabel input, menyatukan dan kemudian menghitung.
sumber
PowerShell ,
2742 byte, 0+-
,41 sekunderBerkat mazzy karena telah menyimpan a
+
dan 4 sekunderCobalah online! atau Pretty Table untuk tambahan 3 byte
-Atau- menambahkan empat sekunder untuk menghemat 19 byte:
3223 byte,10+-
,125 detik-9 byte berkat mazzy
Cobalah online!
Untuk setiap argumen, kami mendorong
n
elemen array (terdiri dari[n]
tapi itu tidak penting) ke pipa yang dikelompokkan oleh parens dan kemudian dihitung.sumber
|fl
untuk format yang cantik. Cobalah secara online!Tong (SBCS on Keg wiki)
Pada dasarnya port jawaban R.
Penjelasan
sumber
05AB1E , 2
4byte, 0+
/-
Cobalah online!
Maaf jika saya salah memahami tantangan ini, tapi saya terkejut tidak ada jawaban 05AB1E. Jawaban terpendek dalam bahasa ini yang bisa saya gunakan yang tidak menggunakan + atau fungsi penjumlahan bawaan.
Penjelasan:
-2 Bytes terima kasih kepada Grimy.
sumber
Python 3
Tanpa mengandalkan penjumlahan tersembunyi di fungsi lain.
Cobalah online!
sumber
D
kali ini menggunakan panjang array
sumber