Büyük veya Küçük Endian


57

LKüçük bir endian mimarisinde Bçalışan bir if veya büyük bir endian mimarisinde çalışan bir ifşa veren bir program veya fonksiyon yazın . Küçük harf çıktı lveya bkabul edilebilir.

Giriş yok.

Puanlama kod golf, bu yüzden en az bayt olan kod kazanır.

Düzenleme: Aşağıdaki yorumlara göre, girişin her iki mimaride de çalışabilmesi gerektiğini açıklığa kavuşturuyorum.

Bunun etkileyebileceği tek bir cevap olduğuna inanıyorum ve bu cevap bunun böyle olduğunu açıkça ortaya koydu.


1
Kutunun hafızası. Ne demek istediğinden emin değilim
Liam,

7
Bunun ilginç bir meydan okuma olduğunu düşünüyorum (ve normların dışında kaldı), ancak bunu test etmek oldukça zor olacak. Özellikle kodun çoğu son derece platforma özgü olacak.
DJMcMayhem

7
Evet, ilginç olacağını düşünüyorum çünkü umarım esolangs ve golf dillerinin 'normal' dillerden daha zor zamanları vardır. Doğrulamaları o kadar zor olmayacaklarını hissediyorum. En kötü durum, elle doğrulanabilir olmaları gerektiğidir
Liam,

2
Belirli bir makine koduna dayalı bir cevabın yasak olduğunu tahmin ediyorum. Aksi takdirde B0 4C C3, hangi mov al, 'L' / retya unsigned char f(){ return 'L'; }geçerli bir x86 cevap olacaktır.
Margaret Bloom,

5
Bravo! Genel amaçlı programlama dillerinin rekabet edebildiği bir kod golf mücadelesi için.
PellMell

Yanıtlar:


42

Python, 33 bayt

import sys
exit(sys.byteorder[0])

sys.byteorderya 'little'da 'big'(ve bu cümleyi okuyacak olanlar için, koda bakmadan [0], ilk karakteri almanız anlamına gelir).


Meydan çıkışı olmalı diyor Lve B(veya küçük varyant), tamamını değil bir kelime.
user2428118

43
Bu yüzden diyor ki sys.byteorder[0], yani ilk karakter byteorder.
s3lph

36

C, 26 bayt

a=66<<24|76;f(){puts(&a);}

32 bit intve ASCII karakterleri varsayar . AMD64 (küçük endian) ve miplerde (büyük endian) test edilmiştir.

GCC, 23 bayt

00000000: 613d 2742 0000 4c27 3b66 2829 7b70 7574  a='B..L';f(){put
00000010: 7328 2661 293b 7d                        s(&a);}

Feersum tarafından önerildi. Çok karakterli sabitlerin değeri uygulamaya bağlıdır, ancak bunun GCC'de işe yaradığı görülmektedir. Aynı mimarilerde test edilmiştir.


7
Daha kısa olan s sıfır bayt ile değiştirilebilir. a='B\0\0L';\0
feersum

1
@feersum Çok karakterli sabitlerin endiannessi uygulamaya bağımlı gibi görünüyor. Normalde kod golfü için bu kadar endişelenmem, ama bu zorluk tamamen uygulamalar arasında ayrım yapmaktır.
Anders Kaseorg

Bu kod şu anda GCC dışında bir şeyde çalışıyor mu?
feersum

1
@ feersum C89 her ikisine de izin verir.
Anders Kaseorg

1
AIX 5.2 çalıştıran bir RS6000'de xlc (AIX Derleyicisi için VisualAge C ++ Professional / C, Sürüm 6) kullanılması, 26 baytlık program başarıyla "B" yazdırıyor
Jerry Jeremiah

24

MATLAB / Octave, 24 bayt

[~,~,e]=computer;disp(e)

computerFonksiyonu, iyi, bilgisayar üzerinde çalıştığı hakkında bilgi verir. Üçüncü çıktı endianness: Lya Bda sırasıyla küçük ya da büyük endian için.

Ideone'da dene .


1
ne. Bu yığın akışı için bir şey, bunu bilmiyordum!
Brain Guider,

20

JavaScript ES6, 50 bayt

_=>"BL"[new Int8Array(Int16Array.of(1).buffer)[0]]

TypedArray nesnelerinin tercümanın yerelliğini ortaya koymasının iyi bir fikir olduğuna kim karar verdiğini bilmiyorum , ama işte buradayız.


5
WebGL çalışanları GPU'ya geçerken endianness dönüştürmek zorunda kalmamak için iyi bir fikir olduğunu düşündüler. Hemen hemen herkes aptalca olduğunu düşündü… :(
gsnedders

11

C 36 35 bayt

@Algmyr ve @owacoder 'a 1 bayt teşekkürler.

main(a){printf(*(char*)&a?"L":"B");}
main(a){putchar(66+10**(char*)&a);}
main(a){putchar("BL"[*(char*)&a]);}

Buraya kredi .

Büyük bir endian makinem olmadığından beri denenmemiş.


2
C spec bir argüman mainfonksiyonuna izin veriyor mu?
CodesInChaos

@codesinchaos evet öyle. Verilen komut satırı argümanlarının sayısı olacaktır. Genellikle burada, 1herhangi bir girdi verilmediği için başlatılan bir değişkene sahip olmak için kullanılır (ve program adı her zaman ilk argüman olarak sayılır)
Liam

2
@Liam: 0 veya 2'den başka bir şeye izin verilirse, C11'de tanımlanmış olan uygulamadır.

1
Veya main(a){putchar("BL"[*(char*)&a]);}.
owacoder

2
O 31 iner çağrı kongre bulaşırsan: main(char a){putchar("BL"[a]);}.
Andrea Biondo,

8

Mathematica, 22

{B,L}[[$ByteOrdering]]

Bu muhtemelen yerleşik bir işlevi kullanmama konusunda bazı kurallara aykırıdır, ancak alternatif bir seçenek olarak altın madalyonun gerçekten kullanımıyla ilgilenmiyorum.


1
Yerleşikler gayet iyi (çoğu cevap onları kullanıyor)
Liam

2
Ve bir kez daha, Mathematica'nın yerleşik bir özelliği var!
gcampbell

3
Bence bu bir snippet, bir program veya fonksiyon değil ve &onu bir fonksiyon yapmak için eklemelisiniz . (Ama neyin “program” teşkil ettiği konusunda anlaşmazlık olabilir.)
Anders Kaseorg

1
Ben akımı (şimdiye kadar olsaydı) PDR standartlarına ama IMHO tercüme edilmiş bir dilde bir avantajı pasajı olduğunu gerçekten aşina değilim @Anders olan bir program. Bu, Mathematica'daki herhangi bir program kadar bağımsız olarak çalıştırılabilir .
Mr.Wizard

1
@ Mr.Wizard Mathematica'daki bir "program" ın bağımsız bir betiğe (açık baskı gerektiren) atıfta bulunduğunu ve bu yanıtın REPL'yi kullandığını unutmayın.
LegionMammal978,

8

C, 27

Bir bayt daha uzun, ama yine de burada:

f(){putchar(htons(19522));}

İyi çalıştı, lütfen bana açıklar mısın?
ABcDexter

3
@ AbcDexter, 19522'nin ikili genişlemesini 1001100 01000010(bayt ayıracak alan). Şimdi her bir baytı alırsanız, tekrar 10 tabanına dönüştürün ve ASCII tablosunu kontrol edin, bu bayt sırasının eşdeğer olduğunu göreceksiniz LB. htonsolacak onun şey ve putcharsadece LSB yazdırılır. Büyük-endian sistemlerinde, bu Bküçük-endian'da, htonsbaytları çevirmiş olacak, bu yüzden LSB L.
Kroltan

Derleyici uyarıları ve -1 bayt 19522ile değiştirin 'LB'.
Stan Strum

8

PowerPC makine kodu - 20 bayt

PowerPC bi-endian (başlangıçta endianness ayarlanabilir), bu nedenle bu kod hem BE hem de LE makinelerinde çalışabilme zorluğuna uygun olmalıdır. Bu, 1 döndüren veya ayarlanmış olan endianliğe bağlı olarak bir işlevdir . 'L''B'

Bir işlev olarak AFAICT, SVR4 PowerPC ABI (ppc32'de Linux tarafından kullanılır), PowerOpen ABI (örneğin, AIX tarafından kullanılır) ve OS X ABI ile uyumludur. Özellikle, sadece GPR 0'ın geçici bir kayıt defteri olması ve GPR3'ün "küçük" değerleri döndürmek için kullanılmasına dayanır.

00000000 <get_endian>:
   0:   7c 00 00 a6     mfmsr   r0
   4:   54 03 0f fe     rlwinm  r3,r0,1,31,31
   8:   1c 63 00 0a     mulli   r3,r3,10
   c:   38 63 00 42     addi    r3,r3,66
  10:   4e 80 00 20     blr

Şimdi, bu böyle gider:

  • MSR GP kayıt 0 okunduğunda; MSR, bit 31'de endianness ayarlarını içerir (0 = big endian; 1 = little endian);
  • rlwinmekstraktlar sadece biraz: bu GPR0 değeri alır, R Otates L (ki hemen 0 konumunda) ve 1 yer tarafından EFT m 1 (o 31,31 tarafından üretilen maske ile sorar 2 ); sonuç GP siciline 3 eklenir;
  • 10 ile sonucu çarpma ve 66 (toplamı 'B') (10 arasındaki farktır 'L've 'B')
  • Sonunda, arayan kişiye geri dön

notlar

  1. evet, soru yazdırmak istiyor , ancak farklı işletim sistemlerinde değiştirilmemiş şekilde çalışması beklenen montajı nasıl yazdırmam gerektiği açık değil. =)
  2. ilgilenenler için rlwinm belgelerine bakın; PowerPC hakkında hiçbir şey bilmeden, bu tür talimatlar son derece ilginç buldum.

    2018 güncellemesi : Raymond Chen, PowerPC mimarisi hakkında bir dizi yayınlıyor, buradarlwinm ve arkadaşları hakkında harika yazılarını bulabilirsiniz .


7

Java 8, 96, 64 52 bayt

()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);

Bu SO cevabını temel alan bir golf . Tüm kredi @LeakyNun ve @AlanTuning'e gider. Java kaybedilen çizgiyi koruyor.

96 bayt:

 char e(){return java.nio.ByteOrder.nativeOrder().equals(java.nio.ByteOrder.BIG_ENDIAN)?'b':'l';}

64 bayt:

char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}

Denenmemiş b / c Büyük-endian makinesine erişimim yok.


1
char e(){return(""+java.nio.ByteOrder.nativeOrder()).charAt(0);}
Leaky Nun

char e(){return(""+java.nio.Bits.byteOrder()).charAt(0);}
Leaky Nun

@LeakyNun Java API'sinde Bit göremiyorum ve çalıştırdığımda bana "Bitler java.nio'da herkese açık değil"
Blue

Oh, tamam o zaman.
Sızdıran Rahibe

Bir lambda kullanıyorsanız, 52 bayt! ()->(""+java.nio.ByteOrder.nativeOrder()).charAt(0);
Shaun Wild,

6

Perl, 38 36 bayt

say+(pack"L",1 eq pack"V",1)?"L":"B"

Sistemin varsayılan bayt sırasındaki bir sayıyı paketleyerek ve küçük endian bayt sırasına sahip bir sayı ile karşılaştırarak çalışır.


6

(G) İleri, 24 bayt

here $4200004C , c@ emit

Hücrelerin 32 bit olduğunu varsaymaktadır (ve Forth tercümanınızın Gforth'un temel öneklerini desteklediğini ). Sadece 0x4200004C sayısını hafızada saklar ve daha sonra alt ucundaki baytı görüntüler.


5

C, 34 bayt

Bu ASCII karakter kodlamasını varsayar

main(a){putchar(66+10**(char*)a);}

Argüman olmadan arayın.

Açıklama:

Çağrıda, 1 aolacaktır . Küçük-endian platformlarında 1 olacak büyük-endian platformlarında 0 olacak *(char*)ailk bayta aerişecektir.

Büyük endian platformlarında bu kod bu nedenle 66 + 10 * 0 = 66 'ya geçer putchar. 66, ASCII kodudur B. Küçük endian platformlarında, ASCII kodu olan 66 + 10 * 1 = 76'yı geçecektir L.


5

C #, 60 52 bayt

C # bu konuda şaşırtıcı derecede rekabetçi.

char e=>System.BitConverter.IsLittleEndian?'L':'B';

C # 6 sözdizimi için Groo kredisi.

60 bayt:

char e(){return System.BitConverter.IsLittleEndian?'L':'B';}

C # 6 sözdizimi ile onu biraz kısaltabilirsiniz: char e=>System.BitConverter.IsLittleEndian?'L':'B';elbette bu (yanı sıra Java cevabı) aslında değeri yazdırmaz.
Groo

Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Bu güzel bir ilk cevap.
Alex A.,

5

Julia, 24 19 bayt

()->ntoh(5)>>55+'B'

Bu, giriş yapmayan ve a döndüren adsız bir işlevdir Char. Aramak için değişkene atayın. Tam sayıların 64 bit olduğunu varsayar.

ntohFonksiyon ana bilgisayarı tarafından kullanılan ağ bayt sırası (büyük endian) tarafından kendisine iletilen değerin endianness'ın dönüştürür. Büyük endian makinelerde, yapılacak ntohişlem olmadığından kimlik işlevidir. Küçük endian makinelerde, bayt değiştirilir, yani ntoh(5) == 360287970189639680. Aynı zamanda, belki daha kolay, eşittir: 0000010100000000000000000000000000000000000000000000000000000000İkili olarak.

Eğer bit değerini ntoh(5)55 ile değiştirirsek, büyük endian makinelerinde 0 ve küçük endian makinelerinde 10 elde ederiz. Karakter sabite sözlerine ekleyen 'B'biz alırsınız 'B'veya 'L'sırasıyla büyük ya da küçük endian makineleri için.

FryAmTheEggman ve Dennis sayesinde 5 bayt kurtarıldı!


32 bit için 55'ten 23'e kadar değiştirmek zorunda kalacaksınız (16 bitdeki 5 de 7 olmalıydı, benim hatam). Dennis'in gibi bir şey demek istedi: ()->ntoh(5)>>55+'B'?
FryAmTheEggman

1
f()='L'-ntoh(10)%16ve f()='L'-ntoh(10)&10tüm platformlarda çalışmalıdır.
Dennis,


5

Ortak Lisp, 27 bayt

SBCL ve ECL'de test edilmiştir. Taşınabilir bir yaklaşım için önemsiz özellikler kullanılmalıdır .

(lambda()'L #+big-endian'B)

#+Notasyonu bir olan okuma zamanı koşulu , okur koşullu ifade doğru olarak değerlendirilirse, sonraki formu. Buradaki şart, #+big-endianmetnin tamamı (platforma özel bilgilerin arasında yer alan bir liste) listeye :big-endianaitse testin tatmin olduğu anlamına gelir *FEATURES*. Aşağıdaki ifade, 'Btestin sonucuna göre okunan veya atlanan şudur. Eğer platformunuz büyük-endian ise ve yukarıdaki formu REPL'de yazarsanız, aynen aşağıdakini yazmışsınız gibidir:

CL-USER>(lambda()'L 'B)

(NB. CL-USER>İstemidir)

Bir fonksiyonun gövdesi örtüktür PROGN, yani yalnızca son ifadenin değerlendirmesinin iade edilmesi anlamına gelir. Yani yukarıdaki aslında sembolü döndürür B. Bununla birlikte, okuma zamanı koşulu false olarak değerlendirilirse, form yazmış gibi okur:

CL-USER>(lambda()'L)

... basitçe sembol döndürür L.


Snippet'lere izin verilmiyor; bunun yerine tam programları veya işlevleri yazın.
Outgolfer Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Güncelleme, teşekkürler
coredump

Not: Snippet'lere yalnızca OP tarafından açıkça izin veriliyorsa izin verilir.
Outgolfer Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bunun için bir referans verebilir misiniz? Burada ve / veya kabuk snippet'lerinde başka REPL yanıtları var ve bu meta gönderim , REPL cevaplarının varsayılan olarak tamam olabileceğini gösteriyor. Teşekkürler.
coredump,

5

ARMv6 ve üstü: 20 bayt makine kodu

0xE10F1000 : MRS   r0,CPSR        ; read current status register
0xE3110C02 : TST   r0,#1<<9       ; set Z flag if bit 9 set
0x03A0004C : MOVEQ r0,#'L'        ; return 'L' if Z clear
0x13A00042 : MOVNE r0,#'B'        ; return 'B' if Z set
0xEBxxxxxx : BL    putchar        ; print it (relative branch)

Test edilmemiş, elime uygun bir makinem olmadığı için. CPSR'nin Bit 9'u geçerli yük / depo ennisitesini verir.


Dönen sonuç için uygun kayıt olduğundan fonksiyondan ( BX lr, öyle mi?) Fonksiyonundan bir dönüş kullanabilirsiniz . putcharr0
anatolyg

Aslında, bu (aslında MOV pc, lr) önceki düzenlemelerimden biriydi. Ancak bu , mektubu yazdırma şartnamesini yerine getirir, sadece geri göndermez.
user1908704

Referansı yanlış okuyor olabilirim, ancak bunun "başparmak 2" talimat kodlamasında yapılabileceğini düşünüyorum. Bu, ilk komutun 32 bit kaldığı anlamına gelir (ARM v8 referans el kitabının F7-2720 sayfalarındaki "T1 kodlaması"; bu, 0xF3EF_8000 olur); ikincisi aynı zamanda 32 bittir (işleneni kodlamak biraz tuhaftır, ancak genel olarak 0xF010_2F02 talimatı veren "i: imm3" ve "imm8" ila 00000010 arasında yapılabilir). Üçüncü talimattan önce, sonraki iki MOV talimatındaki koşulları kontrol etmek için "ITE EQ" (0xBF0C) 'yu eklememiz gerekir, bu, 0x204C ve ...
Jules

... 0x2042 (genel olarak 2 bayt kaydediliyor). Öyleyse, son BL komutunun gösterilmesi biraz zordur, çünkü bilmediğimiz adresin bitleri, bildiğimiz komutun bitleri arasında dağılmış durumdadır, fakat aynı zamanda 32-bit kodlamadır, dolayısıyla sonuç 18 bayt toplam olabilir (F3 EF 80 00 F0 10 2F 02 BF 0C 20 4C 20 42 F? ???). Bunun mimariyi ARMv8 ve sonrasında değiştirdiğine inanıyorum, ancak ARMv7'de (?) Çalışabilir.
Jules

4

Perl 5, 21 + 1 = 22 bayt

İle koş perl -E.

say ord pack(S,1)?L:B

AMD64 (küçük endian) ve miplerde (büyük endian) test edilmiştir.


-Ebayrağı bayt sayısında gerçekten gerekli? Perl 5.10 kullandığınızı söyleyebilirsiniz (çünkü saykomut bu versiyonda mevcut)
Paul Picard

1
@PaulPicard Ama use 5.10.0;çok daha fazla bayt!
Anders Kaseorg

1
@PaulPicard Amacınız yanlış. Perl 5.10, -Eanahtarı veya useifadesini gerektirir say.
Anders Kaseorg

3
-EPPCG'de "ücretsiz" dir. Hiçbir şey eklemenize gerek yok.
Ven,

1
(ancak -nve -pdeğil)
Ven

4

R, 28 23 bayt

substr(.Platform$endian,1,1)

.Platform$endianbigeğer büyük endian ile ve küçükse koşarsa döner little. Burada, kullanarak substr, çıktının ilk harfini döndürür, ya bda l.

Olarak endianbir ile başlayan tek amacı, enesnenin içerdiği .Platformbiz, aşağıdaki 23 bayt kod için kısmi eşleme sayesinde azaltabilir:

substr(.Platform$e,1,1)

3

Clojure, 46 44 bayt

#(nth(str(java.nio.ByteOrder/nativeOrder))0)

Bu, makinenin soyluluğunu elde etmek için Java yerleşikini kullanan bir işlevdir. Sonra, onun ya "LITTLE_ENDIAN"da dilin temsilini "BIG_ENDIAN"alın ve hangi dizenin seçildiğini seçin ve onu geri döndürün.

@ Cliffroot sayesinde 2 bayt kaydedildi .


Gerçekten clojure nedir, lisp mı, java mı?
Sızdıran Rahibe,

@LeakyNun Belki Java ile çalışan pratik bir LİSP? Söylemesi zor.
mil:

#(nth(str(java.nio.ByteOrder/nativeOrder))0)2 bayt daha kısa
cliffroot

3

Yakut, 3130 karakter.

puts [1].pack("s")>"\01"??L:?B

Hmm, daha iyi bir yol olmalı. Karakterin basılması gerekmediği için diğer karakterlerin baskı almayı ihmal ettiği için 5 karakterden daha az sayın. Örneğin, herhangi bir şeyin yazdırılmasını istemiyorsanız "koyar" kısmını çıkarın.


Doğru hatırlıyorsam, Ruby 1.9'dan sonra, ?Lve ?Byerine kullanabilirsiniz puts :Lveputs "B"
Sherlock9

Bence puts [76,66].pack("s")[0]çalışacak.
Wayne Conrad,

@ Sherlock9, teşekkürler, bir karakter daha az. @WayneConrad, Belki de cevabınızı ekleyin, test etmek için elimde büyük bir endian makinem yok ama küçük endian üzerinde çalışıyor. Ama böyle değişiyor çalışmaz: puts [76,66].pack("s>")[0]. Bu, iyi anlamadığım bir nedenden ötürü büyük endian üzerinde çalışmamakın mümkün olduğu anlamına geliyor. Ancak bu bir iş gibi görünüyor (çözümünüzden geliyor) puts [19522].pack("s>")[0]. WDYT? Acaba endian ile ilgili değerlendirecek bir yer bulabilir miyim?
akostadinov

Ne yazık ki, üzerinde test yapmak için büyük bir endian makinesi de bulunmuyor.
Wayne Conrad,

3

Bash (ve diğer unix kabukları), 32 (33) bayt

Birinci ve ikinci deneme:

case `echo|od` in *5*)echo B;;*)echo L;;esac # portable
[[ `echo|od` =~ 5 ]]&&echo B||echo L         # non-portable

Dennis sayesinde, kısa versiyon:

od<<<a|grep -q 5&&echo L||echo B  # non-portable
echo|od|grep -q 5&&echo B||echo L # portable

Yardımcı echoprogram, hex değeri 0Aolan ve başka bir çıktı içermeyen yeni bir satır çıkarır . İçin <<<aöyle61 0A .

Yardımcı odprogram, varsayılan olarak, girişi iki baytlık sözcükler olarak kullanır, baytların sayısı tek ise sıfır dolgulu ve sekizlik değerine dönüştürür. Bu, eko çıktısının çıkması ile sonuçlanır 0A 00, ki bunlar 005000büyük-endian veya 000012küçük-endian olarak dönüştürülür . 61 0Aolur 005141biraz endian ve 060412büyük endian içinde. Od dolu çıkışı da biz kullanamaz anlam adres ve boyut verileri içerir 0, 1ya da2 test için.

Komut, sistemin doğruluğunu ortaya çıkarmak için iyi tanımlanmıştır. Gönderen standardı :

Sayısal değerlerin yorumlanmasında kullanılan bayt sırası, uygulama tarafından tanımlanır, ancak karşılık gelen tipte bir sabitin sistemdeki belleğe kaydedildiği sıraya karşılık gelir.

Uyumluluk notları

Tüm sistemlerde echo|odçift ​​tırnak işareti içermeyen (yani üç kelimeli bir argümanla sonuçlanan) arkasına çift tırnak işareti koyduğundan emin değilim case. Tüm sistemlerin sonlandırıcı yeni satır olmadan kabuk komut dosyalarını destekleyip desteklemediğinden emin değilim. Büyük-endian sistemlerine doldurma baytı ekleyerek od davranışının% 100'ünden emin değilim. Gerekirse echo a, taşınabilir sürümler için kullanılabilir. Tüm scriptler bash, ksh ve zsh olarak, taşınabilirler ise çizgi şeklinde çalışır.


Değişikliklerin hiçbiri gerekli değildir; sadece dil başlığında işe yarayan bir kabuk koyun ve hazırsınız.
Dennis,

1
@Dennis Bunu analiz bu tür yapmayı seviyorum ... Ben eğer daha eğlenceli olsa do diğerlerinden daha bash veya zsh içinde daha kısa bir cevap alır şey standart dışı buluyorum. Belki ne yapılabileceğini göreceğim[[
Random832

1
Analizde yanlış olan bir şey yok. Son paragrafta, kabuğa özgü bir cevabın geçerli olup olmadığından emin değil gibi görünüyordunuz ... od<<<a|grep -q 5&&echo L||echo BBash ve diğerleri.
Dennis,

Büyük bir endian VM'de test ettim ve beklediğiniz gibi echo|odyazdırdım 0000000\n005000\n0000001.
Dennis,

@ user17752 Çünkü endianness çıktısını etkilemez od -a.
Random832

3

PHP, 16 bayt

<?=pack(S,14)^B;

Bu, mevcut iki PHP cevabında kullanılmayan iki numara kullanır:

  1. Pack () veya unpack () öğesine iletilen değer yalnızca 0 veya 1 değil, herhangi bir şey olabilir.
  2. Bitsel XOR işleci ( ^) dizgelerde çalışır ve sonuç yalnızca kısa dizge olduğu sürece dizge endeksleme veya üçlü işleç gereksiniminden kaçınır.

2

Düğüm, 42 bayt

n=>require('os').endianness()[0]

Pro: Bir yerleşik var. Con: mülk adları çok uzun


2

PowerShell, 44 bayt

[char](66+10*[BitConverter]::IsLittleEndian)

Karakter 66 Bve 10 karakter sonra 76 numaradır L. Boolean "true" değeri 1bir sayıya çevrildiğinde olur . BitConverterstandart bir .NET sınıfıdır.


1

Raket, 35 28 bayt

(if(system-big-endian?)'B'L)

'Bveya 'Lsırasıyla. Bu yeterince spesifik değilse bana bildirin :)



1

Haskell (yalnızca GHC boyut sınırlamalı sayısal türlerini kullanarak), 75 bayt

import Unsafe.Coerce
import GHC.Int
f="BL"!!fromEnum(unsafeCoerce 1::Int8)

(büyük bir endian mimarisinde denenmedi, ancak çalışması gerekiyor gibi görünüyor !)


1

K, 15 bayt

    ("bl")@*6h$-8!`
    ,"l"

Açıklama;

    From right to left;
    -8!`       /serialises the back tick and returns (0x010000000a000000f500)
    6h$-8!`    /This casts the result to `int which is type 6h(could have used `int$-8!`) - the result is (1 0 0 0 10 0 0 0 245 0i)
    *6h$-8!`   /* means first, we take the first item which is 1. Since it will be either 1 or 0, we can use it to index (@) into the two element list on the left i.e. ("bl")1 returns "l" and ("bl")0 returns b

1

Bash, 27 bayt

iconv -tucs2<<<䉌|head -c1

( U + 424c ) üç UTF-8 bayt olarak kodlanır: E4 89 8C.

iconvFonksiyonu glibc'den kullanan ve UTF-8 yerel ayarının kullanıldığı varsayılmaktadır .

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.