รูปหลายเหลี่ยมที่ขัดแย้ง


19

ดีทุกคนรักpolyglots คุณจะได้รับจำนวนเต็มสองจำนวนในรูปแบบอินพุตมาตรฐานใด ๆ (ไม่มีการเข้ารหัส) งานของคุณคือการเขียนหลายภาษาที่ค้นหาค่าต่ำสุดในภาษาและค่าสูงสุดระหว่างตัวเลขสองในภาษาอื่นและดำเนินการดังต่อไปนี้:

  • รหัสที่ค้นหาค่าสูงสุดจะต้องคำนวณผลรวมของพวกเขาด้วย
  • โปรแกรมที่ค้นหาค่าต่ำสุดจะต้องคำนวณผลลัพธ์ของการลบ ( max - min)
  • นี่คือ "ส่วนที่ยุ่งยาก" : หากตัวเลขสองตัวเท่ากันโปรแกรมทั้งสองจะต้องไม่แสดงผล / ส่งคืนสิ่งใด (ทั้งไป STDOUTและSTDERRหรือreturnวิธีอื่นใด)
  • ดูรายละเอียดเพิ่มเติมในส่วนข้อมูลจำเพาะเกี่ยวกับการจัดรูปแบบ

อินพุต

ตามที่ระบุไว้ข้างต้นจำนวนเต็มสองจำนวนที่ใช้เป็นอินพุตในวิธีมาตรฐานใด ๆซึ่งใช้ร่วมกับทั้งสองภาษา

รายละเอียดผลลัพธ์

  • สำหรับโปรแกรมที่ค้นหาmaxรูปแบบควรเป็น:max_value, addition result
  • สำหรับโปรแกรมที่ค้นหาminรูปแบบควรเป็นmin_value, subtraction result (max - min)
  • ผลที่ได้สามารถพิมพ์ด้วยตัวคั่นที่ชัดเจนใด ๆ ( , \n, ,หรือสิ่งอื่นที่คุณต้องการ) กลับมาจากฟังก์ชั่นเป็นสตริงที่มีค่าทั้งสองคาดว่าจะมีตัวคั่นหรือเป็นรายการตัวเลข (เช่น[max_value,sum])

ตัวอย่าง:

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 

เกณฑ์การให้คะแนน:

นี่คือดังนั้นพยายามเขียนรหัสสั้นที่สุดเพื่อให้ได้ผลลัพธ์ที่ต้องการในขณะที่รับทราบว่าช่องโหว่มาตรฐานไม่ได้รับอนุญาตอย่างเคร่งครัด คุณต้องใช้ภาษาที่แตกต่างกันสองภาษาไม่ใช่ภาษาเดียวกันรุ่นอื่น (เช่น: Python 2- Python 3คู่ไม่ถูกต้อง)


@downvoter ทำไมถึงเป็นเช่นนั้น
Mr. Xcoder

6
ฉันขอแนะนำให้เก็บคำถามไว้ในกล่องทรายอย่างน้อยสองสามวันเพื่อให้พวกเขาได้รับความสนใจมากพอก่อนโพสต์บนหน้าหลัก ฉันไม่ได้ลงคะแนน
Erik the Outgolfer

Goddammit เขียนคำตอบ Py2 / Py3 และเช่นเดียวกับที่ฉันกำลังจะโพสต์เห็นกฎ 30 นาทีฉันจะไม่กลับมาหาฮ่าฮ่า
sagiksp

คำตอบ:


6

05AB1E / Jelly , 21 20 bytes

-1 ไบต์หลังจากขอความช่วยเหลือ - ขอบคุณ Emigna! ( `จะpush(uwrapped(pop())))

ไบต์ดิบ (การถ่ายโอนข้อมูลทางด้านขวาแสดงให้เห็นว่าเครื่อง Windows ของฉันแสดงผลอย่างไร):

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

ทั้งใช้ข้อมูลจาก STDIN และส่งออกไปยัง STDOUT [x, y]เป็นตัวแทนรายการ

ภาษาสูงสุดคือ 05AB1E:

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

ตำแหน่งที่.เป็นตัวแทนของไบต์ที่ไม่สามารถพิมพ์ได้ในมันเพจรหัส ( cp1252 ) และอาจอยู่ที่นี่ในสิ่งที่คุณใช้ (0x18 = CANและ 0x04 = EOT)

ลองรุ่น 05AB1E

ภาษาขั้นต่ำคือเยลลี่:

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

ลองรุ่น Jelly

อย่างไร?

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

เยลลี่:

`Ȯ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 และ C ++ (gcc), 117 107 ไบต์

-10 ไบต์ขอบคุณ @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);}

คำอธิบาย:ใน C auto c=.5ประกาศตัวแปรจำนวนเต็มด้วยคลาสที่เก็บข้อมูลอัตโนมัติ (ซึ่งเป็นค่าเริ่มต้น) ซึ่งจะถูกเตรียมใช้งานแล้วเป็น 0 ในขณะที่ใน C ++ 11 จะประกาศเป็นสองเท่าซึ่งจะเริ่มต้นได้ถึง 0.5 ดังนั้นค่าของตัวแปรจะเป็นจริงใน C ++ และ falsy ใน C

C - ภาษาสูงสุด: ลองออนไลน์!

ภาษา C ++ - min: ลองออนไลน์!


2
ทางออกที่ฉลาดมาก ฉันชอบความจริงที่ว่าไม่มีการแสดงความคิดเห็น
Mr. Xcoder

5
บันทึกไม่กี่ไบต์คุณสามารถประกาศตัวแปรauto c=.5และจากนั้นใช้แทนc sizeof'a'-1ใน C auto c=.5ประกาศตัวแปรจำนวนเต็มด้วยคลาสหน่วยเก็บข้อมูลอัตโนมัติ (ซึ่งเป็นค่าเริ่มต้น) ซึ่งจะถูกเตรียมใช้งานเป็น 0 ในขณะที่ใน C ++ 11 จะประกาศคู่ซึ่งเริ่มต้นได้ถึง 0.5 ดังนั้นค่าของตัวแปรจะเป็นจริงใน C ++ และ falsy ใน C
Steadybox

9

Python 3 / Jelly , 42 ไบต์

การใช้โค้ดเพจของ Jelly เพื่อเข้ารหัสไฟล์

ไบต์ดิบ:

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

ทั้งสองกำหนดฟังก์ชัน dyadic ที่ไม่มีชื่อ

Python (ภาษาสูงสุด) เห็น:

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

การทดสอบเป็นงูหลาม

เยลลี่ (ภาษาขั้นต่ำ) เห็น:

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

การทดสอบเป็นวุ้น

อย่างไร?

เยลลี่ตีความ 0x0a เป็น½อะตอมสแควร์รูทในขณะที่ไพ ธ อนตีความว่าเป็นบรรทัดใหม่ ใน Jelly 0x7f ถูกตีความว่าเป็นการแยกระหว่างลิงก์ (ฟังก์ชั่น) และแสดงโดยขึ้นบรรทัดใหม่หรือ pilcrow ในเพจรหัส สำหรับเยลลี่ลิงก์สุดท้ายคือฟังก์ชั่นหลัก - ที่นี่จะไม่เรียกลิงก์ด้านบน (ซึ่งล่ามยังคงต้องแยกวิเคราะห์อย่างถูกต้อง) ใน Python 0x23 #แนะนำว่าอะไรก็ตามหลังจากนั้นและก่อนหน้า 0x0a ขึ้นบรรทัดใหม่คือความคิดเห็น

รหัส Python ที่ถูกเรียกใช้:

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

รหัส Jelly ที่ถูกดำเนินการ:

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

ตัวเลือกภาษาที่น่าสนใจ
Mr. Xcoder

เป็นไปได้ที่จะรวมรหัส Jelly กับภาษากอล์ฟอื่นเพื่อให้นับไบต์
Jonathan Allan

อืม ... ตัวอย่างรหัสของคุณแตกต่างออกไป
Erik the Outgolfer

1
@EriktheOutgolfer บล็อคโค้ดเหล่านี้เป็นเพียงการนำเสนอของไบต์ดิบ (ดังนั้น\x7fและ\x04สำหรับ unprintables ใน Python หนึ่ง)
Jonathan Allan

1
@JanathanAllan ไม่ฉันหมายความว่าตัวอย่างของคุณนั้นแตกต่างออกไปจริงๆ เพียงดูรหัส Python สำหรับแต่ละอัน
Erik the Outgolfer

8

Ruby / Python 3, 102 ไบต์

Ruby ส่งคืนค่าสูงสุด / ผลรวม Python คืนค่า min / difference อินพุตเป็นวัตถุอาร์เรย์อ่านจาก 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]])

ลองใช้งานออนไลน์: ทับทิม

ลองใช้งานออนไลน์: Python

การเล่นโวหารหลักที่ใช้ที่นี่คือการใช้ความจริง0ในทับทิมซึ่งเป็นเท็จในงูหลาม สิ่งที่ควรค่าแก่การกล่าวถึงก็คือsortฟังก์ชั่นของ Python จะแก้ไขรายการในสถานที่และส่งคืนNoneในขณะที่ Ruby's ไม่ได้และส่งกลับอาร์เรย์ที่เรียงลำดับดังนั้นจำเป็นต้องใช้b or aเพื่อรับ min / max

จำเป็นต้องใช้ Python 3 เนื่องจาก Python 2 บ่นว่าคุณพยายามโทรหาprintหลังจากorข้อความสั่งในบรรทัดสุดท้าย


นั่นฉลาด! +1
อาร์จัน

4

Java / AWK , 219 217 212 196 ไบต์

/*#\/* /
{$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));}}

ลองออนไลน์!

Java ส่งออกค่าสูงสุดและผลรวม AWK ส่งผลให้เกิดความแตกต่างขั้นต่ำ ไม่มีเอาต์พุตสำหรับทั้งอินพุตหากเหมือนกัน

นี่คือพูดได้หลายภาษาแรกของฉันและเป็นครั้งแรก TIO :)


3

JavaScript (ES6) / QBasic, 172 171 ไบต์

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

ตามวิธีการแก้ปัญหาของฉันของคำถามคล้ายกันนี้

วิธีนี้ใช้วิธีการแสดงความคิดเห็นด้วยเช่นกัน!

JavaScript เป็นภาษาขั้นต่ำ มันใช้เวลาในอาร์เรย์ที่มีตัวเลขเป็นอินพุต เอาท์พุทสองตัวเลขคั่นด้วย,(หมายเลขที่ 1 คือค่าที่น้อยที่สุดของอินพุต - อาเรย์และหมายเลขที่ 2 คือความแตกต่างของค่าที่ยิ่งใหญ่ที่สุดและค่าที่น้อยที่สุดของอินพุทอาเรย์) โดยalert()ing ไม่ทำalert()อะไรเลยถ้าตัวเลขเท่ากัน f([100,40])คุณสามารถเรียกฟังก์ชั่นเช่น

QBasic เป็นภาษาสูงสุด ขอข้อมูลซ้ำ ๆ สองครั้ง พิมพ์จำนวนอินพุตที่ใหญ่ที่สุดรวมถึงผลรวมของตัวเลขที่ใหญ่ที่สุดและเล็กที่สุดของอินพุต ไม่ทำPRINTอะไรเลยถ้าตัวเลขเท่ากัน


มันทำงานยังไง?

ใน QBasic (ภาษาของตระกูล BASIC ที่มีโครงสร้างไม่จำเป็นต้องใช้หมายเลขบรรทัด) 'ทำเครื่องหมายจุดเริ่มต้นของความคิดเห็นที่ไปจนถึงจุดสิ้นสุดของบรรทัด ในขณะที่ JavaScript มันเป็นจุดเริ่มต้นของสตริง ดังนั้นบรรทัดแรกทั้งหมดจะถูกทำเครื่องหมายเป็นความคิดเห็นใน QBasic แต่ใน JavaScript บรรทัดจะถูกดำเนินการ (และบรรทัดนี้มีส่วน JavaScript ที่คำนวณจำนวนที่เล็กที่สุดและความแตกต่างของจำนวนที่มากที่สุดและน้อยที่สุดรวมถึง/*ที่ส่วนท้าย ซึ่งเริ่มความคิดเห็นเพื่อซ่อนรหัส QBasic ที่เหลือจากล่าม JavaScript)

รหัสจากบรรทัดที่สองถึงบรรทัดสุดท้ายมีรหัส QBasic เพื่อคำนวณจำนวนที่ยิ่งใหญ่ที่สุดและผลรวมของจำนวนที่มากที่สุดและน้อยที่สุด (รหัสนั้นอธิบายได้ด้วยตนเอง)

'*/บรรทัดสุดท้ายมี 'ทำให้ล่าม QBasic เพื่อแปลรหัสต่อไปนี้เป็นความคิดเห็นในขณะที่ JavaScript มันไม่ได้มีผลกระทบใด ๆ เพราะมันเป็นส่วนหนึ่งของความคิดเห็น (ซึ่งเริ่มต้นที่ปลายบรรทัดแรก) รหัสต่อไปนี้ ( */) ทำให้ JavaScript สิ้นสุดความคิดเห็นซึ่งเริ่มต้นในบรรทัดแรก แต่ไม่ได้ดำเนินการใน QBasic เพราะ QBasic คิดว่าเป็นส่วนหนึ่งของความคิดเห็น


กรณีทดสอบ

JavaScript (ภาษาขั้นต่ำ):

'';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 (ภาษาสูงสุด):

ไปที่เว็บไซต์นี้ คัดลอกวางรหัสต่อไปนี้ใน text-editor:

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

เหตุผลที่ต้องใช้หมายเลขบรรทัดคือเว็บไซต์ที่ฉันกล่าวถึงรองรับเฉพาะภาษา BASIC ที่ไม่มีโครงสร้าง และเว็บไซต์นั้นเป็นล่าม BASIC ออนไลน์ที่ดีที่ฉันสามารถหาได้ อย่างไรก็ตามการเรียกใช้โค้ดที่แสดงอยู่ด้านบนของโพสต์ (โค้ดที่ไม่มีหมายเลขบรรทัด) ควรทำงานได้ดีในล่าม QBasic ที่ดีที่สนับสนุนโครงสร้างแบบพื้นฐานและ'เป็นความคิดเห็นเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.