Widersprüchliche Polyglots

19

Nun, jeder liebt Polyglots . Sie erhalten zwei Ganzzahlen in jeder Standardeingabeform (keine Hardcodierung). Ihre Aufgabe ist es, einen Polyglot zu schreiben, der den Minimalwert in einer Sprache und den Maximalwert zwischen den beiden Zahlen in der anderen Sprache findet und die folgenden Operationen ausführt:

  • Der Code, der den Maximalwert findet, muss auch deren Summe berechnen.
  • Das Programm, das den Minimalwert findet, muss auch das Ergebnis ihrer Subtraktion berechnen ( max - min)
  • Hier ist der "knifflige Teil" : Wenn die beiden Zahlen gleich sind, dürfen beide Programme nichts ausgeben / zurückgeben (sowohl zu STDOUTals auch zu STDERReiner anderen returnMethode).
  • Siehe die Spezifikationen Ausgabeabschnitt , um weitere Informationen über Formatierungs

Eingang

Wie oben angegeben, werden zwei Ganzzahlen als Eingabe in eine Standardmethode verwendet , die beiden Sprachen gemeinsam ist.

Ausgabespezifikationen

  • Für das Programm, das das findet max, sollte das Format sein:max_value, addition result
  • Für das Programm, das das findet min, sollte das Format seinmin_value, subtraction result (max - min)
  • Die Ergebnisse können mit jedem klaren Trennzeichen gedruckt werden ( , \n, ,oder was auch immer Sie wollen), aus der Funktion als String zurückgegeben , die beide erwarteten Werte mit Trennzeichen oder als eine Liste von Zahlen enthält (zB: [max_value,sum])

Beispiele:

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 

Wertung:

Dies ist . Versuchen Sie also, den kürzesten Code zu schreiben, um die gewünschten Ergebnisse zu erzielen. Beachten Sie dabei, dass Standard-Lücken strengstens verboten sind. Sie müssen zwei verschiedene Sprachen verwenden, keine anderen Versionen derselben Sprache (z. B .: Python 2- Python 3Paare sind ungültig)

Mr. Xcoder
quelle
@downvoter warum war das so?
Mr. Xcoder
6
Ich würde empfehlen, Fragen mindestens ein paar Tage in der Sandbox aufzubewahren, damit sie genügend Beachtung finden, bevor sie auf main gepostet werden. Ich habe nicht abgelehnt.
Erik der Outgolfer
Verdammt, schrieb eine Py2 / Py3-Antwort und gerade als ich etwas posten wollte, sah ich die Regel. 30 Minuten werde ich nie zurückkommen Haha.
sagiksp

Antworten:

6

05AB1E / Jelly , 21 20 Bytes

-1 Byte nachdem ich um Hilfe gebeten habe - danke Emigna! ( `wird push(uwrapped(pop())))

Rohe Bytes (der Dump rechts zeigt, was mein Windows-Computer anzeigt):

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

Beide nehmen Eingaben von STDIN entgegen und geben sie als Listendarstellung an STDOUT aus [x, y].

Die maximale Sprache ist 05AB1E:

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

Wo die nicht .druckbaren Bytes in der Codepage ( cp1252 ) dargestellt werden, und wahrscheinlich hier in dem, was Sie verwenden (0x18 = CANund 0x04 = EOT).

Probieren Sie die 05AB1E-Version aus

Die min Sprache ist Jelly:

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

Probieren Sie die Jelly-Version .

Wie?

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

Gelee:

`Ȯ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
Jonathan Allan
quelle
18

C und C ++ (gcc) 117 107 Bytes

-10 Bytes dank @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);}

Erläuterung: In C wird auto c=.5eine Ganzzahlvariable mit der automatischen Speicherklasse deklariert (dies ist der Standardwert), die dann auf 0 initialisiert wird, während in C ++ 11 ein double deklariert wird, das auf 0,5 initialisiert wird. Der Wert der Variablen ist in C ++ also wahr und in C falsch.

C - max Sprache: Probieren Sie es online!

C ++ - Min Sprache: Probieren Sie es online!

betseg
quelle
2
Sehr clevere Lösung. Mir gefällt die Tatsache, dass keine Kommentare verwendet wurden.
Mr. Xcoder
5
Um ein paar Bytes zu sparen, können Sie eine Variable deklarieren auto c=.5und dann canstelle von verwenden sizeof'a'-1. In C wird auto c=.5eine Ganzzahlvariable mit der automatischen Speicherklasse deklariert (dies ist die Standardeinstellung), die dann auf 0 initialisiert wird, während in C ++ 11 ein Double deklariert wird, das auf 0,5 initialisiert wird. Daher ist der Wert der Variablen in C ++ wahr und in C
falsch
9

Python 3 / Jelly , 42 Bytes

Verwenden von Jellys Codepage zum Codieren der Datei.

Rohe Bytes:

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

Beide definieren eine unbenannte dyadische Funktion.

Python (die maximale Sprache) sieht:

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

Testet als Python .

Jelly (die min Sprache) sieht:

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

Tests als Gelee .

Wie?

Jelly interpretiert 0x0a als ½das Quadratwurzelatom, während Python es als Newline interpretiert. In Jelly wird 0x7f als Trennung zwischen Verknüpfungen (Funktionen) interpretiert und in der Codepage entweder durch einen Zeilenvorschub oder einen Pfeil dargestellt. Für Jelly ist der letzte Link die Hauptfunktion - hier wird der obige Link nicht aufgerufen (den der Interpreter noch korrekt analysieren muss). Weist in Python 0x23 an, #dass alles, was dahinter und vor 0x0a steht, ein Kommentar ist.

Der Python-Code, der ausgeführt wird:

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

Der Jelly-Code, der ausgeführt wird:

«,ạẋạṠ¥ - 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
Jonathan Allan
quelle
Interessante Sprachauswahl
Mr. Xcoder
Es ist mit ziemlicher Sicherheit möglich, den Jelly-Code mit einer anderen Golfsprache zu kombinieren, um den Byte-Countdown zu erhalten.
Jonathan Allan
Ähm ... Ihre Code-Schnipsel scheinen anders zu sein.
Erik der Outgolfer
1
@EriktheOutgolfer diese Codeblöcke sind nur Darstellungen der unformatierten Bytes (daher die \x7fund \x04für die nicht druckbaren in der Python-Version).
Jonathan Allan
1
@ JonathanAllan Nein, ich meine, deine Schnipsel sind wirklich anders. Sehen Sie sich einfach den Python-Code für jeden an.
Erik der Outgolfer
8

Ruby / Python 3, 102 Bytes

Ruby gibt max / sum zurück, Python gibt min / difference zurück. Input ist ein Array-Objekt, das aus STDIN gelesen wird.

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]])

Probieren Sie es online aus: Ruby

Probieren Sie es online aus: Python

Die Hauptsprache, die hier verwendet wird, ist die Verwendung der Wahrheit 0in Ruby, die in Python falsch ist. Die andere erwähnenswerte Sache ist, dass die Python- sortFunktion die Liste direkt modifiziert und zurückgibt None, während Ruby's das sortierte Array nicht zurückgibt und es daher benötigt b or a, um die min / max-Werte zu erhalten.

Python 3 ist erforderlich, da sich Python 2 beschwert, wenn Sie versuchen, printnach der orAnweisung in der letzten Zeile aufzurufen .

Wert Tinte
quelle
Das ist schlau! +1
Arjun
4

Java / AWK , 219 217 212 196 Bytes

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

Probieren Sie es online!

Java gibt das Maximum und die Summe aus, AWK gibt das Minimum und die Differenz aus. Keine Ausgabe für beide, wenn die Eingaben identisch sind.

Dies ist meine erste polyglotte und erste TIO :)

Robert Benson
quelle
3

JavaScript (ES6) / QBasic, 172 171 Bytes

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

Basierend auf dieser Lösung von mir eine ähnliche Frage.

Auch diese Lösung nutzt den Kommentar-Ansatz!

JavaScript ist die Min-Sprache. Es wird ein Array mit Zahlen als Eingabe verwendet. Gibt zwei durch getrennte Zahlen aus ,(1. Zahl ist der kleinste Wert des Eingabearrays und 2. Zahl ist die Differenz zwischen dem größten und dem kleinsten Wert des Eingabearrays), indem alert()Sie Tut alert()nichts, wenn die Zahlen gleich sind. Sie können die Funktion wie folgt aufrufen f([100,40]).

QBasic ist die Max-Sprache. Fordert zweimal wiederholt zur Eingabe auf. Druckt die größte Anzahl der Eingabenummern sowie die Summe der größten und kleinsten Zahlen der Eingabe. Tut PRINTnichts, wenn die Zahlen gleich sind.


Wie funktioniert es?

Markiert in QBasic (eine Sprache der strukturierten BASIC-Familie, für die keine Zeilennummern erforderlich sind) 'den Anfang eines Kommentars, der bis zum Ende der Zeile reicht. In JavaScript markiert es den Anfang einer Zeichenfolge. Die gesamte erste Zeile ist in QBasic als Kommentar markiert, in JavaScript wird die Zeile jedoch ausgeführt (und diese Zeile enthält den JavaScript-Teil, der die kleinste Zahl und den Unterschied zwischen der größten und der kleinsten Zahl berechnet, sowie ein /*am Ende Hiermit wird ein Kommentar gestartet, um den Rest des QBasic-Codes vor dem JavaScript-Interpreter zu verbergen.)

Der Code von der zweiten bis zur vorletzten Zeile enthält den QBasic-Code zur Berechnung der größten Zahl und der Summe der größten und kleinsten Zahl (der Code ist sehr selbsterklärend).

Die letzte Zeile enthält '*/. 'bewirkt, dass der QBasic-Interpreter den folgenden Code als Kommentar interpretiert, während er in JavaScript keine Auswirkungen hat, da er Teil eines Kommentars ist (der am Ende der ersten Zeile gestartet wurde). Der folgende Code ( */) bewirkt, dass JavaScript den in der ersten Zeile gestarteten Kommentar beendet. Er wird jedoch in QBasic nicht ausgeführt, da QBasic denkt, dass er Teil eines Kommentars ist.


Testfälle

JavaScript (min-language):

'';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 (max-language):

Gehe zu dieser Website . Kopieren Sie den folgenden Code und fügen Sie ihn in den Texteditor ein:

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

Der Grund, warum Zeilennummern erforderlich sind, ist, dass die von mir erwähnte Website nur unstrukturierte BASIC-Sprachen unterstützt. Und diese Website ist der einzige anständige Online-BASIC-Interpreter, den ich finden konnte. Das Ausführen des Codes am Anfang des Posts (der Code ohne Zeilennummern) sollte jedoch in jedem guten QBasic-Interpreter, der strukturierte BASIC- und -Dateien unterstützt, problemlos funktionieren' als Kommentar-Starter gut funktionieren (nur wenige tun dies, die meisten jedoch nicht).

Arjun
quelle