Çelişkili Polyglotlar


19

Herkes Polyglot'ları sever . Herhangi bir standart girdi biçiminde (sabit kodlama olmadan) size iki tam sayı verilecektir. Göreviniz bir dilde minimum değeri ve diğer dilde iki sayı arasındaki maksimum değeri bulan ve aşağıdaki işlemleri gerçekleştiren bir çokglot yazmaktır :

  • Maksimum değeri bulan kod da toplamlarını hesaplamalıdır.
  • Minimum değeri bulan program çıkarma işlemlerinin sonucunu da hesaplamalıdır ( max - min)
  • İşte "zor bölüm" : İki sayı eşitse, her iki program da hiçbir şey çıktılamamalı / döndürmemelidir (hem STDOUTve hem de STDERRbaşka bir returnyöntem)
  • Biçimlendirme hakkında daha fazla bilgi için Çıktı özellikleri bölümüne bakın

Giriş

Yukarıda belirtildiği gibi, her iki dilde ortak olan herhangi bir standart yöntemde girdi olarak alınan iki tamsayı .

Çıktı özellikleri

  • 'İ bulan program maxiçin format şu şekilde olmalıdır:max_value, addition result
  • Bulan program için min, biçimmin_value, subtraction result (max - min)
  • Sonuçlar net bir sınırlayıcı (ile basılabilir , \n, ,sınırlayıcı veya numaralarının listesi olarak iki beklenen değerleri içeren bir dize olarak işlevinden döndürülen veya başka ne istediğiniz) (örn: [max_value,sum])

Örnekler:

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 

puanlama:

Bu , bu yüzden Standart Loopholes kesinlikle izin verilmediğini not ederken, istenen sonuçları almak için en kısa kodu yazmaya çalışın . Aynı dilin diğer sürümlerini değil, iki farklı dil kullanmalısınız (örneğin: Python 2- Python 3çiftleri geçerli değil)


@downvoter neden böyle oldu?
Bay Xcoder

6
Soruları en az birkaç gün boyunca sanal alanda tutmanızı tavsiye ederim. Ben inmedim.
Erik Outgolfer

Goddammit, bir Py2 / Py3 cevabı yazdı ve aynen post etmek üzereyken kuralı gördüm. 30 dakika asla geri dönmeyeceğim Haha.
sagiksp

Yanıtlar:


6

05AB1E / Jelly , 21 20 bayt

Biraz yardım istedikten sonra -1 bayt - teşekkürler Emigna! ( `olacak push(uwrapped(pop())))

Ham bayt (sağdaki döküm Windows makinemin gösterdiklerini gösterir):

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

Her ikisi de STDIN'den girdi alır ve liste temsili olarak STDOUT'a çıkar [x, y].

Maksimum dil 05AB1E'dir:

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

Burada .temsil edilemeyen baytları kod sayfasında ( cp1252 ) ve muhtemelen burada ne kullanırsanız kullanın (0x18 = CANve 0x04 = EOT).

05AB1E sürümünü deneyin

Min dili Jelly'dir:

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

Jelly sürümünü deneyin .

Nasıl?

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

Jöle:

`Ȯ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 ve C ++ (gcc), 117107 bayt

@Steadybox sayesinde -10 bayt!

#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);}

Açıklama: C'de, auto c=.5otomatik depolama sınıfıyla (varsayılan olan) bir tamsayı değişkeni bildirir; bu, daha sonra 0 olarak başlatılırken, C ++ 11'de 0,5 olarak başlatılan bir çift bildirir. Yani değişkenin değeri C ++ 'da doğruluk ve C de falsili olacaktır.

C - maksimum dil: Çevrimiçi deneyin!

Min dil: Çevrimiçi deneyin!


2
Çok akıllı bir çözüm. Hiçbir yorum kullanılmamış olması hoşuma gidiyor.
Bay Xcoder

5
Birkaç bayt kaydetmek için bir değişken bildirebilir auto c=.5ve sonra cyerine kullanabilirsiniz sizeof'a'-1. C'de, auto c=.5otomatik depolama sınıfıyla (varsayılan olan) bir tamsayı değişkeni bildirir; bu, daha sonra 0 olarak başlatılırken, C ++ 11'de 0,5 olarak başlatılan bir çift bildirir. Yani değişkenin değeri C ++ 'da doğruluk ve C de falsili olacaktır.
Steadybox

9

Python 3 / Jelly , 42 bayt

Jelly kullanma kod sayfasını dosyasını kodlamak için.

Ham bayt:

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

Her ikisi de adlandırılmamış bir ikili işlevi tanımlar.

Python (maksimum dil) şunları görür:

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

Python olarak test eder .

Jelly (min dili) görür:

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

Jelly olarak test eder .

Nasıl?

Jelly ½, 0x0a'yı kare kök atomu olarak yorumlarken Python onu bir satırsonu olarak yorumlar. Jelly'de 0x7f, bağlantılar (fonksiyonlar) arasında bir ayrım olarak yorumlanır ve kod sayfasında bir satırsonu veya bir satırla temsil edilir. Jelly için son bağlantı ana işlevdir - burada yukarıdaki bağlantıyı çağırmaz (yorumlayıcının hala doğru ayrıştırması gerekir). Python #0x23'te, ondan sonraki ve yeni satır olan 0x0a'dan önceki her şeyin bir yorum olduğunu söyler.

Yürütülen Python kodu:

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

Yürütülen Jelly kodu:

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

İlginç dil seçimi
Bay Xcoder

Bayt geri sayımını elde etmek için Jelly kodunu başka bir golf dili ile birleştirmek neredeyse kesinlikle mümkündür.
Jonathan Allan

Hımm ... kod snippet'leriniz farklı görünüyor.
Outgolfer Erik

1
@EriktheOutgolfer bu kod blokları ham bayt (dolayısıyla sadece temsilidir \x7fve \x04Python birinde unprintables için).
Jonathan Allan

1
@JonathanAllan Hayır, yani snippet'leriniz gerçekten farklı. Her biri için Python koduna bakın.
Erik the Outgolfer

8

Ruby / Python 3, 102 bayt

Ruby max / sum, Python min / fark döndürür. Girdi, STDIN'den okunan bir dizi nesnesidir.

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

Çevrimiçi deneyin: Ruby

Çevrimiçi deneyin: Python

Burada kullanılan ana 0tuhaflık, Python'da sahte olan Ruby'deki gerçeğin kullanılmasıdır. Bahsetmeye değer diğer bir şey ise, Python'un sortişlevinin listeyi yerinde değiştirip geri döndüğü None, Ruby'nin sıralanan diziyi vermediği ve döndürdüğü b or aiçin min / maks almak için kullanılması gerektiğidir.

Python 3 gereklidir, çünkü son satırdaki ifadeden printsonra aramaya çalışırsanız Python 2 şikayet eder or.


Zekice! +1
Arjun

4

Java / AWK , 219 217 212 196 bayt

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

Çevrimiçi deneyin!

Java, maks ve toplamı, AWK çıkışları min ve farkı verir. Girişler aynıysa, çıkış yok.

Bu benim ilk çok dilli ve ilk TIO'm :)


3

JavaScript (ES6) / QBasic, 172 171 bayt

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

Benzer bir sorusunun bu çözümüne dayanarak .

Bu çözüm de yorum yaklaşımını kullanıyor!

JavaScript en küçük dildir. Girdi olarak sayı içeren bir dizi alır. İki sayıyı birbirinden ayırarak çıkarır ,(1. sayı giriş dizisinin en küçük değeri ve 2. sayı giriş dizisinin en büyük ve en küçük değerlerinin farkıdır) alert(). alert()Sayılar eşitse hiçbir şey yapmaz . İşlevi aşağıdaki gibi çağırabilirsiniz f([100,40]).

QBasic maksimum dildir. Arka arkaya iki kez giriş ister. Giriş sayılarının en büyük sayısını ve girişin en büyük ve en küçük sayılarının toplamını yazdırır. PRINTSayılar eşitse hiçbir şey yapmaz .


O nasıl çalışır?

QBasic'te (yapılandırılmış BASIC ailesinin bir dili; satır numaraları gerektirmez), 'satırın sonuna kadar olan bir yorumun başlangıcını işaretler. Oysa JavaScript'te bir dizenin başlangıcını işaretler. Yani, bütün ilk satırı QBasic içinde ama JavaScript bir yorum olarak işaretlenir, hat yürütülür (ve bu hat en küçük sayı ve en büyük ve en küçük sayıların farkı, aynı zamanda iyi tanımlanmış hesaplar JavaScript bölümünü içeren /*sonunda QBasic kodunun geri kalanını JavaScript yorumlayıcısından gizlemek için bir yorum başlatır.)

İkinci satırdan ikinci son satıra kadar olan kod, en büyük sayıyı ve en büyük ve en küçük sayının toplamını hesaplamak için QBasic kodunu içerir (kod çok açıklayıcıdır).

Son satır içerir '*/. 'QBasic yorumlayıcısının aşağıdaki kodu yorum olarak yorumlamasına neden olurken, JavaScript'te bir yorumun bir parçası olduğu için (ilk satırın sonunda başlayan) herhangi bir etkisi yoktur. Aşağıdaki kod (*/ ), JavaScript'in ilk satırda başlayan yorumu sonlandırmasına neden olur, ancak QBasic bunun bir yorumun bir parçası olduğunu düşündüğü için QBasic'te yürütülmez.


Test Durumları

JavaScript (min. Dil):

'';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. Dil):

Git bu web sitesi . Aşağıdaki kodu metin düzenleyicilerine yapıştırın:

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

Satır numaralarının gerekli olmasının nedeni, bahsettiğim web sitesinin yalnızca yapılandırılmamış BASIC dillerini desteklemesi. Ve bu web sitesi bulabildiğim tek iyi çevrimiçi BASIC yorumlayıcı. Bununla birlikte, yazının en üstünde bulunan kodu çalıştırmak (satır numaraları olmayan kod), yapılandırılmış BASIC'i destekleyen ve 'yorum başlatıcısı olarak iyi bir QBasic yorumlayıcısında iyi çalışmalıdır (çok azı bunu yapmaz)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.