Суперечливі поліглоти


19

Ну, всі люблять поліглоти . Вам дадуть два цілих числа, у будь-якій стандартній формі введення (без жорсткого кодування). Ваше завдання - написати поліглот, який знаходить мінімальне значення мовою та максимальне значення між двома числами на іншій мові, та виконує такі операції:

  • Код, який знаходить максимальне значення, також повинен обчислити їх суму.
  • Програма, яка знаходить мінімальне значення, повинна також обчислити результат їх віднімання ( 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 чому це було?
Містер Xcoder

6
Я рекомендую тримати питання в пісочниці принаймні пару днів, щоб вони привертали достатньо уваги перед публікацією на головній. Я не став голосом.
Ерік Аутгольфер

Прокляття Бога, написав відповідь Py2 / Py3, і саме коли я збирався розмістити повідомлення, побачив це правило. 30 хвилин я ніколи не повернуся Хаха.
sagiksp

Відповіді:


6

05AB1E / желе , 21 20 байт

-1 байт після прохання про допомогу - дякую Емінья! ( `буде 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 ++ і хибне в C.

C - макс. Мова: спробуйте онлайн!

C ++ - хв. Мова: Спробуйте в Інтернеті!


2
Дуже розумне рішення. Мені подобається те, що жодних коментарів не використовували.
Містер Xcoder

5
Щоб зберегти кілька байтів, ви можете оголосити змінну auto c=.5, а потім використовувати cзамість sizeof'a'-1. У C auto c=.5оголошує цілу змінну з класом автоматичного зберігання (що є типовим), який потім ініціалізується на 0, тоді як у C ++ 11 він оголошує подвійний, який ініціалізується на 0,5. Таким чином, значення змінної буде триєшкою в C ++ та хибною у 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                      .#.ú,Ó÷ÓÍ.

Обидва визначають неназвану діадичну функцію.

Python (максимальна мова) бачить:

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

Тести як Python .

Желе (мінімальна мова) бачить:

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

Тести як желе .

Як?

Jelly інтерпретує 0x0a як ½, квадратний атом кореня, тоді як Python інтерпретує його як новий рядок. У Jelly 0x7f інтерпретується як розділення між ланками (функціями) і на його кодовій сторінці представлено або новою лінією, або стовпчиком. Для Jelly остання посилання є основною функцією - тут вона не викликає посилання вище (яке інтерпретатору все-таки потрібно правильно розібрати). У 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

Цікавий вибір мови
пан Xcoder

Майже напевно можливо комбінувати код Jelly з іншою мовою для гольфу, щоб зменшити кількість байтів.
Джонатан Аллан

Гм ... ваші фрагменти коду, схоже, відрізняються.
Ерік Аутгольфер

1
@EriktheOutgolfer ці кодові блоки є лише зображеннями необроблених байтів (звідси \x7fі \x04для недрукованих файлів у Python).
Джонатан Аллан

1
@JonathanAllan Ні, я маю на увазі, що ваші фрагменти справді різні. Просто перегляньте код Python для кожного з них.
Ерік Аутгольфер

8

Ruby / Python 3, 102 байти

Ruby повертає макс / суму, Python повертає хв / різницю. Вхід - це об'єкт масиву, зчитуваний з 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]])

Спробуйте в Інтернеті: Ruby

Спробуйте в Інтернеті: Python

Основна химерність 0, яка тут використовується, - це використання трибі в Рубі, що є фальшивим в Python. Інша річ, яку варто згадати, - це те, що sortфункція Python змінює список на місці і повертається None, тоді як Ruby не повертає відсортований масив, отже, необхідність використовувати 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 виводить min та різницю. Немає жодного виходу, якщо входи однакові.

Це мій перший поліглот і перший 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 є мовою max. Неодноразово просить ввести, двічі. Друкує найбільшу кількість вхідних чисел, а також суму найбільших та найменших чисел введення. Не робить 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 (макс. Мова):

Перейдіть на цей веб-сайт . Скопіюйте наступний код у їх текстовий редактор:

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, який підтримує структурований BASIC і 'як початковий коментар (мало хто робить це, хоча більшість робить)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.