Poliglot Kontradiktif


19

Yah, semua orang suka Polyglots . Anda akan diberikan dua bilangan bulat, dalam bentuk input standar apa pun (tanpa hardcoding). Tugas Anda adalah menulis polyglot yang menemukan nilai minimum dalam bahasa dan nilai maksimum antara dua angka dalam bahasa lain, dan melakukan operasi berikut:

  • Kode yang menemukan nilai maksimum juga harus menghitung jumlahnya.
  • Program yang menemukan nilai minimum juga harus menghitung hasil pengurangannya ( max - min)
  • Inilah "bagian rumit" : Jika kedua angka sama, kedua program tidak boleh mengeluarkan / mengembalikan apa pun (baik ke STDOUTdan STDERRatau returnmetode lainnya )
  • Lihat bagian Spesifikasi spesifikasi untuk detail lebih lanjut tentang pemformatan

Memasukkan

Seperti yang dinyatakan di atas, dua bilangan bulat diambil sebagai input dalam metode standar apa pun , umum untuk kedua bahasa.

Spesifikasi keluaran

  • Untuk program yang menemukan max, formatnya harus:max_value, addition result
  • Untuk program yang menemukan min, formatnya harusmin_value, subtraction result (max - min)
  • Hasil dapat dicetak, dengan pembatas yang jelas ( , \n, ,atau apapun yang Anda inginkan), kembali dari fungsi sebagai string yang berisi dua nilai yang diharapkan dengan pembatas atau sebagai daftar nomor (misalnya: [max_value,sum])

Contoh:

Input   || Max Language Output || Min Language Output

100, 40 || 100, 140            || 40, 60
63, 67  || 67, 130             || 63, 4
-45, -5 || -5, -50             || -45, 40
21, 21  ||                     ||
-1, 1   || 1, 0                || -1, 2 

Mencetak:

Ini adalah , jadi cobalah menulis kode terpendek untuk mendapatkan hasil yang diinginkan, sambil memperhatikan bahwa Standard Loopholes dilarang keras. Anda harus menggunakan dua bahasa berbeda, bukan versi lain dari bahasa yang sama (mis:: Python 2- Python 3pasangan tidak valid)


@ Downvoter mengapa begitu?
Tn. Xcoder

6
Saya akan merekomendasikan menyimpan pertanyaan di kotak pasir setidaknya selama beberapa hari sehingga mereka mendapatkan perhatian yang cukup sebelum memposting di utama. Saya tidak downvote.
Erik the Outgolfer

Sialan, menulis jawaban Py2 / Py3 dan tepat ketika saya akan posting melihat aturan. 30 menit saya tidak akan pernah kembali Haha.
sagiksp

Jawaban:


6

05AB1E / Jelly , 21 20 byte

-1 byte setelah meminta bantuan - terima kasih Emigna! ( `akan push(uwrapped(pop())))

Byte mentah (dump di sebelah kanan menunjukkan apa yang ditampilkan oleh mesin Windows saya):

60 ca 69 b9 5a 73 4f 29 71 93 18 fa 2c d3 f7 d3    `Êi¹ZsO)q..ú,Ó÷Ó
cd 04 18 2f                                         Í../

Keduanya mengambil input dari STDIN dan output ke STDOUT sebagai representasi daftar [x, y].

Bahasa maks adalah 05AB1E:

`Êi¹ZsO)q“.ú,Ó÷ÓÍ../

Di mana .byte mewakili yang tidak dapat dicetak dalam codepage itu ( cp1252 ), dan mungkin di sini dalam apa pun yang Anda gunakan (0x18 = CANdan 0x04 = EOT).

Coba versi 05AB1E

Bahasa min adalah Jelly:

İ__iỤZs0)qƓð«,ạẋạṠ¥ð/

Coba versi Jelly .

Bagaimana?

05AB1E:

`Êi¹ZsO)q“.ú,Ó÷ÓÍ../ - parsed left to right, executed as parsed
                     - implicit input taken
  i                  - If:
`                    -     push(unwrapped(pop()))
 Ê                   -     push(pop()!=pop())
                     - ...Then:
   ¹                 -     push(1st item from input history)
    Z                -     push(max(top of stack))
     s               -     push(reverse(pop(),pop()))
      O              -     push(sum(pop()))
       )             -     wrap(pop())
        q            -     quit - implicit print of top of stack
         “.ú,Ó÷ÓÍ../ - unexecuted and unparsed string

Jeli:

`ȮiỤZs0)qƓð«,ạẋạṠ¥ð/ - parsed left to right, not executed until parsed
`ȮiỤZs0              - a dyadic chain which would error if executed (monad from dyad, index of, grade up, transpose, split into chunks of length 0)
       )q            - currently unassigned code points each currently creates a new link
         Ɠ           - read and evaluate a line of input
          ð       ð  - dyadic chain separations
                   / - reduce by:
           «         -     minimum(left, right)
             ạ       -     absolute difference(left, right)
            ,        -     pair(result)
                 ¥   -     last two links as a dyad:
               ạ     -         absolute difference(left, right)
                Ṡ    -         sign(result) (i.e. {0:0, +x:1, -x:-1} but -x never happens)
              ẋ      -     repeat list left right times
                     - implicit print

18

C dan C ++ (gcc), 117 107 byte

-10 byte berkat @Steadybox!

#include<stdio.h>
int f(int a,int b){auto c=.5;a-b&&printf("%d %d",c?b<a?b:a:a>b?a:b,c?a-b>0?a-b:b-a:a+b);}

Penjelasan: Dalam C, auto c=.5mendeklarasikan variabel integer dengan kelas penyimpanan otomatis (yang merupakan default), yang kemudian diinisialisasi ke 0, sedangkan dalam C ++ 11 menyatakan variabel ganda, yang diinisialisasi ke 0,5. Jadi nilai variabel akan benar dalam C ++ dan falsy dalam C.

Bahasa C - maks: Cobalah online!

C ++ - bahasa min: Cobalah online!


2
Solusi yang sangat cerdas. Saya suka fakta bahwa tidak ada komentar yang digunakan.
Tn. Xcoder

5
Untuk menyimpan beberapa byte, Anda bisa mendeklarasikan variabel auto c=.5, lalu gunakan csebagai gantinya sizeof'a'-1. Dalam C, auto c=.5mendeklarasikan variabel integer dengan kelas penyimpanan otomatis (yang merupakan default), yang kemudian diinisialisasi ke 0, sedangkan dalam C ++ 11 menyatakan ganda, yang diinisialisasi ke 0,5. Jadi nilai variabel akan benar dalam C ++ dan falsy dalam C.
Steadybox

9

Python 3 / Jelly , 42 byte

Menggunakan halaman kode Jelly untuk menyandikan file.

Byte mentah:

6c 61 6d 62 64 61 20 78 2c 79 3a 5b 6d 61 78 28    lambda x,y:[max(
78 2c 79 29 2c 78 2b 79 5d 2a 28 78 21 3d 79 29    x,y),x+y]*(x!=y)
0a 23 7f fa 2c d3 f7 d3 cd 04                      .#.ú,Ó÷ÓÍ.

Keduanya mendefinisikan fungsi diad yang tidak disebutkan namanya.

Python (bahasa maks) melihat:

lambda x,y:[max(x,y),x+y]*(x!=y)
#\x7fú,Ó÷ÓÍ\x04

Tes sebagai Python .

Jelly (bahasa min) melihat:

lambda x,y:[max(x,y),x+y]*(x!=y)½#
«,ạẋạṠ¥

Tes sebagai Jelly .

Bagaimana?

Jelly mengartikan 0x0a sebagai ½, atom akar kuadrat sementara Python mengartikannya sebagai baris baru. Dalam Jelly 0x7f diartikan sebagai pemisahan antara tautan (fungsi) dan diwakili oleh baris baru atau pilcrow dalam codepage itu. Untuk Jelly, tautan terakhir adalah fungsi utama - di sini ia tidak memanggil tautan di atas (yang penerjemah masih perlu menguraikan dengan benar). Dalam Python 0x23, #menginstruksikan bahwa apa pun setelahnya dan sebelum 0x0a, baris baru, adalah komentar.

Kode Python yang dijalankan:

lambda x,y:[max(x,y),x+y]*(x!=y)
lambda x,y:                      - A function taking two inputs, x and y
           [        ,   ]        - A list with two items
            max(x,y)             - take the maximum of x and y
                     x+y         - x plus y
                           x!=y  - x not equal to y?
                         *(    ) - multiply - True is treated as if it were 1, False as if it were 0

Kode Jelly yang dijalankan:

«,ạẋạṠ¥ - A dyadic link (function of two variables): x, y
«       - minimum(x, y)
  ạ     - absolute difference(x, y)
 ,      - pair left with right (creating a list)
      ¥ - last two links as a dyad:
     ạ  -     absolute difference(x, y)
    Ṡ   -     sign(result) (i.e. {0:0, +x:1, -x:-1} but -x never happens)
   ẋ    - repeat the list to the left right times (either the same list or an empty list)
        - return the result

Pilihan bahasa yang menarik
Tn. Xcoder

Hampir bisa dipastikan untuk menggabungkan kode Jelly dengan bahasa golf lainnya untuk menghitung mundur byte.
Jonathan Allan

Umm ... cuplikan kode Anda tampaknya berbeda.
Erik the Outgolfer

1
@EriktheOutgolfer blok kode tersebut hanyalah representasi dari byte mentah (karenanya \x7fdan \x04untuk unsintables dalam Python one).
Jonathan Allan

1
@ JonathanAllan Tidak, maksud saya cuplikan Anda benar-benar berbeda. Lihat saja kode Python untuk masing-masing kode.
Erik the Outgolfer

8

Ruby / Python 3, 102 byte

Ruby mengembalikan max / sum, Python mengembalikan min / perbedaan. Input adalah objek array yang dibaca dari STDIN.

a=eval((0and gets or input()))
b=a.sort()
x,y=(b or a)
z=0 or 1
x==y or print([[y,x][z],[x+y,y-x][z]])

Cobalah online: Ruby

Cobalah online: Python

Kekhasan utama yang digunakan di sini adalah penggunaan kebenaran 0di Ruby, yang palsu dalam Python. Hal lain yang layak disebutkan adalah bahwa sortfungsi Python memodifikasi daftar di tempat dan mengembalikan None, sementara Ruby tidak dan mengembalikan array yang diurutkan, maka perlu digunakan b or auntuk mendapatkan min / maks.

Python 3 diperlukan karena Python 2 mengeluh jika Anda mencoba memanggil printsetelah orpernyataan di baris terakhir.


Itu pintar! +1
Arjun

4

Java / AWK , 219 217 212 196 byte

/*#\/* /
{$0=((x=$1)<y=$2)?x" "y-x:y" "x-y}x!=y
#*/interface B{static void main(String[]A){Integer x=Integer.parseInt(A[0]);int y=x.parseInt(A[1]);System.out.print(x==y?"":(x<y?y:x)+" "+(x+y));}}

Cobalah online!

Java menghasilkan max dan sum, AWK menghasilkan min dan selisih. Tidak ada output untuk keduanya jika inputnya identik.

Ini adalah polyglot pertama saya dan TIO pertama saya :)


3

JavaScript (ES6) / QBasic, 172 171 byte

'';f=x=>{m=Math.max(...x);s=Math.min(...x);if(x[0]!=x[1])alert([m,m-s])}/*
INPUT c
LET m=c
LET s=c
INPUT n
IF n>c THEN m=n
IF n<c THEN s=n
IF n<>c THEN PRINT m,m+s
END
'*/

Berdasarkan solusi saya ini, pertanyaan serupa .

Solusi ini juga menggunakan pendekatan komentar!

JavaScript adalah bahasa min. Dibutuhkan dalam array yang berisi angka sebagai input. Menghasilkan dua angka yang dipisahkan oleh ,(angka 1 adalah nilai terkecil dari array-input dan angka ke-2 adalah perbedaan dari nilai-nilai terbesar dan terkecil dari array-input) dengan alert()ing. Tidak alert()apa - apa jika angkanya sama. Anda dapat memanggil fungsi seperti f([100,40]).

QBasic adalah bahasa maks. Berkali-kali meminta input, dua kali. Mencetak jumlah terbesar dari input-angka serta jumlah input terbesar dan terkecil. Tidak PRINTapa - apa jika angkanya sama.


Bagaimana cara kerjanya?

Dalam QBasic (bahasa keluarga BASIC terstruktur; itu 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 menghitung angka terkecil dan perbedaan angka terbesar dan terkecil, serta /*di akhir yang memulai komentar untuk menyembunyikan sisa kode QBasic dari penerjemah JavaScript.)

Kode dari baris kedua ke baris kedua terakhir berisi kode QBasic untuk menghitung angka terbesar dan jumlah angka terbesar dan terkecil (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 (min-bahasa):

'';f=x=>{m=Math.max(...x);s=Math.min(...x);if(x[0]!=x[1])alert([m,m-s])}/*
INPUT c
LET m=c
LET s=c
INPUT n
IF n>c THEN m=n
IF n<c THEN s=n
IF n<>c THEN PRINT m,m+s
END
'*/

f([100,40]);

QBasic (maks-bahasa):

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

1 '';f=x=>{m=Math.max(...x);s=Math.min(...x);if(x[0]!=x[1])alert([m,m-s])}/*
2 INPUT c
3 LET m=c
4 LET s=c
5 INPUT n
6 IF n>c THEN m=n
7 IF n<c THEN s=n
8 IF n<>c THEN PRINT m,m+s
9 END
10 '*/

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, kebanyakan melakukannya, kebanyakan)

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.