Plus atau minus polyglots!


14

Kiriman Anda harus mengambil daftar angka (dalam format daftar apa pun yang didukung bahasa Anda, atau menggunakan beberapa fungsi / parameter baris perintah) atau serangkaian angka yang dipisahkan oleh karakter apa pun yang tidak 0123456789. Dalam satu bahasa, ia harus menambahkan semuanya dan menampilkan jumlahnya. Dalam bahasa lain, itu harus output mereka dikurangi satu sama lain secara berurutan. Contoh:

12
5
7
2

Dalam satu bahasa, itu harus output 26, dan dalam bahasa lain itu harus output -2. Perhatikan bahwa semua angka yang dimasukkan akan bilangan bulat positif kurang dari 100. Tidak akan pernah ada lebih dari 20angka yang diberikan, sehingga Anda tidak akan pernah menghasilkan lebih dari 2000atau kurang dari -1899. Ada pertanyaan? Komentar dibawah!


Apakah membuntuti spasi putih di output diizinkan?
Business Cat

Apakah dua versi berbeda dari bahasa yang sama diperbolehkan? Lihat Python 2/3 Jawaban oleh HyperNeutrino
Mr. Xcoder

@ Mr.Xcoder diizinkan.
programmer5000

2
@ BetaDecay Anda pikir itu masalah, lihat kode-golf!
programmer5000

1
@ programmer5000 Maksud Anda [code-golf] -[polyglot]?
Erik the Outgolfer

Jawaban:


14

Jelly / 05AB1E , 3 byte

00000000: c6 71 53                                         .qS

Ini adalah hexdump (xxd) dari program yang dikirimkan.

Cobalah online!

Jelly: Jumlah

Jelly menggunakan halaman kode Jelly , sehingga ia melihat karakter berikut.

İqS

Cobalah online!

Bagaimana itu bekerja

İqS  Main link. Argument: A (array)

İ    (ignored)
 q   Unrecognized token. This breaks the link; nothing to the left is executed.
  S  Take the sum of A.

05AB1E: Perbedaan

05AB1E menggunakan Windows-1252 , jadi ia melihat karakter berikut.

ÆqS

Cobalah online!

Bagaimana itu bekerja

Æ     Take the difference of the input.
 q    Quit.
  S   (ignored)

22

Python 2/3, 52 byte

lambda l:sum(l[:1]+[x*int(1-(1/2)*4)for x in l[1:]])

int(1-(1/2)*4)kembali 1dalam Python 2 karena 1/2mengevaluasi dulu 0, lalu 0 * 4 = 0.

int(1-(1/2)*4)kembali -1dalam Python 3 karena 1/2mengevaluasi dulu 0.5, lalu int(0.5 * 4) = int(2.0) = 2.


1
Apakah menggunakan bahasa yang sama, bahkan dengan versi lain diizinkan?
Tn. Xcoder

3
@ Mr.Xcoder Saya tidak mengerti mengapa tidak, saya telah melihat bahasa lain menggunakan versi C, Java, Python, dan Befunge yang berbeda. Saya akan bertanya pada meta atau melihat apakah saya dapat menemukan posting meta terkait.
HyperNeutrino

Namun, penggunaan trik matematika yang baik karena perubahan versi.
Tn. Xcoder

1
@ Mr.Xcoder Terima kasih! Saya telah mengajukan pertanyaan tentang meta di sini ; Mudah-mudahan saya mendapat jawaban segera.
HyperNeutrino

1
@ programmer5000 divisi Integer.
HyperNeutrino

14

C dan C ++ (keduanya dari GCC), 81 75 73 byte

int c;int f(int*a,int l){auto d=.5;c=*a++;for(;--l;a++)c+=*a-4*d**a;c=c;}

Membawa pointer ke array dan panjang.

Penjelasan: masih menggunakan penjelasan @Steadybox ': p Dalam C, auto d=.5mendeklarasikan variabel integer dengan kelas penyimpanan otomatis (yang merupakan default), yang kemudian diinisialisasi ke 0, sedangkan dalam C ++ 11 menyatakan double, yang diinisialisasi ke 0,5.

Bahasa C - plus: Coba online!

C ++ - minus bahasa: Cobalah online!


11

05AB1E / Jelly , 5 byte

00000000: 4f71 7f5f 2f                             Oq._/

Cobalah online! (05AB1E)
Cobalah online! (Jeli)

05AB1E melihat :

Oq? _ /
Penjelasan:

Oq? _ / 1 argumen implisit.
O Ambil jumlah item input pertama.
 q Berhenti.
  ? _ / Tidak fungsional.

Jelly melihat :

Oq
_ /
Penjelasan:

_ / Tautan utama. Argumen: z
_ / Kurangi elemen-elemen z secara berurutan.

Tautan Bantuan Oq. Tidak fungsional.

Apakah ini menggunakan codepage Jelly?
programmer5000

@ programmer5000 Ini adalah bytestream mentah yang menggunakan CP-1252 untuk 05AB1E dan JELLY untuk Jelly. Karena itu 7f.
Erik the Outgolfer

Oh, tidak menyadari itu!
programmer5000

8

Sebenarnya / Jelly , 4 byte

00000000: e4 81 5f 2f                                      .._/

Ini adalah hexdump (xxd) dari program yang dikirimkan. Itu tidak dapat diuji dalam bentuk mentah online; TIO tidak mendukung pengkodean CP437.

Sebenarnya: Sum

Sebenarnya menggunakan CP 437 , jadi itu melihat karakter berikut.

Σü_/

Cobalah online!

Bagaimana itu bekerja

Σ     Take the sum on the input.
 ü    Print and empty the stack.
  _   Natural logarithm. Ignored since the stack is empty.
   /  Float division. Ignored since the stack is empty.

Jelly: Perbedaan

Jelly menggunakan halaman kode Jelly , sehingga ia melihat karakter berikut.

ỵ¹_/

Cobalah online!

Bagaimana itu bekerja

ỵ¹_/  Main link. Argument: A (array)

ỵ     Unrecognized token. Splits the link.
 ¹    Identity; yield A.
  _/  Reduce (/) A by subtraction (_).

Saya membacanya sebagai actually, Jelly.:)
programmer5000

Anda menyalahgunakan fakta bahwa karakter yang tidak jelas bertindak seperti :)
Erik the Outgolfer

1
@EriktheOutgolfer Kurang lebih. Sejujurnya, saya tidak yakin apa yang dilakukan token yang tidak dikenal.
Dennis

Setelah dipikir-pikir, saya pikir Anda baru saja memilih Sebenarnya hanya karena telah üditetapkan ke fungsi yang sempurna> _>
Erik the Outgolfer

@ programmer5000 Ini jelly, actually.
Arjun


7

CJam / Jelly , 6 byte

q~:-
S

CJam

q~    e# Read a list from input
:-    e# Reduce by subtraction
S     e# Push a space
      e# Implicit output

Cobalah online!

Jeli

(menggunakan UTF-8, bukan halaman kode Jelly)

q~:-adalah tautan pembantu. Karena tidak dipanggil, itu benar-benar tidak peduli apa fungsinya. Smenghitung jumlah array.

Cobalah online!


5
Jam dan Jelly. Masuk akal untuk menggunakan dua hal serupa bersamaan.
mbomb007

1
Ini tidak valid. Jelly memiliki 0x7f untuk baris baru, ini memiliki 0x0a untuk baris baru. Dalam Jelly, ini sebenarnya sama dengan q~:-½S. Sayangnya, perbaikan ( q~:-e#\x7fS) lebih besar. Cobalah online! (CJam) dan Coba online! , masing-masing dengan encoding sendiri untuk menguji sendiri.
Erik the Outgolfer

2
Sebagai alternatif, Anda dapat menggunakan pengkodean UTF-8 untuk Jelly, yang menjadikan ini valid seperti saat ini, tetapi harap sebutkan.
Erik the Outgolfer

5

JavaScript / Cubix, 36 byte

//.!v+u;$I^@O<.Iu
a=>eval(a.join`-`)

Cobalah!

Fungsi JavaScript dapat diuji menggunakan cuplikan di bawah ini, program Cubix dapat diuji di sini .

Bagaimana cara kerjanya?

JavaScript

Baris pertama adalah komentar baris untuk JavaScript, karena dimulai dengan dua garis miring, jadi JavaScript hanya melihat garis bawah ( a=>eval(a.join`-`)), yang menggunakan array sebagai input, bergabung dengan tanda minus di antara, dan kemudian menjalankannya sebagai kode, menghasilkan pengurangan semua elemen dalam array.

let f=
//.!v+u;$I^@O<.Iu
a=>eval(a.join`-`)

console.log(f([1,2,3,4,5]))
console.log(f([3,1,4,1,5]))

Cubix

Cubix melihat kubus berikut (perhatikan bahwa Cubix mengabaikan semua spasi putih):

      / / .
      ! v +
      u ; $
I ^ @ O < . I u a = > e
v a l ( a . j o i n ` -
` ) . . . . . . . . . .
      . . .
      . . .
      . . .

Awal mula

IP dimulai pada baris ketiga, menunjuk ke timur. Itu hits 'I'perintah, yang mengambil nomor dari input, dan mendorongnya ke tumpukan. Kemudian, diarahkan '^'ke sum-loop.

Jumlah loop

Saya menghapus semua karakter bukan bagian dari jumlah loop, dan menggantinya dengan no-ops ( '.'). IP awalnya tiba di baris kedua, menunjuk ke timur.

      . . .
      ! v +
      u ; $
. . . . . . I u . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Pertama, '!'perintah memeriksa elemen atas. Jika itu 0(yaitu kita telah mencapai akhir input), instruksi selanjutnya ( 'v') dijalankan, yang mencerminkan IP dari loop. Jika kami belum mencapai akhir input, kami menambahkan dua item teratas bersamaan ( '+', item kedua adalah jumlah hingga titik itu, item teratas input baru). Kemudian, IP membungkus ke wajah lain dari kubus, ke dalam 'u'karakter, yang menyebabkan IP untuk berbelok-u, dan menjalankan 'I'perintah (baca integer input lain), sambil menunjuk ke utara. IP membungkus kembali ke wajah atas, melompati ( '$') instruksi hapus ( ';') dan melakukan putaran u lainnya, kembali ke titik di mana kita mulai.

Tamat

Jika IP tercermin dari loop, karakter berikut dieksekusi:

      . . .
      . v .
      . ; .
. . @ O < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Instruksi-instruksi ini menghapus elemen atas (yang nol), dan kemudian menampilkan elemen atas (jumlahnya) sebagai bilangan bulat. Kemudian '@'perintah tercapai, sehingga program berakhir.


4

Python 2 dan 3, 33 byte

lambda l,*r:l+sum(r)*(1/2>0 or-1)

Mengambil input sebagai parameter terpisah.


Python 2.
Python 3.


lambda l,*r:l+sum(r)*(1/2-.5)*2untuk 31 byte
ovs

@ovs saya sengaja menghindari mengembalikan pelampung. Jika Anda diizinkan, maka *(1/2*4-1)byte lebih kecil dari milik Anda.
Veedrac

Saya pikir tipe pengembalian tidak terlalu penting asalkan nilainya benar
Ov

4

JS (ES6), CGL (CGL Golfing Language) , 32 26 byte

 x=>eval(x.join`-`)
//-⨥

JS melakukan pengurangan dan CGL melakukan penambahan.

JS:

x=>eval(x.join`-`)

Fungsi anonim yang mengurangi setiap elemen dalam array menggunakan Array#reduce.

//-⨥

Komentar.

CGL

 x=>eval(x.join`-`)

Apa yang tampak seperti spasi di baris pertama sebenarnya adalah ruang yang tidak melanggar, komentar di CGL. Baris pertama diabaikan.

//-⨥

Itu /tidak melakukan apa-apa. The -decrements stack pointer saat ini sehingga menunjuk ke masukan. menambahkan tumpukan saat ini (input) bersama-sama, mendorongnya ke tumpukan berikutnya, dan menambah tumpukan saat ini. Secara implisit dihasilkan.


1
Anda dapat mempersingkat versi JS dengan menggunakan x=>eval(x.join`-`), menghemat 5B
Luke


@ Adm, kamu benar. Tetap.
programmer5000

4

JavaScript (ES6) / QBasic, 84 83 byte

'';f=x=>eval(x.join`+`)/*
INPUT a
FOR i=1 TO 2
i=0
INPUT n
a=a-n
PRINT a
NEXT i
'*/

Solusi lain dengan hack komentar!

JavaScript menghitung jumlahnya. Dibutuhkan dalam array yang berisi angka sebagai input. Output sebagai fungsi return. Anda dapat memanggil fungsi sepertialert(f([10,20,30])) .

QBasic menghitung perbedaannya. Berkali-kali meminta input. Segera setelah Anda memasukkan nilai, itu menghasilkan perbedaan dari semua angka yang Anda masukkan sampai waktu memukul Enterdan lagi meminta input. Terus melakukan hal yang sama hingga akhir segalanya.


Bagaimana cara kerjanya?

Dalam QBasic (bahasa keluarga BASIC terstruktur; tidak memerlukan nomor baris), ' menandai awal dari komentar yang berlangsung sampai akhir baris. Sedangkan dalam JavaScript, ini menandai dimulainya string. Jadi, seluruh baris pertama ditandai sebagai komentar di QBasic tetapi dalam JavaScript, baris dieksekusi (dan baris ini berisi bagian JavaScript yang menambahkan angka serta /*pada bagian akhir yang memulai komentar untuk menyembunyikan sisanya) kode QBasic dari penerjemah JavaScript.)

Kode dari baris kedua ke baris kedua terakhir berisi kode QBasic untuk menghitung perbedaan semua nomor input (kode ini sangat jelas).

Baris terakhir berisi '*/.'menyebabkan juru bahasa QBasic untuk menafsirkan kode berikut sebagai komentar, sedangkan dalam JavaScript, itu tidak memiliki efek apa pun karena merupakan bagian dari komentar (yang dimulai pada akhir baris pertama). Kode berikut ( */) menyebabkan JavaScript untuk mengakhiri komentar yang dimulai pada baris pertama, tetapi tidak dieksekusi dalam QBasic karena QBasic menganggapnya sebagai bagian dari komentar.


Uji Kasus

JavaScript (menambahkan):

'';f=x=>eval(x.join`+`);/*
INPUT a
FOR i=1 TO 2
i=0
INPUT n
a=a-n
PRINT a
NEXT i
'*/
console.log(f([12,5,7,2]));

QBasic (kurangi):

Pergi ke situs web ini . Salin tempel kode berikut dalam editor teks mereka:

1 '';f=x=>eval(x.join`+`);/*
2 INPUT a
3 FOR i=1 TO 2
4 i=0
5 INPUT n
6 a=a-n
7 PRINT a
8 NEXT i
9 '*/

Alasan mengapa nomor baris diperlukan adalah bahwa situs web yang saya sebutkan hanya mendukung bahasa BASIC yang tidak terstruktur. Dan situs web itu adalah satu-satunya penerjemah BASIC online yang layak yang dapat saya temukan. Namun, menjalankan kode yang ada di bagian atas posting (kode tanpa nomor baris) harus berfungsi dengan baik dalam setiap juru bahasa QBasic yang baik yang mendukung BASIC terstruktur dan' sebagai starter-komentar (beberapa tidak, sebagian melakukannya, sebagian besar melakukannya).


Catatan

  • Ini adalah pertama saya posting ! Saya harap ini bagus!
  • Bagian QBasic dari kode tidak memerlukan ENDkarena penerjemah tidak akan pernah mencapainya! (Ini akan selamanya terjebak dalam infinite loop; selalu meminta lebih banyak input.)

3

Brain-Flak / Brain-Flueue , 20 byte

({}<([({{}})]){}>{})

Cobalah online! (Brain-Flak) (plus)

Cobalah online! (Brain-Flueue) (minus)

Penjelasan

Satu-satunya perbedaan antara Brain-Flak dan Brain-Flueue adalah Brain-Flueue menggantikan dua tumpukan (last in first out) yang digunakan di Brain-Flak dengan dua antrian (first in first out). Secara alami program ini menggunakan perbedaan ini.

Kode Beranotasi

(                  ) Push the sum of...
 {}                   the first input,
   <            >     zero,
                 {}   the remaining sum (see below)
    ([      ])       Push the of below line
      ({{}})         Pop all the input sans first, push the sum
              {}     Pop (in Brain-Flak, this discards the negative sum,
                            in Brain-Flueue, the positive)
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.