Polyglots mâu thuẫn


19

Vâng, tất cả mọi người yêu thích Polyglots . Bạn sẽ được cung cấp hai số nguyên, ở bất kỳ dạng đầu vào tiêu chuẩn nào (không mã hóa cứng). Nhiệm vụ của bạn là viết một polyglot tìm giá trị tối thiểu trong một ngôn ngữ và giá trị tối đa giữa hai số trong ngôn ngữ kia và thực hiện các thao tác sau:

  • Mã tìm giá trị tối đa cũng phải tính tổng của chúng.
  • Chương trình tìm giá trị tối thiểu cũng phải tính kết quả của phép trừ ( max - min)
  • Đây là "phần khó" : Nếu hai số bằng nhau, cả hai chương trình không được xuất / trả lại bất cứ thứ gì (cả hai STDOUTSTDERRbất kỳ returnphương thức nào khác )
  • Xem phần Thông số kỹ thuật đầu ra để biết thêm chi tiết về định dạng

Đầu vào

Như đã nêu ở trên, hai số nguyên được lấy làm đầu vào trong bất kỳ phương thức tiêu chuẩn nào , chung cho cả hai ngôn ngữ.

Thông số kỹ thuật đầu ra

  • Đối với chương trình tìm thấy max, định dạng phải là:max_value, addition result
  • Đối với chương trình tìm thấy min, định dạng phải làmin_value, subtraction result (max - min)
  • Kết quả có thể được in, với bất kỳ dấu phân cách rõ ràng ( , \n, ,hoặc bất cứ điều gì khác mà bạn muốn), trở về từ các chức năng như một chuỗi chứa hai giá trị mong đợi với một dấu phân cách hoặc là một danh sách các số (ví dụ: [max_value,sum])

Ví dụ:

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 

Ghi điểm:

Đây là , vì vậy hãy cố gắng viết mã ngắn nhất để có kết quả mong muốn, đồng thời lưu ý rằng Lỗ hổng tiêu chuẩn không được phép. Bạn phải sử dụng hai ngôn ngữ khác nhau, không phải các phiên bản khác của cùng một ngôn ngữ (ví dụ: Python 2- Python 3các cặp không hợp lệ)


@downvoter tại sao vậy?
Ông Xcoder

6
Tôi khuyên bạn nên giữ câu hỏi tại hộp cát trong ít nhất một vài ngày để chúng có đủ sự chú ý trước khi đăng lên chính. Tôi đã không downvote.
Erik the Outgolfer

Goddammit, đã viết một câu trả lời Py2 / Py3 và ngay khi tôi chuẩn bị đăng bài đã thấy quy tắc. 30 phút tôi sẽ không bao giờ lấy lại Haha.
sagiksp

Câu trả lời:


6

05AB1E / Jelly , 21 20 byte

-1 byte sau khi yêu cầu một số trợ giúp - cảm ơn Emigna! ( `sẽ push(uwrapped(pop())))

Các byte thô (kết xuất bên phải hiển thị những gì máy Windows của tôi hiển thị):

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

Cả hai đều lấy đầu vào từ STDIN và đầu ra cho STDOUT làm đại diện danh sách [x, y].

Ngôn ngữ tối đa là 05AB1E:

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

Trường hợp .đại diện cho các byte không thể in được trong codepage ( cp1252 ) và có thể ở đây trong bất cứ điều gì bạn đang sử dụng (0x18 = CANvà 0x04 = EOT).

Hãy thử phiên bản 05AB1E

Ngôn ngữ tối thiểu là Jelly:

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

Hãy thử phiên bản Jelly .

Làm sao?

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

Thạch:

`Ȯ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 và C ++ (gcc), 117 107 byte

-10 byte nhờ @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);}

Giải thích: Trong C, auto c=.5khai báo một biến số nguyên với lớp lưu trữ tự động (là mặc định), sau đó được khởi tạo thành 0, trong khi trong C ++ 11, nó khai báo gấp đôi, được khởi tạo là 0,5. Vì vậy, giá trị của biến sẽ là trung thực trong C ++ và sai lệch trong C.

C - ngôn ngữ tối đa: Hãy thử trực tuyến!

C ++ - ngôn ngữ tối thiểu: Hãy thử trực tuyến!


2
Giải pháp rất thông minh. Tôi thích thực tế là không có ý kiến ​​đã được sử dụng.
Ông Xcoder

5
Để lưu một vài byte, bạn có thể khai báo một biến auto c=.5và sau đó sử dụng cthay vì sizeof'a'-1. Trong C, auto c=.5khai báo một biến số nguyên với lớp lưu trữ tự động (là mặc định), sau đó được khởi tạo thành 0, trong khi trong C ++ 11, nó khai báo gấp đôi, được khởi tạo là 0,5. Vì vậy, giá trị của biến sẽ là trung thực trong C ++ và
giả mạo

9

Python 3 / Jelly , 42 byte

Sử dụng trang mã của Jelly để mã hóa tệp.

Byte thô:

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                      .#.ú,Ó÷ÓÍ.

Cả hai đều xác định một chức năng dyadic không tên.

Python (ngôn ngữ tối đa) thấy:

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

Thử nghiệm như Python .

Jelly (ngôn ngữ tối thiểu) thấy:

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

Thử nghiệm như Jelly .

Làm sao?

Jelly diễn giải 0x0a là ½, nguyên tử căn bậc hai trong khi Python diễn giải nó như một dòng mới. Trong Jelly 0x7f được hiểu là sự tách biệt giữa các liên kết (chức năng) và được thể hiện bằng một dòng mới hoặc một người hành hương trong bộ mã của nó. Đối với Jelly, liên kết cuối cùng là chức năng chính - ở đây nó không gọi liên kết ở trên (mà trình thông dịch vẫn cần phải phân tích chính xác). Trong Python 0x23, #hướng dẫn rằng mọi thứ nằm sau nó và trước 0x0a, một dòng mới, là một nhận xét.

Mã Python được thực thi:

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

Mã Jelly được thực thi:

«,ạẋạṠ¥ - 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

Lựa chọn ngôn ngữ thú vị
Ông Xcoder

Gần như chắc chắn có thể kết hợp mã Jelly với một ngôn ngữ chơi gôn khác để đếm ngược byte.
Jonathan Allan

Umm ... đoạn mã của bạn có vẻ khác nhau.
Erik the Outgolfer

1
@EriktheOutgolfer các khối mã đó chỉ là biểu diễn của các byte thô (do đó \x7f\x04không thể in được trong Python).
Jonathan Allan

1
@Jonathan ALLan Không, ý tôi là đoạn trích của bạn thực sự khác biệt. Chỉ cần xem mã Python cho mỗi một.
Erik the Outgolfer

8

Ruby / Python 3, 102 byte

Ruby trả về max / sum, Python trả về min / chênh lệch. Đầu vào là một đối tượng mảng được đọc từ 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]])

Dùng thử trực tuyến: Ruby

Dùng thử trực tuyến: Python

Cách giải quyết chính được sử dụng ở đây là việc sử dụng tính trung thực 0trong Ruby, đó là giả mạo trong Python. Một điều đáng nói nữa là sorthàm của Python sửa đổi danh sách tại chỗ và trả về None, trong khi Ruby không và trả về mảng đã sắp xếp, do đó cần phải sử dụng b or ađể lấy min / max.

Python 3 là bắt buộc vì Python 2 phàn nàn nếu bạn cố gắng gọi printsau orcâu lệnh ở dòng cuối cùng.


Thật khéo léo! +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));}}

Hãy thử trực tuyến!

Java xuất tối đa và tổng, AWK xuất tối thiểu và chênh lệch. Không có đầu ra cho cả hai nếu đầu vào là giống hệt nhau.

Đây là polyglot đầu tiên và TIO đầu tiên của tôi :)


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
'*/

Dựa trên giải pháp này của tôi về một câu hỏi tương tự .

Giải pháp này cũng sử dụng phương pháp bình luận!

JavaScript là ngôn ngữ tối thiểu. Nó nhận trong một mảng chứa các số làm đầu vào. Đầu ra hai số cách nhau bởi ,(số thứ nhất là giá trị nhỏ nhất của mảng đầu vào và số thứ 2 là sự khác biệt của giá trị lớn nhất và nhỏ nhất của mảng đầu vào) bằng alert()ing. Không có alert()gì nếu các số bằng nhau. Bạn có thể gọi hàm như thế nào f([100,40]).

QBasic là ngôn ngữ tối đa. Liên tục yêu cầu đầu vào, hai lần. In số lượng lớn nhất của các số đầu vào cũng như tổng các số lớn nhất và nhỏ nhất của đầu vào. Không có PRINTgì nếu các số bằng nhau.


Làm thế nào nó hoạt động?

Trong QBasic (ngôn ngữ của họ BASIC có cấu trúc; nó không yêu cầu số dòng), 'đánh dấu sự bắt đầu của một nhận xét kéo dài đến cuối dòng. Trong khi đó trong JavaScript, nó đánh dấu sự bắt đầu của một chuỗi. Vì vậy, toàn bộ dòng đầu tiên được đánh dấu là một nhận xét trong QBasic nhưng trong JavaScript, dòng này được thực thi (và dòng này chứa phần JavaScript tính toán số nhỏ nhất và sự khác biệt của số lớn nhất và nhỏ nhất, cũng như /*ở cuối bắt đầu một nhận xét để ẩn phần còn lại của mã QBasic khỏi trình thông dịch JavaScript.)

Mã từ dòng thứ hai đến dòng thứ hai chứa mã QBasic để tính số lớn nhất và tổng của số lớn nhất và nhỏ nhất (mã rất tự giải thích).

Dòng cuối cùng chứa '*/. 'làm cho trình thông dịch QBasic diễn giải đoạn mã sau dưới dạng một nhận xét, trong khi đó trong JavaScript, nó không có bất kỳ tác dụng nào vì nó là một phần của một nhận xét (được bắt đầu ở cuối dòng đầu tiên). Đoạn mã sau ( */) khiến JavaScript kết thúc nhận xét được bắt đầu ở dòng đầu tiên, nhưng nó không được thực thi trong QBasic vì QBasic cho rằng đó là một phần của nhận xét.


Các trường hợp thử nghiệm

JavaScript (ngôn ngữ tối thiểu):

'';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 (ngôn ngữ tối đa):

Tới trang web này . Sao chép dán đoạn mã sau vào trình soạn thảo văn bản của họ:

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 '*/

Lý do tại sao số dòng được yêu cầu là trang web tôi đã đề cập chỉ hỗ trợ các ngôn ngữ BASIC không có cấu trúc. Và trang web đó là trình thông dịch BASIC trực tuyến duy nhất tôi có thể tìm thấy. Tuy nhiên, việc chạy mã hiện diện ở đầu bài (mã không có số dòng) sẽ hoạt động tốt trong mọi trình thông dịch QBasic tốt hỗ trợ BASIC có cấu trúc và 'như một trình khởi động bình luận (mặc dù vậy, hầu hết không làm như vậy)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.