İkili karakter dizesini ASCII eşdeğerlerine dönüştürme


27

Boşluk ile ayrılmış bir ikili karakter dizesini alın ve ASCII dizgisine dönüştürün.

Örneğin...

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

Dönüştürmek istiyorum ...

Hello World

İkili dize adı verilen bir değişkende saklanır s.

Bu bir kod golf mücadelesidir, bu yüzden en kısa çözüm kazanır.


15
Hikayesi ve diğer fripperies olmadan bir meydan okuma yapmak için +1, doğrudan konuya
bebe

9
@bebe Hayali fantastik frikatyalar eğlencenin yarısını oluşturur.
qwr

Merhaba. Teknolojinizin ASCII'yi desteklemeyecek kadar gelişmiş olduğunu hayal edelim. Yerel karakter kodlamasına dönüştürülmesine izin verilir mi, yoksa ASCII'yi yerel karakter kodlamasına dönüştürmesi gerekir mi? ZX81Burada düşünüyorum .
Shaun Bebbers,

Yanıtlar:


10

Ruby, 36 32

s.split.map{|x|x.to_i(2).chr}*""

Veya 31

s.gsub(/\w+ ?/){$&.to_i(2).chr}

Chron sayesinde optimizasyonlar


1
Birkaç karakter kaydetmek .join""için yerine *""kullanabilirsiniz. Bunu ayrıca split + map + join yerine gsub ile yapabilirsiniz: s.gsub(/\w+ ?/){$&.to_i(2).chr}(31 karakter).
Paul Prestidge

2
s.gsub(/\d+./){$&.to_i(2).chr}çalışır ve 30 karakterdir, neden çalıştığı hakkında hiçbir fikrim yok. Bu .son kez eşleşmemeli ama uyuşmuyor.
addison

10

JavaScript (ES6) 49 55 56 64

s.replace(/\d+./g,x=>String.fromCharCode('0b'+x))

Düzenle Kabul et @bebe öneri - teşekkürler
Edit2 İkili sayısal değişmez hakkında bilmiyordum - thanks @kapep
Edit3 Vay 6 not 4 bayt kaydedilmedi thx @ETHproductions

Açıklama olarak yorumların istenilen

String.replace 2 argüman alabilir:

  • normal ifade /\d+./g: bir veya daha fazla rakamdan sonra farklı bir karakter - g bayrağı bir kereden fazla deseni aramak için
  • burada, ok biçiminde belirtilen bir argümandır, burada (x) argümanı bulunan dize olacaktır (sonunda bir boşluk tarafından takip edilen basamakların sırası) ve işlevin değeri değiştirilen şeydir (bu durumda, tek karakter kod).

Dizenin sonunda, regexp'in sonunda boşluk bırakmadan rakam dizisiyle eşleştiğine dikkat edin, bu durumda nokta son rakamla eşleşir. Doğrulamak için '123'.match (/ (\ d +) ./) komutunu deneyin.

(Hala) Şimdiye kadarki en ayrıntılı javascript parçalarından biri ...
(sicime atama sayılmaz)

var s='1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
var x=
s.replace(/\d+./g,x=>String.fromCharCode('0b'+x))

console.log(x)


2
s.replace(/\d+./g,x=>String.fromCharCode(parseInt(x,2)))56
bebe,

2
s.replace(/\d+./g,x=>String.fromCharCode(eval("0b"+x)))55
kapex

Lütfen ne yaptığını açıklar /\d+./g,x=>mısın?
izlin

1
@izlin Cevabına bir açıklama ekledim
edc65

Bunun eski bir cevap olduğunu biliyorum, ancak 4 bayttan tasarruf eval('0b'+x)etmek '0b'+x-0için değişiklik yapabilirsiniz .
ETHProductions

8

Bash + ortak linux programları, 25 bayt

dc<<<2i$s[Pz0\<m]dsmx|rev

dc açıklama

  • yığına 2 itin; pop ve giriş yarıçapı olarak kullanın
  • yığmak için giriş dizesini itin (aynı anda tüm değerler)
  • Özyinelemeli makroyu şöyle tanımlayın m:
    • pop, ardından ASCII olarak değeri yazdır
    • istif yığın derinliğini istiflemek
    • yığmak için 0'a basın
    • pop top 2 yığın değerleri; mboş değilse, makroyu karşılaştır ve çağır
  • yığının çoğaltılmış (makro tanımı)
  • pop ve mkayıt makro kaydetmek
  • pop ve makro yürüt

Öncelikle tüm ikili diziyi yığına ittiğimiz için, her bir değeri açtığımızda, tersten çevrilen dizeyle son buluruz. Bu yüzden, revbunu düzeltmek için yardımcı programı kullanıyoruz .

Örnek kullanım:

$ s="1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
$ dc<<<2i$s[Pz0\<m]dsmx|rev
Hello World
$ 

7

PowerShell, 49

-join(-split$s|%{[char][convert]::toint32($_,2)})

EDIT: Diğer PowerShell cevabını görmedim. Ancak bunu çözmenin sadece bir yolu var.


7

C - 57 43 38/31

38 Bayt sürümü:

for(int*x=s;putchar(strtol(x,&x,2)););

Veya s bir işaretçi ise sadece 31 bayt:

while(putchar(strtol(s,&s,2)));

Bunun tam olarak nasıl ve ne zaman kullanıldığını sanmıyorum ... ama işe yarıyor.


6

Pyth , 12

smCv+"0b"dPZ

S Pyth'da yasal bir değişken olmadığını unutmayın, bu yüzden onun yerine Z kullandım.

Açıklama:

        print(
s             sum(
m                 map(lambda d:
C                     chr(
v                         eval(
+"0b"d                         "0b"+d)),
P                     split(
Z                           Z))))

Örnek:

=Z"<the binary string from above>"smCv+"0b"dPZ
Hello World

Biçimlendirme işleminde boşluk kullanmaması (işte size Python'a bakıyor) büyük bir + 1
işleminde Pharap

@Pharap Evet, Pyth'a bakmanın bir yolu, boşluk, parantez, çok karakterli belirteçler vb. Gibi daha fazla karakter kaldırılmasını sağlayan tüm öğelerin bulunduğu Python'dur.
isaacg

Ben Pyth bilmiyorum ama 4 karakterden kaydetme kullanmak olmaz id2yerine v+"0b"d? Her durumda, bu hem okunamaz hem de harika.
DLosc

@DLosc Bu işlevi sorulduktan sonra, bu soru nedeniyle büyük oranda Pyth'e ekledim. Bugün Pyth ile daha kısa olacaktı, ancak bugünkü Pyth'e bu meydan okuma için izin verilmiyor.
isaacg

Anlıyorum. Böyle bir şey olup olmadığını merak ettim.
DLosc

6

DOS'ta x86 makine kodu - 22 bayt

00000000  30 d2 b4 08 cd 21 2c 30  72 06 d0 e2 08 c2 eb f2  |0....!,0r.......|
00000010  b4 02 cd 21 eb ea                                 |...!..|

Makine kodunda gerçek bir dize değişkeni olmadığından (ve özellikle " s" adlı değişkenler olmadığından ) stdin için girdi olarak yerleştim.

NASM girişi:

    org 100h

section .text

start:
    xor dl,dl
loop:
    mov ah,8
    int 21h
    sub al,'0'
    jb print
    shl dl,1
    or dl,al
    jmp loop
print:
    mov ah,2
    int 21h
    jmp start

6

Güç kalkanı ( 52 49)

-join(-split$s|%{[char][convert]::ToInt16($_,2)})

$ S içindeki ikili dize üzerinden basit döngü. [Convert] dahil etmek zorunda olsa da puanımı öldürür.

EDIT: Gerçekten bunu Powershell'de çekmenin tek bir yolu var, wowie. Joey ve ben ikimiz de aynı cevabı bağımsız olarak çalıştık!

Giriş:

1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100

Çıktı:

Hello World

1
Unary split operatörünü kullanarak üç karakter kaydedebilirsiniz (bu noktada cevaplarımız aynıdır ... büyük sürpriz ;-)).
Joey,

@Joey Ohh, iyi nokta! Bunu kaçırdığıma inanamıyorum. Bunu yakalamak için benden + 1'i aldın, teşekkürler!
02'de

5

Mathematica, 52 bayt

Ah, Mathematica'nın sevimli fonksiyon isimleri

f=FromCharacterCode[#~FromDigits~2&/@StringSplit@#]&

5

Perl 33 32

Düzenleme: Güncelleme çözümü, 32.

say$s=~s/\d+ ?/chr oct"0b$&"/rge

Önceki çözüm (33):

$_=$s;say map{chr oct"0b$_"}split

veya

say map{chr oct"0b$_"}split/ /,$s

Ölçek:

perl -E '$s="1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100";$_=$s;say map{chr oct"0b$_"}split'

5

J (23)

u:;(#.@:("."0))&.>cut s

Ölçek:

   s=:'1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
   u:;(#.@:("."0))&.>cut s
Hello World

Açıklama:

                  cut s    NB. split S on spaces
   (          )&.>         NB. for each element
        ("."0)             NB. evaluate each character
      @:                   NB. and
    #.                     NB. convert bitstring to number
  ;                        NB. unbox each number
u:                         NB. convert to ASCII


4

Python kabuğu  44  40 karakter

''.join(chr(int(x,2))for x in s.split())

Griffin yardımın için teşekkürler .


'' .join (chr (int (x, 2)), s.split () 'de x için)
Griffin

4

APL (15)

⎕UCS{2⊥⍎¨⍕⍵}¨⍎s

Ölçek:

      s←'1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100'
      ⎕UCS{2⊥⍎¨⍕⍵}¨⍎s
Hello World

Açıklama:

  • ⍎s: sbir tamsayı dizisine dönüştürerek değerlendirme . Diziler, boşluklarla ayrılmış sayılar olarak yazılır, bu nedenle ayrılır s.
  • {... : her eleman için:
    • ⍕⍵: sayıyı tekrar dizgeye çevirir
    • ⍎¨: Her bir basamağı değerlendirin
    • 2⊥: base-2 kod çözme, sayıları verme
  • ⎕UCS: her numara için karakter almak

Aksi belirtilmedikçe, karakter yerine bayt saymanız gerekir: codegolf.stackexchange.com/tags/code-golf/info :)
Averroes

1
@Averroes: APL karakter kümesi boş bırakılacak odaya sahip bir bayta uyar: frankenstein.dns.org.uk/~marinus/aplcharset.png
marinus

Ah, bilmiyordum. Benim hatam. Üzgünüm!
Averroes

4

PHP (61)

<?=join(array_map('chr',array_map('bindec',explode(' ',$s))))

foreach(str_split($s,8)as$v)echo chr(bindec($v));
Jörg Hülsermann

@ JörgHülsermann kodlamada baştaki sıfırları atlayabilir bu nedenle str_split($s,8)çalışmayabilir. foreach(explode(' ',$s)as$v)echo chr(bindec($v));geçerli olurdu, ancak zaten açıkça golf oynamayan ilk PPGC cevaplarımdan birini düzenlemeyi planlamıyorum. Yine de teşekkürler!
Christoph

4

Bacchus , 25 bayt

S,' 'j:A=(Ö,2,10b:c),A¨

Açıklama:

S,' 'j D dizisini boş alana bölün ve bir bloğa dönüştürün (bir tür dizi).

:A= önceki Bloğu al ve A değişkenine atama.

(),A¨ A'daki her öğe için

Ö,2,10b Geçerli öğeyi oku (ile temsil Ö taban 2'de ) taban 10'a dönüştürün.

:c önceki değeri al ve char olarak yazdır



3

C - 63

C standart kütüphanede temel 2 çeviriciye sahip olmadığı için: burada test
düzenleyin: var, bunu bilmek için çok aptalım

r;f(char*s){for(;*s;(*s|32)-32||(putchar(r),r=0))r=2*r|*s++&1;}

3

Uzunluk Kodlanmış Brainfuck, 49 bayt çalıştırın

Brainfuck'ta değişken olmadığından, bunun yerine sadece standart girdi ve çıktı kullandım.

Kod 32+tercüman tarafından 32 +sn olarak yorumlanmalıdır. Tercümanınız RLE'yi desteklemiyorsa, sadece bunları manuel olarak değiştirin.

>,[32->+<[16-<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.

Genişletilmiş (RLE olmayan) sürüm: (91 bayt)

>,[-------------------------------->+<[----------------<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.

Kod, EOF'nin 0 olarak kodlandığını varsayar.

açıklama

Aşağıdaki düzen kullanılır:

+---+---+------+
| x | a | flag |
+---+---+------+

xYazdırılacak ASCII baytı nerede astandart girdiden bir karakterdir ve flagboşluksa 1'dir a.

>,            Read a character a into the second cell
[             While not EOF: 
  32-           Decrease a by 32 (a -= ' ')
  >+<           Set the flag to 1 
  [             If a was not a space:
    16-           Decrease by 16 more ('0' == 32+16)
    <[>++<-]      a += 2*x
    >[<+>-]       Move it back (x = a)
    >-<           Reset the flag, it was not a space.
  ]>
  [             If a was a space (flag == 1):
    <<.[-]        Print and reset x
    >>-           Reset the flag
  ]
  <,            Read the next caracter a
]
<.            Print the last character x

1
+1 Çünkü her şey bir beyin avı uygulamasına sahip olmalı.
Pharap

"Run Length Encoded Brainfuck" gerçek bir ayrı dil midir? Tercüman bulamıyorum.
mbomb007

3

Java 8: 60 bayt

Java 8'de (75 bayt) lambda kullanmak:

Arrays.stream(s.split(" ")).reduce("",(a,b)->a+(char)Byte.parseByte(b,2));

Ve statik içe aktarma işlemine izin verirseniz (bunlardan bazıları burada kullanılır), (61 bayt):

stream(s.split(" ")).reduce("",(a,b)->a+(char)parseInt(b,2))

Döngü (60 bayt) kullanan küçük bir bit daha kısa sürüm:

for(String n:s.split(" ")){out.print((char)parseInt(n,2));}

2
Ne, aslında anonim sınıf olarak bilinen canavarlığın yerini aldı mı? Muhteşem.
seequ

@Sieg yes Java şu anda lambdalar / kapaklar da var, ancak çoğunlukla isimsiz sınıfların üstüne sentetik bir şeker ... (tabii ki)
Roy van Rijn

3

Clojure 63 (veya 57)

Tüm Clojure impl:

(apply str(map #(char(read-string(str"2r"%)))(re-seq #"\d+"s)))

Java birlikte çalışma ile:

(apply str(map #(char(Long/parseLong % 2))(.split s" ")))

REPL oturumu:

golf> (def s "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100")
#'golf/s
golf> (apply str(map #(char(read-string(str"2r"%)))(re-seq #"\d+"s)))
"Hello World"
golf> (apply str(map #(char(Long/parseLong % 2))(.split s" ")))
"Hello World"

3

QBasic, 103

s$=s$+" ":FOR i=1 TO LEN(s$):c$=MID$(s$,i,1):IF c$=" "THEN n=0:r$=r$+CHR$(n)ELSE n=n*2+VAL(c$)
NEXT:?r$

Ne? Burada süslü ikili-ondalık işlevimiz yoktur. Kendin Yap!

Bu meta yazıEND IF başına newline'ı (ki eğer if-o zaman-ansız almak için gerekli olduğunu düşünüyorum ) bir bayt olarak sayıyorum . Windows'taki QB64'ün bu şekilde bir kod dosyası kabul edip etmeyeceğini bilmiyorum. Muhtemelen pek önemli değil.


2

DüğümJS - 62

Buffer(s.split(' ').map(function(a){return parseInt(a,2)}))+''

PHP - 75

array_reduce(explode(' ', $b),function($a,$b){return $a.chr(bindec($b));});

nodejs'i es6 uyumluluğu ile nasıl çalıştırıyorsunuz? sonuncusu hala benim için lambda fonksiyonlarını desteklemiyor
bebe

@bebe Arrow işlevleri v8'de uygulanır, ancak henüz düğümle tümleşik değildir. Gönderimi düzenleyeceğim.
cPu1

@ cPu1 benim için çalışıyorlar
username.ak

2

JavaScript 111

Bu sayı dönüşümü ayrıştırma veya değerlendirme yapmadan yapar. İpin geriye doğru okunması ve bit sayılması, eğer varsa bir bit x'in bitmesidir. Bir boşluk bulunduğunda bir sayı bir karaktere dönüştürülür ve bitlerin ayarlanması için yeni bir 0 numarası başlar.

x=n=0,w='',s=' '+s
for(i=s.length;i--;){m=s[i]
if(m==1)n|=1<<x
x++
if(m==' ')w=String.fromCharCode(n)+w,n=x=0
}

1
Eski moda bir şekilde yapmak için + 1 - bir QBasic versiyonu da yazmam için bana ilham verdi.
DLosc

Geçersiz, bir işlev veya tam bir program (girdi alan bir program) olması gerekir
ASCII - yalnızca

2

Harika 64

{it.split(" ").collect{Integer.parseInt(it,2) as char}.join("")}

2

CJam, 11 bayt

NS/{:~2bc}/

s CJam'de yasal bir değişken adı değil, bu yüzden N yerine N seçtim .

Çevrimiçi deneyin.

Örnek çalışma

$ cjam <(echo '
> "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
> :N;
> NS/{:~2bc}/
> '); echo
Hello World

Nasıl çalışır

NS/            " Split N at spaces.                            ";
   {     }/    " For each chunk:                               ";
    :~         "   Evaluate each character ('0' ↦ 0, '1' ↦ 1). ";
      2b       "   Convert from base 2 array to integer.       ";
        c      "   Cast to character.                          ";

2

Haskell - 48 (+13 ithalat (?))

İşte Haskell'deki ilk golf girişimim.

map(chr.foldl1((+).(*2)).map digitToInt)$words s

Data.Char’ı içe aktarmanız gerekir.

kullanım (ghci cinsinden):

Prelude> :m +Data.Char
Prelude Data.Char> let s = "1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100"
Prelude Data.Char> map(chr.foldl1((+).(*2)).map digitToInt)$words s
"Hello World"

Açıklama:

map(chr.foldl1((+).(*2)).map digitToInt)$words s
                                        $words s -- split s on spaces into a list
                         map digitToInt          -- convert each digit in input string to int
              ((+).(*2))                         -- a function that multiplies its first 
-- argument by 2, then adds the second argument
        foldl1((+).(*2)).map digitToInt          -- fold the above over the list of ints: 
-- in other words this is a function that reads strings as binary and gives the value as int
   (chr.foldl1((+).(*2)).map digitToInt)         -- cast to character
map(chr.foldl1((+).(*2)).map digitToInt)$words s -- map our function over the list of words

Umarım ithalat ile ilgili puanlama konvansiyonlarını doğru takip etmişimdir. Yapmazsam düzeltme yapmaktan çekinmeyin. Ghci'de 13'e ithal etmek için gereken ": m + Data.Char" ı 13 olarak kabul ettim.
ballesta25

1

GNU Sed, 19 bayt

Mükemmel bir @Digital Travma cevabından ilham almıştır.

golfed

s/\w*/dc -e2i&P;/eg

Ölçek

echo 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100|\
sed 's/\w*/dc -e2i&P;/eg'

Hello World

1

Pyth, 7 bayt (rekabet etmeyen)

smCid2c

Girdiyi string olarak alır.

Dene!


Rekabet etmeme işaretlendi çünkü dil zorluktan daha yeni.
mbomb007

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.