Dilinizin sürümünü belirleyin


51

Buradaki zorluk dilinizin farklı versiyonlarında çalışan bir poliglot yazmak. Çalıştırıldığında, her zaman dil sürümünü çıkartacaktır.

kurallar

  • Programınız, dilinizin en az iki sürümünde çalışmalıdır.
  • Programınızın çıktısı yalnızca sürüm numarası olmalıdır. Harici veri yok.
  • Programınız, sürüm numarasını belirlemek için istediğiniz yöntemi kullanabilir. Bununla birlikte, çıktı kural 2'ye uymalıdır; ancak sürüm numarasını belirlerseniz, çıktı yalnızca sayı olmalıdır.
  • Programınızın yalnızca dilin ana sürümünü çıkarması gerekiyor. Örneğin, FooBar 12.3.456789-beta’da, programınızın yalnızca 12 çıktı vermesi gerekir.
  • Diliniz sürüm numarasının önüne veya arkasına kelimeler veya semboller koyarsa, bunları ve yalnızca sayıyı çıkarmanız gerekmez. Örneğin, C89'da programınızın yalnızca yazdırması 89ve C ++ 0x'te programınızın yalnızca yazdırması gerekir 0.
  • Tam adı veya küçük sürüm numaralarını yazdırmayı seçerseniz, örneğin C99'un yerine C89, yalnızca adı yazmalıdır . C89 build 32geçerli error in C89 build 32: foo bardeğil ise geçerlidir .
  • Programınız, dil sürümünü belirlemek için yerleşik, makro veya özel derleyici bayrakları kullanamaz.

puanlama

Puanınız, çalıştığı sürüm sayısına bölünen kod uzunluğu olacaktır. En düşük puan kazanır, iyi şanslar!


4
Dil sürüm numarası nedir? Onu kim belirler?
Buğday Sihirbazı

9
Versiyon sayısının ters-lineer versiyonunun yüksek sayıda cevap vermeyeceğini düşünüyorum.
user202729

6
@ user202729 Katılıyorum. Çok yönlü Tamsayı Yazıcı iyi yaptı - puan oldu (number of languages)^3 / (byte count).
Mego

6
Bir dilin sürümü nedir ? Bir dili burada tercüman / derleyici olarak tanımlamıyor muyuz ? Diyelim ki, bazı C89 kodları ile davranışını C89 spesifikasyonunu ihlal eden bir çalıştırılabilir ürettiği ve bir sonraki gcc versiyonunda düzeltildiğini belirten bir gcc sürümü var. Hangi gcc sürümünün kullanıldığını bildirmek için bu hata davranışına bir temel kod yazarsak, bu geçerli bir çözüm saymalı mı? Derleyicinin farklı sürümlerini hedef alıyor , ancak dilin farklı sürümlerini DEĞİLDİR .
tsh

6
Bunu anlamadım Öncelikle “Programınızın çıktısı yalnızca sürüm numarası olmalıdır” deyin . . Daha sonra "Tam adı veya küçük sürüm numaralarını, örneğin C99'un yerine C89 yazdırmayı seçerseniz, yalnızca adı yazdırmanız gerekir." Yani ilk kural aslında bir gereklilik değil mi?
boru

Yanıtlar:


16

Cidden ve Aslında , 3 bayt, skor 1.5

'1u

Çevrimiçi deneyin: Aslında , Cidden

Açıklama:

'1u
'1   both versions: push "1"
  u  Actually: increment character to "2"; Seriously: NOP
     (both versions: implicit print)

uve Ddizgelerde işlevsellik olması sadece Aslında (ek olarak v2'dir) eklenmiştir.


3
Aslında, README.md, Aslında, Cidden ciddi bir manevi halefi olduğunu söylüyor . Bana sadece bir sürüm değişikliği gibi gelmiyor.
Adám

7
@ Adám Havuzdaki şubelere bakarsanız, Cidden v1şubede bulunur. Gerçekten ciddete itiraz edilmeden önce, aslında v2şubede oturuyordu . Ek olarak, sürümlerde Cidden kullanılan 1.xsürüm numaralarını kullanırken, gerçekte (hem orada hem de PyPI'de ) kullanır. 2.x
Mego

115

Python 3.0 ve Python 2, skor 6

(12 bayt, 2 sürüm)

print(3/2*2)

Çevrimiçi Deneyin:

Python 3+ ünitesinin, taban bölümü kullanan Python 2'den farklı olarak, varsayılan olarak değişken bölümü kullandığı gerçeğine güvenir.


@MaltySen Your program should work in at least two versions of your language.En az iki sürüm 2.7 ve 3.0'da çalışır. Seçtiğim to print the full name or minor version numbers.
fireflame241

Oh anlıyorum, benim kötüm.
Maltysen

4
AMAN TANRIM! Zavallı python geliştiricileri
Regis Portalez

4
@RegisPortalez from __future__ import division, sorun :) çözüldü
Łukasz Rogalski

62

Java, 189 bayt, 10 sürüm, puan = 18.9

Desteklenen sürümler: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8ve9

(Önceki skorlar için geçmişi kontrol edin !)

Object v(){int i=0;try{for(String[]s={"Locale","Map","Timer","Currency","UUID","Deque","Objects","Base64","zip.CRC32C"};;i++)Class.forName("java.util."+s[i]);}finally{return i<9?"1."+i:i;}}

Java 8'de
çalıştırın Java 9 veya sonrasında çalıştırın

Ungolfed

Object v(){
  int v=0;
  try {
    for(
      String[] s={
        "Locale",          // 1.1
        "Map",             // 1.2
        "Timer",           // 1.3
        "Currency",        // 1.4
        "UUID",            // 1.5
        "Deque",           // 1.6
        "Objects",         // 1.7
        "Base64",          // 1.8
        "zip.CRC32C"       // 9
      };;v++)
      Class.forName("java.util."+s[v]);
  } finally {
    // Swallowing ClassNotFoundException when the version is not the last one
    // Swallowing ArrayIndexOutOfBoundsException that occurs after reaching the last version.
    return v < 9 ? "1." + v : v; // Return either an int or a String
  }
}

Lütfen, kod bölümünün return v<9?"1."+v:v;(önceden return(v<9?"1.":"")+v;), dahil olan Java 1.0 ve Java 1.3 sürümleri arasında denetlenmesi gerektiğini unutmayın . Bu sözdizimini gerçekten test etmek için elimde herhangi bir Java 1.3 veya önceki bir yüklemem yok.

Giriş

Java sürümünün özel bir geçmişi vardır. Tüm sürümler tarihsel olarak 1.xdahil edilmiştir 1.0. Ama ... itibaren Java 9 ve gelen JEP223 , sürüm entrikacı kullanarak değiştiğini 1.xiçin x. Dahili olarak bilinen sürüm budur. Bu yüzden aşağıdaki tabloya sahibiz (Javadoc ve Wikipedia ile bir araya getirdik ):

 java.version | Rel. name | Product name
   property   |           |
--------------+-----------+-----------------
          1.0 | JDK 1.0   | Java 1
          1.1 | JDK 1.1   |
          1.2 | J2SE 1.2  | Java 2
          1.3 | J2SE 1.3  |
          1.4 | J2SE 1.4  |
          1.5 | J2SE 5.0  | Java 5
          1.6 | Java SE 6 | Java 6
          1.7 | Java SE 7 | Java 7
          1.8 | Java SE 8 | Java 8
          9   | Java SE 9 | Java 9

Bu meydan okuma girdisi, yukarıdaki özellikteki sistem sütununda yer alan sürüm sütunuyla eşleşir "java.version".

açıklama

Amaç, bir sınıfın hangi sürümden başladığını kontrol etmektir, çünkü Java kodu kaldırır fakat hiçbir zaman kaldırmaz. Kod, özellikle Java 1.0'da tüm sürümlerle uyumlu olacak şekilde yazılmıştır, çünkü JDK (çoğunlukla) kaynak ileriye uyumludur .

Uygulama, her sürümün tanıttığı en kısa sınıf adlarını bulmaya çalışır. Yine de, bayt kazanmak için ortak bir alt paket seçmeye çalışmamız gerekiyor. Şimdiye kadar, en etkili paketi java.utilJava'nın tüm sürümlerine yayılmış gerçekten kısa birkaç adlı sınıf içerdiği için buldum .

Şimdi, gerçek sürüm numarasını bulmak için, sınıf isimleri sürüm tanıtımı ile sıralanır. Sonra sırayla her bir sınıfı anlamaya ve dizi indeksini arttırmaya çalışıyorum. Sınıf varsa, trydiğerine atlarız , aksi takdirde istisnanın -block tarafından yakalanmasına izin veririz. Tamamlandığında, başka bir istisna daha ortaya çıkıyor çünkü varlığını kontrol etmemiz gereken başka sınıf yok.

Her durumda, iş parçacığı try-block bir istisna dışında bırakacaktır . Bu durum yakalandı, ama sadece beklemeye sayesinde koymak değil finallysırayla aslında bir değeri döndürerek beklemede istisna geçersiz kılar -bloku, "1."+vnerede vindeks önce kullanılır. Aynı zamanda bu indeksi Java'nın küçük sürüm sayısına uydurduk.

Golfün önemli bir parçası, java.utilher versiyon için pakette (veya herhangi bir alt pakette) en kısa yeni sınıf adını bulmaktı . İşte bu maliyeti hesaplamak için kullandığım tablo.

Base cost: `java.util.` (10 chars)

 Version | Class name (cost in chars)     | Reduced name (cost in chars)
---------+--------------------------------+---------------------------
 9       | java.util.zip.CRC32C (20)      | zip.CRC32C (10)
 1.8     | java.util.Base64 (16)          | Base64 (6)
 1.7     | java.util.Objects (17)         | Objects (7)
 1.6     | java.util.Deque (15)           | Deque (5)
 1.5     | java.util.UUID (14)            | UUID (4)
 1.4     | java.util.Currency (18)        | Currency (8)
 1.3     | java.util.Timer (15)           | Timer (5)
 1.2     | java.util.Map (13)             | Map (3)
 1.1     | java.util.Locale (16)          | Locale (6)
 1.0     | <default>                      | <default>
---------+--------------------------------+---------------------------
Subtotal |                      144 chars |                  54 chars
    Base |                                |                  10 chars
   Total |                      144 chars |                  64 chars

Kredi

  • Kevin Cruijssen sayesinde 30 bayt kurtarıldı (yorumunu yapmadan önce yaptım, söz veriyorum!).
  • Neil sayesinde 26 bayt daha kurtardı (hayır, bunu yapmayı düşünmüyordum)
  • Nevay 12 byte teşekkür ve güzel dışı -box -Dene-catch düşünme!
  • Neil tarafından 11 bayt daha ve güzel taşınabilir finallynumara.
  • Değiştirerek Kevin Cruijssen 2 daha fazla bayt sayesinde return(i<9?"1.":"")+i;ile return i<9?"1."+i:i;(bu bir söz dizimi değişiklik 1.4 önce olduğundan beri 1.0 karşı veya 1.3 en geçerli olması şartı ile)

Yerleşiklerle

Yerleşiklere izin verildiyse:

String v(){return System.getProperty("java.version");}

13 sürüm için 54 bayt (1.0 ile 12 arasında), böylece skor 4.1538 olacaktır.


1
@KevinCruijssen Javavo'yu açtım ve 1'den 1'e kadar kısa isimlerle dersler verdim. Ama ... Bu sayfadan biraz yardım aldım: docs.oracle.com/javase/8/docs/technotes/guides/lang/…
Olivier Grégoire

1
260 bayt Veya belki 1 tane daha, return"...
tbh'ın

1
235 bayt:String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
Neil

3
216 bayt:String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
Nevay

1
Ooh, bir diziyi yinelemeyi ve bir istisna yakalamayı merak ettim, ama bir taneyle daha iyi gidebilirsin finally{return"1."+i;}.
Neil

22

Python , 606 bayt / 15 versiyonları = 40.4 puanı

NoOneIsHere sayesinde -67 bayt (lol).

Sürümler 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2.5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 ve 3.6'dır. .

try:eval('1&2')
except:print('0.9.1');1/0
if`'\n'`<'\'\\n\'':print(2);1/0
try:from email import _Parser;print(2.2);1/0
except:0
try:eval('"go"in""')
except:print('2.2.2');1/0
try:int('2\x00',10);print(2.5);1/0
except:0
if pow(2,100)<1:print('2.5.1');1/0
if str(round(1,0))>'1':print(3);1/0
if format(complex(-0.0,2.0),'-')<'(-':print(3.1);1/0
if str(1.0/7)<repr(1.0/7):print('3.1.3');1/0
try:eval('u"abc"')
except:print('3.2.1');1/0
try:int(base=10);print(3.3);1/0
except:0
try:import enum
except:print('3.3.3');1/0
try:eval('[*[1]]')
except:print(3.4);1/0
try:eval('f""')
except:print(3.5);1/0
print(3.6)

Sp3000'ün inanılmaz cevabına tüm kredi . Sondaki yeni satır gereklidir.

Whee, golf oynamak eğlenceliydi. Bu çalışması gerekir (evet, bu sürümlerin her birini yükledim), ancak yanlışlıkla bir şeyler düştü. Birisi bir hata bulursa, lütfen bana bildirin.



... Oh, merak etmiyorum. Sp3000’in neden her printçağrıya parantez koyduğunu merak ediyordum ... Bana bildirdiğiniz için teşekkürler!
tamamen insan

2
Belirli hata türlerini kaldırarak 68 bayt tasarruf edebilirsiniz (hepsini excepts ile değiştirin except:).
NoOneIsHere

x=<string inside eval>Sadece kodu manuel olarak değerlendirmek yerine, bu hala işe yarar mıydı ?
Mavi,

@Hiçbir yerde, ilk başta, hepsi yüzünden yapamayacağınızı düşündüm, 1/0ama sonra farkettim. Teşekkürler!
tamamen insan

21

C ++ 11/14/17, skor = 147/3 = 49

C ++ 11 ve C ++ 14 / 17'yi ayırt etmek için, C ++ 14'teki üye işlevlerinin varsayılan constayarlarındaki değişikliği kullanır constexpr( https://stackoverflow.com/questions/23980929/ örneğinde olduğu gibi ne-değişiklikler-içinde-c14-içinde-olabilir-potansiyel-break-bir-program-yazılmış-c1 ) C ++ 14 ve C ++ 17'yi ayırt etmek için, C ++ 17'nin trigraphları devre dışı bıraktığı gerçeğini kullanır.

#include<iostream>
#define c constexpr int v
struct A{c(int){return 0;}c(float)const{return*"??="/10;}};int main(){const A a;std::cout<<11+a.v(0);}

Ungolfed:

struct A {
    constexpr int v(int) { return 0; }
    constexpr int v(float) const {
        // with trigraphs, *"??=" == '#' == 35, v() returns 3
        // without trigraphs, *"??" == '?' == 63, v() returns 6
        return *("??=") / 10;
    }
};

int main() {
    const A a;
    std::cout << 11 + a.v(0);
}

(Debian gcc 7.1.0 ile test edilmiştir -std=c++{11,14,17}.)


1
Harika ilk cevap! Golf can unutmayın arasındaki boşluklar includeve <örneğin dahil tablolara, #include<iostream>.
MD XF

1
Hmm ... kurallar standart kütüphane farklılıklarını (bu durumda dolaylı olarak __cplusplusmakroyu kullanan ) kullanarak yasaklamak için revize edilmişse - o zaman C ++ 17'yi C ++ 14'ten ayırt etmek için aralığı temel alan değişikliği kullanmak için yalın anlambilim için. Belki boost::integer_iteratorsentinel'i yineleyiciye dönüştürmenin "şaşırtıcı" bir davranışı olduğu şekilde çizgiler boyunca minimal yineleyici / sentinel sınıfları oluşturabilirsiniz .
Daniel Schepler

4
return 0;Bu mainnedenle, orada 9 bayt kaydedebilirsiniz. Ayrıca wc -cçözümünüze göre 251 bayt kullanıyor ve 252 kullanmıyor (editörünüz sonuna yeni bir satır eklemiş olabilir).
nwp

1
C ++ 17'yi c ++ 14'ten ayırmak için trigraph eksikliği kullanılması muhtemelen daha kısadır.
Patates44

1
Bu işe yarar mı? return *=>return*
Zacharý, 19

19

EcmaScript 3/5/2015/2016/2017 Tarayıcıda, 59 bayt / 5 sürüm = 11.8 puan

alert(2017-2*![].map-2010*![].fill-![].includes-!"".padEnd)

NetScape 7 rapor 3 ve Opera 12 rapor 5

GOTO 0 sayesinde 1 byte tasarruf edin


1
Ninjaed ! ;)
Shaggy

Netscape 7 sadece ES3'ü destekliyor mu? Vay, düşündüğümden daha eski ...
Neil

1
Mantıklı -!olan +!!yeri kullanmak yerine birkaç bayt kaydedebilirsiniz (ve sayısal sabitleri buna göre değiştirin).
GOTO 0

3
Belki biraz açıklama? :)
Derek 功夫 會 功夫 18:17

@Derek: bir açıklama için benim çözümüme (yukarıda bağlantılı) bakın.
Shaggy,

18

JavaScript (ES5 ve ES6), 14 bayt / 2 sürüm = 7

alert(5^"0o3")

0otarzı octal sabitleri ES6'da yeni; ES5 NaN, bitli XOR sonucunu etkilemeyen dizgiyi yayınlar .


13

JavaScript (ES 2, 3 ve 5 - 8 9), 59/6 = 9.833 75/7 = 10.714

2 sürümlü çözümden biraz daha yüksek puan alsa da çözümü daha fazla sürümle sunabilir.

alert(9-(/./.dotAll!=0)-!"".padEnd-![].includes-![].keys-2*![].map-![].pop)

Çevrimiçi deneyin

Array, RegExp ve String prototiplerinde çeşitli metotların varlığını kontrol eder, onları bir boolean verir ve boolean olanı 9 başlangıç ​​değerinden çıkarır ![].map. ES4'ün terk edilmiş olduğu için hesapların çarpımı .

  • dotAllMülkiyet (ve ilgili sNormal İfadeler için bayrak) tanıtıldı ES2018 (v9).
  • padEndYaylı yöntemi tanıtıldı ES2017 (V8).
  • includesDizi yöntemi tanıtıldı ES2016 (v7).
  • keysDizi yöntemi tanıtıldı ES2015 (v6).
  • mapDizi yöntemi tanıtıldı ES5.1 (V5).
  • popDizi yöntemi tanıtıldı ES3 (V3).

ES 7 veya ES 8 geçerli bir sürüm numarası mı? Belki ES 201x olarak adlandırılmalıdır?
tsh

1
@tsh: Evet, hala sürüm numaralarını kullanıyorlar; Onlar sadece gerçek isimler için yıl kullanırlar .
Shaggy


9

Befunge: 15 11 bayt / 2 versiyon = 5.5

4 bytes @ Pietu1998 tarafından tıraş

"89",;5-;,@  

Çevrimiçi deneyin:
Befunge 93
Befunge 98
Sürümleri ayırt etmek için Befunge 98'e özgü noktalı virgül operatörünü ("sonraki noktalı virgül atla") kullanır. Her ikisi de "9" yazacaktır. Befunge 93 noktalı virgülleri yok sayar, "8" den 5 çıkarır (yığının üstünde bırakılan değer), sonuçta elde edilen "3" ü yazdırır ve sonlandırır. Öte yandan, Befunge 98, atlayacak, "8" yazdıracak ve sona erecektir.


"89",;5-;,@11 byte için
PurkkaKoodari

@ Pietu1998 Güzel! Eğer bunu bir cevap olarak göndermek isterseniz, memnuniyetle yükselteceğim :)
karhell

Devam et ve istersen al, ;rolünü çözdün .
PurkkaKoodari

@ Pietu1998 Düzenlendi. Çok teşekkürler!
karhell

Bilginize, farklı bir yaklaşımla onu 7 bayta indirmeyi başardım. Link
James Holderness

7

Pyth 4/5 - 6 bayt / 2 sürümleri = 3

  5 ;4

Pyth 5'te, satırın başlangıcındaki eşit miktarda boşluk girintili kullanım için göz ardı edilir, Pyth 4'te ise sadece tek boşluk gibi davranır ve yazdırılmasını engeller 5. Pyth 4'te, noktalı virgüller yalnızca 4yazdırılmasını sağlayan ifadeleri bitirir, Pyth 5'te boşluk ve noktalı virgül satırın geri kalanını yorum yapar.


11
Pyth'un sürümleri olduğunu kim bilebilirdi?
Outgolfer Erik


7

Kübik olarak, 4 bayt, 4 / ∞ puanı

B3%0

Her sürümde çalışır, sisteminizin çalışması için yeterli hafıza vardır. Rekabetçi değil çünkü bu topal. Bu meta yayına göre geçerlidir .

Temel olarak, B3 bir satır sol yüzden üst yüze döner. F3 de aynı şekilde çalışır, F₁3 veya B just3. Cubically 3x3x3'teki bir satır, bir küpelik üç küplük olduğundan, bu üçlüyü 1üst yüze koyar , %0yüz toplamı 3 verir, bu üst yüz toplamını 3 basar ve böylece Cubically 3 x3x3 3 yazdırır.

Cubically 4x4x4'te satırlar 4x1 kübttür. 4 1'i üst yüze koyar, toplamda 4 verir.


9
Skor 4 / ∞ olmamalı mı?
nwp

7

x86 16/32/64-bit makine kodu: 11 bayt, skor = 3.66

Bu işlev, geçerli modu (varsayılan işlenen boyutu) AL'da bir tamsayı olarak döndürür. C ile imzayla arauint8_t modedetect(void);

NASM makine kodu + kaynak listesi (16 bit modunda nasıl çalıştığını gösterir, çünkü BITS 16NASM'ye 16 bit mod için kaynak anımsatıcılarını birleştirmesini söyler.)

 1          machine      global modedetect
 2          code         modedetect:
 3 addr     hex          BITS 16

 5 00000000 B040             mov    al, 64
 6 00000002 B90000           mov    cx, 0       ; 3B in 16-bit.  5B in 32/64, consuming 2 more bytes as the immediate
 7 00000005 FEC1             inc    cl          ; always 2 bytes.  The 2B encoding of inc cx would work, too.
 8                       
 9                           ; want: 16-bit cl=1.   32-bit: cl=0
10 00000007 41               inc    cx       ; 64-bit: REX prefix
11 00000008 D2E8             shr    al, cl   ; 64-bit: shr r8b, cl doesn't affect AL at all.  32-bit cl=1.  16-bit cl=2
12 0000000A C3               ret
# end-of-function address is 0xB, length = 0xB = 11

Gerekçe :

x86 kodunun resmi olarak sürüm numaraları yoktur, ancak bunun en uygun olanı seçmek yerine (yalnızca 7 byte alır) özel sayılar üreterek sorunun amacını yerine getirdiğini düşünüyorum.

Orijinal x86 CPU, Intel'in 8086, yalnızca 16 bitlik makine kodunu destekledi. 80386, 32 bitlik makine kodunu başlattı (32 bitlik korumalı modda ve daha sonra 64 bitlik bir işletim sistemi altında uyumlu modda kullanılabilir). AMD, uzun modda kullanılabilen 64 bit makine kodunu sundu. Bunlar x86 makine dilinin sürümleri, Python2 ve Python3'ün farklı dil sürümleri olduğu gibi. Çoğunlukla uyumludur, ancak kasıtlı değişikliklerle. 32 veya 64 bitlik yürütülebilir dosyaları, doğrudan 64 bit işletim sistemi çekirdeği altında, Python2 ve Python3 programlarını çalıştığınız gibi çalıştırabilirsiniz.

Nasıl çalışır:

İle başla al=64. 1 (32 bit mod) veya 2 (16 bit mod) ile sağa kaydırın.

  • 16/32 vs. 64 bit: 1 bayt inc/ deckodlamalar 64 bitlik REX önekleridir ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W bazı talimatları hiçbir şekilde etkilemez (örneğin a jmpveya jcc), ancak bu durumda 16/32/64 almak ecxyerine, yerine inc veya dec olmak istedim eax. Bu aynı zamanda REX.Bhedef kayıt defterini değiştiren ayarları da yapar . Ama neyse ki bu işi yapabiliriz, ancak işleri 64-bit olarak ayarlamak gerekmiyor al.

    Yalnızca 16 bit modunda çalışan komutlar a içerebilir ret, ancak gerekli veya yararlı bulamadım. (Ve bunu yapmak istemeniz durumunda bir kod parçası olarak satır içi imkansız hale getirir). Aynı zamanda jmpfonksiyonun içinde de olabilir .

  • 16 bit - 32/64: hemen, 32 bit yerine 16 bit vardır. Mod değiştirme, bir talimatın uzunluğunu değiştirebilir, bu nedenle 32/64 bit modları, sonraki iki baytı ayrı komuttan ziyade ani işlemin bir parçası olarak çözer. Burada 2 baytlık bir komut kullanarak işleri basit tuttum, senkronizasyonun kodunu çözmek yerine 16 bit modun 32/64'ten farklı komut sınırlarından kod çözmesi.

    İlgili: İşlenen boyutu öneki hemen (16-bit ve 32/64-bit modları arasındaki fark gibi), hemen (uzun bir 8-bit işareti işaretli sürece) uzunluğunu değiştirir. Bu, komut uzunluğu çözmenin paralel olarak yapılmasını zorlaştırır; Intel işlemcilerin LCP kod çözme tezgahları var .


Çağıran kuralların çoğu (x86-32 ve x86-64 System V psABI'ler dahil), yazıcının yüksek bitlerinde dar dönüş değerlerinin çöp olmasına izin verir. Ayrıca, CX / ECX / RCX (ve 64-bit için R8) 'nin kapatılmasını da sağlar. IDK, 16 bitlik arama sözleşmelerinde yaygındıysa, ancak bu kod golf, bu yüzden yine de her zaman özel bir arama sözleşmesi olduğunu söyleyebilirim.

32 bit sökme :

08048070 <modedetect>:
 8048070:       b0 40                   mov    al,0x40
 8048072:       b9 00 00 fe c1          mov    ecx,0xc1fe0000   # fe c1 is the inc cl
 8048077:       41                      inc    ecx         # cl=1
 8048078:       d2 e8                   shr    al,cl
 804807a:       c3                      ret    

64-bit sökme ( Çevrimiçi deneyin! ):

0000000000400090 <modedetect>:
  400090:       b0 40                   mov    al,0x40
  400092:       b9 00 00 fe c1          mov    ecx,0xc1fe0000
  400097:       41 d2 e8                shr    r8b,cl      # cl=0, and doesn't affect al anyway!
  40009a:       c3                      ret    

İlgili: benim x86-32 / x86-64 polyglot makine kodu SO & SO.

16 bit ve 32/64 arasındaki bir başka fark, adresleme modlarının farklı şekilde kodlanmasıdır. örneğin lea eax, [rax+2]( 8D 40 02) lea ax, [bx+si+0x2]16 bit modundaki gibi kod çözer . Bu, özellikle de kod golf için kullanmak zor olduğu açıktır e/rbxve e/rsibirçok arama kuralları içinde çağrı korunur.

Ayrıca mov r64, imm64REX + olan 10 bayt kullanmayı da düşündüm mov r32,imm32. Fakat zaten 11 baytlık bir çözüme sahip olduğum için, bu en iyi ihtimalle eşit olurdu (10 bayt + 1 için ret).


32 ve 64 bit modu için test kodu. (Aslında 16-bit modunda çalıştırmadım, ancak sökme işlemi size nasıl çözüleceğini anlatıyor. 16-bit bir emülatör kurulumum yok.)

; CPU p6   ;  YASM directive to make the ALIGN padding tidier
global _start
_start:
    call   modedetect
    movzx  ebx, al
    mov    eax, 1
    int    0x80        ; sys_exit(modedetect());

align 16
modedetect:
BITS 16
    mov    al, 64
    mov    cx, 0       ; 3B in 16-bit.  5B in 32/64, consuming 2 more bytes as the immediate
    inc    cl          ; always 2 bytes.  The 2B encoding of inc cx would work, too.

    ; want: 16-bit cl=1.   32-bit: cl=0
    inc    cx       ; 64-bit: REX prefix
    shr    al, cl   ; 64-bit: shr r8b, cl doesn't affect AL at all.  32-bit cl=1.  16-bit cl=2
    ret

Bu Linux programı exit-status = ile çıkar modedetect(), öyleyse çalıştırın ./a.out; echo $?. Statik bir ikiliye birleştirin ve bağlayın, örn.

$ asm-link -m32 x86-modedetect-polyglot.asm && ./x86-modedetect-polyglot; echo $?
+ yasm -felf32 -Worphan-labels -gdwarf2 x86-modedetect-polyglot.asm
+ ld -melf_i386 -o x86-modedetect-polyglot x86-modedetect-polyglot.o
32
$ asm-link -m64 x86-modedetect-polyglot.asm && ./x86-modedetect-polyglot; echo $?
+ yasm -felf64 -Worphan-labels -gdwarf2 x86-modedetect-polyglot.asm
+ ld -o x86-modedetect-polyglot x86-modedetect-polyglot.o
64

## maybe test 16-bit with BOCHS somehow if you really want to.

1, 2, 3 sürümlerini numaralandırabilirsem 7 bayt (puan = 2.33)

Farklı x86 modları için resmi sürüm numarası yoktur. Sadece asm cevapları yazmayı seviyorum. Sanırım sadece 1,2,3 veya 0,1,2 kiplerini çağırırsam, sorunun amacı ihlal edeceğini düşünüyorum. Ama eğer buna izin verildiyse:

 # 16-bit mode:
42                                  detect123:
43 00000020 B80300                      mov ax,3
44 00000023 FEC8                        dec al
45                                  
46 00000025 48                          dec ax
47 00000026 C3                          ret

Olarak 32 bit modunda kod çözen

08048080 <detect123>:
 8048080:       b8 03 00 fe c8          mov    eax,0xc8fe0003
 8048085:       48                      dec    eax
 8048086:       c3                      ret    

ve 64-bit olarak

00000000004000a0 <detect123>:
  4000a0:       b8 03 00 fe c8          mov    eax,0xc8fe0003
  4000a5:       48 c3                   rex.W ret 

Bunların farklı sürümler olarak sayıldığından emin değilim . Sadece farklı sistem konfigürasyonları ile ilişkili değil mi?
Uriel

1
@Uriel: CPU ile 16 bit modunda, 32 bit modunda veya 64 bit modunda bir makine kodu bloğunu çalıştırmak , aynı Python programında çalışan python2ve python3tercümanların makine kodu eşdeğeridir . Yeni x86 CPU'lar her zaman eski CPU'larla uyumlu bir mod içerir (bu, böyle karmaşık bir kod çözmesi zor makine kodu formatı kullanmak için tek bahanesidir!), Ancak 386'nın 32-bit korumalı modu ve x86-64'ün uzun modu gerçekten x86 makine kodunun yeni sürümleri. Uzun mod, bazı kodları bile kaldırarak geçersiz kılar.
Peter Cordes

5

Brachylog / Brachylog v1 , 5/2 = 2,5

2,1hw

Çevrimiçi deneyin! (Brachylog)

Çevrimiçi deneyin! (Brachylog v1)

Brachylog için açıklama:

?2,1hw.
?2      Unify ? (input) with 2 (no input so it succeeds)
  ,1    Append 1 (21)
    h   First element/head (2)
     w. Write to STDOUT and unify with output (not displayed)

Brachylog v1 için açıklama:

?2,1hw.
?2      Unify ? (input) with 2 (no input so it succeeds)
  ,     Break implicit unification/logical AND
   1h   Take first element/head of 1 (1)
     w. Write to STDOUT and unify with output (not displayed)

Harika! Bir sidenote olarak, 2,1Brachylog'da v2 listeyi yapmaz [2,1]( 2;1yapacaktır) değil, sayıdır 21(cevabın çalışmasını istediğiniz şekli değiştirmez).
17'de 13

@Fatalize Ooh teşekkürler Jelly ile karıştırdım ...
Outgolfer Erik

@ BT'yi Brachylog 2;1v1'de ;mantıksal VEYA orada ifade edemezdim .
Outgolfer Erik

5

C89 / C99, 25 bayt, 2 versiyon, puan = 12.5

#include <stdio.h>

int main() {
    int v = 11 //**/ 11
            + 88;
    printf("C%d\n", v);
    return 0;
}

// stil yorumları C89'da tanınmıyor.

Golf versiyonu:

v(){return 20//**/2
+79;}

Çevrimiçi deneyin: C89 , C99


yerine int v()birlikte main(), daha kısa olduğunu ve aslında tam bir program olarak derlemek olacak!
Andrea

@Andrea Teşekkürler. AFAIK, ya fonksiyonları ya da tüm programları göndermek için izin verilir.
nwellnhof

Haklısın
Andrea

5

Perl 5 ve Perl 6, 23 bayt 19 bayt, 9,5 puan

print 6-grep '.',''

Perl 5 grepilk op her zaman bir regex olarak kabul edilir, öyle değil Perl 6.


puan 19/2 = 9.5
Daniel Vestøl

5

Bash, tüm 4 sürümleri, 72 71 32 bayt ⇒ puanı = 8

s=$'\ua\xa\n';expr 5 - ${#s} / 2

Bu kod parçası $'...', Bash'in her bir versiyonundaki farklı dizelerin yorumlarından yararlanır .
Ana sürüm numarasını gösterir - bu kadar.

Doc burada bulundu .

Ungolfed:

s=$'\ua\xa\n';
expr 5 - ${#s} / 2
# Bash v4 sees three linefeeds => length of 3 => 5 - 3 / 2 = 4
# Bash v3 sees the literal '\ua' + two linefeeds: 5 chars in length
#    => 5 - 5 / 2 = 3
# Bash v2 sees '\ua\xa' + linefeed, 7 chars: 5 - 7 / 2 = 2
# Bash v1 does not even interpret $'..' strings, and sees literally '$\ua\xa\n' of length 9 => 5 - 9 / 2 = 1

Bu cevap yarı yarıya bir tahmindir; Ben sadece bash 4 ve 3'te test ettim, ancak diğer sürümlerde de çalışması gerekiyor.

Varsa / yapmazsa bana bildirin, elimde olduğu anda diğer sürümlerle deneyeceğim.

Jens'e -1 karakter.
Dijital Travma (bütün exprfikir) sayesinde -29 bayt !


Kabuk dilbilgisi ;;son bir alternatif gerektirmez . ;Bir baytı tıraş etmek için kullanın .
Jens

1
Bunu sadece bash-2.05a'da denedim (şimdi sadece Cygwin için derlendi) ve hatalı bir şekilde "2" yazıyor: "2" değil:
Jason Musgrove

1
yorumlama $'\xNözelliği 2.01.1'de eklenmiş gibi görünüyor ... Cevabımı güncellemem gerekecek. Üzerinde çalışmak
joH1

bunu denemenizi isteyebilir miyim? s="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
joH1

1
Bunun gibi bir şeye golf oynayabilirsin s=$'\ua\xa\n';expr 5 - ${#s} / 2. Bu v3 ve v4'te çalışır. Şu an denemek için eski sürümleri çalıştırmıyorum.
Dijital Travma

4

R, sürüm 2 ve 3, puan: 10,5 puan

cat(exists("cite")+2)

Bu komut 2R 2.xx ve 3R 3.xx için döner . İşlev citeR 3.0.0 sürümüne eklenmiştir. Bu nedenle, komut R 2.xx ve R 3.xx için exists("cite")döner FALSE.TRUE

R, tüm sürümler (1, 2 ve 3), puan: 12⅓ puan

e=exists;cat(e("cite")+e("eapply")+1)

Fonksiyon eapplyR 2.0.0'da tanıtıldı.


R.version$major. 15 karakter Var olduğundan beri bilmiyorum.
Rui Barradas

@RuiBarradas OP'den bahsedeyim: " Programınız dil sürümünü belirlemek için yerleşik, makro veya özel derleyici bayrakları kullanmayabilir. "
Sven Hohenstein

Tamam, pardon, bu kısmı özledim. Yorumu silmeli miyim?
Rui Barradas

@RuiBarradas Sorun değil. Yorumu silmenize gerek yok.
Sven Hohenstein

Sonucu yazdırmanız gerekir. Şu anda, tam bir program olarak çalıştırıldığında bu hiçbir şey yazdırmıyor.
JAD,

4

Python , 196 bayt / 16 sürümleri = 12.25 puan

Sürümler 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, ve 3.6'dır.
Ne yazık ki 2.7'yi dışarıda bırakmak zorunda kaldım çünkü içinde modül yok. (söyleyebildiğim kadarıyla) 2.6’da değil 3.0’da.

i=15
try:
 for m in'os.atexit.os.os.os.warnings.cgitb.heapq.collections._ast.abc.queue.os.os.os.importlib.argparse.lzma.asyncio.zipapp.secrets.'.split('.'):__import__(m);i=i+1
except:print(i/10.)

Farklı python sürümlerinde tanıtılan bir grup modül arasında döngü kurarız ve ilk hatada sürümü kapatır ve geri veririz. Ana sürümler arasındaki boşluklar tekrar tekrar içe aktarılarak doldurulur os. Python 1.5 için test string.split1.6 kadar mevcut olmamasına dayanır .

Kredi Olivier Gregoire cevabı bir döngü içinde yeni sınıflar / modülleri için test fikri için.

Şimdi nihayet tüm ilgili python sürümlerini test ettim ... 1.5 kaynak kodun derlenmesini sağlamak için gerekli ...


4

Windows Toplu İş Dosyası , 35 bayt / 2 sürüm = 17,5 puan

@if /i Z==z @echo NT&exit
@echo DOS

DOSMS-DOS (duh) ve NTWindows NT'de yazdırır . (Yaa)

Şimdi, biraz açıklama için.

Windows, MS-DOS zamanlarından beri toplu komut dosyası kullanıyor ve o zamandan beri pek değişmedi. Ancak, Windows NT gelmeden Microsoft dan, toplu komut dosyaları için varsayılan tercüman değiştirdi COMMAND.COMiçin cmd.exe(şimdi de uzatılması imkanını .cmdorijinal alternatif olarak .bat).

Bununla beraber , şartlı çalışmalarda dize vakasını yok sayma bayrağı gibi birkaç değişiklik de uyguladılar /i. Bu, Z==zyanlış olsa da /i Z==z, doğru.

DOS'un büyük Zküçük harf duyarsızlığına sahip olmadığından ve büyük harfleri küçük harflerle karşılaştırmasından yararlanırız z. /iBayrağı kullanarak, Z==zDOS'ta koşullu (yanlış) ve z==zNT'de (true) oluruz .

Şimdi, zorluğun bir sürüm numarasının yazdırılması gerektiğini belirttiğinin farkındayım. Ancak, bildiğim kadarıyla, toplu komut dosyası yazacak 'sürüm numarası' yok, bu yüzden alabileceğim en yakın şey bu.


Windows 10, DOSBox ve vDos'ta test edilmiştir:

Windows 10:

Windows 10

( cmd /kpencerenin kapanmasını engellemek için ile çalıştırın exit)

DOSBox:

DOSBox

VDOs:

VDOs


Windows 7, Windows'tan daha kısa NT.
user202729 21:17

2
@ user202729 Sanırım, ama sonra yine, 7gerçekten bir dil sürümü değil, 3.1'den beri tüm Windows'larda aynıydı. Bu yüzden 7, belki de olması gerektiği zaman bir zaman 3.1
demenin

3

Wolfram Dili / Mathematica 10/11, 37 bayt / 2 sürümleri = 18.5

Bir düşünün (Length@DateRange[{1},{1}][[1]]+27)/3, 37 bayt ve 2 sürüm ile çalışmak bana 18,5 puan veriyor.

In[1]:= $Version

Out[1]= "10.4.1 for Microsoft Windows (64-bit) (April 11, 2016)"

In[2]:= (Length@DateRange[{1}, {1}][[1]] + 27)/3

Out[2]= 10

ve

In[1]:= $Version

Out[1]= "11.1.1 for Microsoft Windows (64-bit) (April 18, 2017)"

In[2]:= (Length@DateRange[{1}, {1}][[1]] + 27)/3

Out[2]= 11

Daha etkili bir yol olduğuna eminim, ancak DateRange çıktısı arasındaki uyuşmazlık beni son zamanlarda popomda ısırdı, bu yüzden bunu kullanmaya başladım.

Bir takip olarak, birileri muhtemelen 1-8. Mathematica versiyonlarında Length@DateRange[{1}, {1}][[1]]değerlendirmeden yararlanabilir 1, ancak bunu dahil etmek için zamanım olmadı.


2
Cevabınızın istemin gerekliliklerini yerine getirmediğinden, yani kullanımınızdaki son kuralı yerine getirmediğinden emin olun $Version:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
Amndeep7

7
Sadece $Versiondoğru sürümde doğru sonucu çıktığını göstermek için kullanıyorum , $Versioncevabımın bir parçası değil ...
user6014

Tüm iyi arkadaş - şey şu ki, gibi bir şey kullanıyorsunuz $VersionNumber, ama bunun yerine çağırıyorsunuz $Version. Bana göre, programınızın etleri bir Length@DateRangeşeyler iken , o $Versionzaman işlediğiniz tam sürüm bilgisini vermeden işe yaramaz , bu nedenle kuralları ihlal eder.
Amndeep7

4
@ Amndeep7 Gönderme, birinci paragrafta belirtilen 37 bayt kodudur. Kod blokları sadece çıktı gösterimleridir.
PurkkaKoodari

3
Açıklama: Farklı versiyonlarda farklı zaman formatları kullanmak. Bu daha fazla {1} Tr[1^#&@@%~DateRange~%]/3+9(31 byte) veya hatta 7+Length@Now(12 byte)
golf oynayabilir

3

Ruby 1.x ve 2.x, 20 bayt, 10 puan

p [].to_h&&2rescue 1

Ruby 2'de sınıfta to_hsunulan yönteme dayanarak Array.


Güzel ilk cevap. Test etmek için kullanışlı bir 1.x yok, ancak p [].to_h&&2rescue 1biraz daha kısa.
Manat çalışması

@ manatwork Harika, 3 bayt kazandırır ve cazibe gibi çalışır
Philipp Frank

3

Erlang, 180 bayt, 11 sürüm, puan 16.36

20-length([A||A<-[schedulers,c_compiler_used,cpu_topology,snifs,dynamic_trace,port_count,nif_version,end_time,max_heap_size,atom_count],{'EXIT',_}<-[catch erlang:system_info(A)]]).

Girinti ve satır kesmeleriyle:

20-length([A||A<-
                  [schedulers,
                   c_compiler_used,
                   cpu_topology,
                   snifs,
                   dynamic_trace,
                   port_count,
                   nif_version,
                   end_time,
                   max_heap_size,
                   atom_count],
              {'EXIT',_}<-[catch erlang:system_info(A)]]).

Her ana sürümün 10'dan beri küçük bir sürümünde test edildi:

  • R10B'nin-9
  • R11B-5
  • R12B-5
  • R13B04
  • R14B04
  • R15B03
  • R16B03
  • 17.5.6.2
  • 18.2.1
  • 19.2
  • 20.0

Buradaki fikir, her büyük sürümün fonksiyon için izin verilen en az bir argüman eklediğidir erlang:system_info, bu yüzden listedekileri deneyelim, kaç tanesinin başarısız olduğunu sayalım ve o andaki sürüm olan 20'deki başarısızlık sayısını çıkaralım.


3

Julia 0.4, 0.5, 46 bayt, skor 22

f(::ASCIIString)=.4
f(::String)=.5
f()=f("")

Julia birçok versiyonda somut ve soyut String tiplerinin tipini değiştirdi.

Bu kod özellikle aşağıdakilerden yararlanır:

Julia 0.4 :

  • Beton ASCIIString,
  • Özet resmen AbstractString,
  • Özet'in takma adı kaldırıldı String.
  • Beton soyuttan daha belirgindir, bu yüzden sevkiyatı kazanır

Julia 0.5 :

  • Beton resmen String,
  • Beton takma ismini vermedi ASCIIString,
  • Özet AbstractString(bu önemli olmasa da)
  • Beton dize türü için iki yöntem tanımlandığı için, ikincisi eskisinin üzerine yazar.

Ayrıca bkz : farklı ilkelere dayanan daha yeni ve daha etkili bir çözüm


3

Japt (1 ve 2), 8 6/2 = 4 3

'1r\S2

Test v1  |   Test v2

  • Oliver sayesinde 2 bayt kaydedildi

açıklama

V2'den önce, Japt özelleştirilmiş bir RegEx sözdizimi kullanıyordu, bundan faydalanabiliriz.

'1

Dize olarak 1 sayısı.

 r  2

rAşağıdakileri a ile değiştirin ( ) 2.

\S

2. Japonca bunu /\S/g, ile eşleşen RegEx olarak görüyor 1. Japt 1 \kaçış karakterini görmezden geliyor ve sadece Sboşluk karakterinin Japt sabiti olanı görüyor ve açıkça uyuşmuyor 1.


3

Befunge, skor = 3.5

7 bayt, 2 sürüm

"]"'b.@

Befunge-93'de
çevrimiçi deneyin Befunge-98'de çevrimiçi deneyin

"]"her iki sürümde de değişmez, 93'ü (ASCII değeri [) yığının üstüne iter . 'bBefunge-98’de tam anlamıyla bir karakterdir, 98 i (ASCII değeri b) iterek , ancak bunlar Befunge-93’te geçersiz talimatlardır, bu nedenle bunlar dikkate alınmaz. Böylelikle Befunge-93'teki yığının üstünde 93, Befunge-98'de 98 ile son buluyoruz. .@yığının en üstündeki değeri yazar ve çıkar.


]".@.b'ya ]g.@.b'da iş
MildlyMilquetoast

3

Yakut 1.x (<1.9) ve 2.x, 10 8 bayt, skor = 4

$><<?2%7

Dene:

Bu, ?xRuby 1.x ve 2.x arasındaki farklı davranışlardan yararlanarak çalışır . Ruby 1.x'te ?A(örneğin) döndürür 65(karakterin ASCII değeri A), ancak Ruby 2.0'da bir karakter dizesini döndürür "A".

Yukarıdaki kod buna eşdeğerdir:

val = ?2
$> << val % 7

Yakut 1.x (<1.9) olarak, değeri valolduğu 50(karakter ASCII değeri 2) bir Fixnum. Fixnum#%modulo işleci, bu nedenle 50 % 7döndürür 1.

Ruby 2.x'te valdizedir "2". String#%bir infix sürümüdür sprintfyüzden "2" % 7eşdeğerdir sprintf("2", 7), nerede "2"biçim dizedir. Format dizgisi herhangi bir format dizisi içermediğinden (örneğin %d), sonraki argümanlar atılır ve "2"döndürülür.

Son olarak, $>bir takma addır $stdout, dolayısıyla $> << ...sonucu yazdırır.


1
Oh güzel! ?A==66?1:2Cevabınızla karşılaşmadan önce gibi bir şey yapmaya çalışıyordum
Piccolo

3

Python 2 ve Python 3 , 36 34 bayt, puan 18 17

print(str(hash(float('-inf')))[1])

In Python 2 , negatif sonsuzluk karma -271828 ama içinde Python 3 o -314159 bu. Düzenleme: @ArBo sayesinde 2 bayt, 1 puan kaydetti.


squints Bu kasıtlı bir e vs pi şey mi?
Jo King

@JoKing Evet; Açıkça görülüyor ki hash, kayan nokta sonsuzları üzerinde çalışmak için ilk sabitlendiğinde, ilgili geliştirici, pi * 1e5 ve e * -1e5'i karma değerleri olarak kullandı. Python 3'ün bir noktasında, negatif sonsuzluk değeri, sonsuzluk için karma değerin olumsuzlaması olarak değiştirildi.
Neil

2

Python 3 , Python 2 , puan 17.5

(35 bayt, 2 sürüm)

try:exec("print 2")
except:print(3)

Python 2,35 bayt

Çevrimiçi deneyin!

Python 3 , 35 bayt

Çevrimiçi deneyin!

ETHproductions sayesinde 5 bayt kurtarıldı

İyi bir kod golf cevabı değil, büyük bir değişiklik!


Hmm, her bir ifadeyi önceki satıra koyabilir misin? Yanitry:exec("print 2")\nexcept:print(3)
ETHproductions

@ETHproductions teşekkürler! Kazanmayı beklemiyordum, bu yüzden biraz rahatsız oldum. Ben esas olarak odaklanmak istediğimiz Python 2 ile 3 arasında kitlesel değişim
jferard
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.