Missy Elliot, XKCD ve ASCII Baytları


9

Aşağıdaki XKCD çizgi romanından esinlenmiştir:

resim açıklamasını buraya girin

Missy Elliot'un "Work It" filminde koronun bir kısmı şöyle:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Bunu göz önünde bulundurarak, aşağıdaki kod golf mücadelesini öneriyorum:

Sırasıyla aşağıdakileri yapan bir kod oluşturun:

  1. STDIN'den 8-bit ASCII girişi alır; ör. n(Hex 6E veya Kutu 01101110)
  2. Her bir baytın 8 bitini 1 bit seviyesinde kaydırır (bunun bitsel aşağı kaydırma olarak adlandırıldığına inanıyorum), örneğin 01101110olur 00110111("işimi indir");
  3. Her baytın bitlerini tersine çevirir, örneğin 00110111olur 11001000("çevir");
  4. Her bayt için bitleri tersine çevirir, örneğin 11001000olur 00010011 ("tersine çevir");
  5. Bir baytın değeri 32'den küçükse, ASCII'ye dönüştürmeden önce bayt üzerinde (95 + [byte value])veya başka bir deyişle (126-(31-[byte value]))bayt üzerinde gerçekleştirin ... Bayt değeri hala 32'den küçükse, 5. adımı tekrarlayın.
  6. Bir baytın değeri 126'dan büyükse, ASCII'ye dönmeden önce bayt üzerinde ([byte value] - 95)veya başka bir deyişle (32+([byte value]-127))bayt üzerinde gerçekleştirin ... Değer hala 126'dan büyükse, 6. adımı tekrarlayın.
  7. Yeni dönüştürülen dizeyi ASCII olarak görüntüler.

Uygulamada bu kodun bir örneği:

(Girdi, buna değer mi?)

workit missy ("missy" girdi, "workit" işlevdir)

Şimdi perde arkasında ...

(çalışmama izin ver ... İkiliye)

01101101 01101001 01110011 01110011 01111001

(Eşyamı indir ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(...Çevir onu...)

11001001 11001011 11000110 11000110 11000011

(... Ve tersine çevir!)

10010011 11010011 01100011 01100011 11000011

(Ondalık biçime geri dönüştürüldü)

147 211 99 99 195

(Gerekli matematiği yapın)

147-95 211-95 99 99 195-95 => 52 116 99 99 100

(ASCII'ye dönüştür ve ekran, çıkış)

4tccd

kurallar

  1. En kısa kod kazanır ... bu kadar basit ...
  2. Kural 1'in sizin için "çalışmasını" sağlayabildiğiniz sürece, giriş, işlev yoluyla, istemle veya sizin için neyin işe yaradığı olabilir ...;)
  3. Geri dönüşümden sonra değilim, kodun yapmasını istediğim şeyi yapmasını sağlayabildiğim sürece mutlu olacağım ...

İyi şanslar!


3
Bunun geri dönüşümlü bir süreç olmamasına dikkat ediyor muyuz? Bit kayması gerçekleştirildiğinde, en az anlamlı bit esasen atılır.
Sammitch

1
Ben alıyorum 0 1 1 0 1 1 0 1ve 0 1 1 0 1 0 0 1içinmi
marinus

2
Her zaman bu şarkının ne hakkında olduğunu merak ettim ...
boothby

2
Kurallar bunu yapmaz, değil mi? Örneğin: Pbayt değerine dönüşür 235ve çıkarma 95sizi bırakır 140. Hala yazdırılamıyor. Yoksa yanlış mı anladım?
Darren Stone

2
Kuralları değiştirirken dikkatli olun. Mevcut tanımınıza uyan birçok yanıtınız var.
Darren Stone

Yanıtlar:


5

APL  50  45

⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞

Klavyeden giriş alır, örneğin:

      ⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞
missy
4tccd

Ben O kendi çocuğum gibi post sizinkinden çok fazla sürdü (. Düzenle onay bekliyor) 45 cevabınızı aşağıya iyileştirilmesi özgürlüğümü
Tobia

4

GolfScript 43 38 35

{2/~512+2base(;-1%2base-32+95%32+}%

Açıklama: Dizedeki her karakter için aşağıdakileri yapacağız:

2/ # "Put your thing down": do integer division (accomplishing a bit shift).
~ # "Flip it": negate the bits of the integer.
512+ #make sure the binary form will have sufficient initial 0s (the extra initial 1 will be removed).
2base #convert string to value in base 2 (as an array)
(; #remove the initial 1 added by the 512 addition
-1% # "Reverse it": reverse the array
2base #convert back to base 10
-32+95%32+ #this does the equivalent of the subtraction/addition logic

Kullanımı:

echo 'missy' | ruby golfscript.rb workit.gs
> 4tccd

PeterTaylor'dan yardım için teşekkürler.


Zekice, ve şimdiye kadar önde gidiyorsun!
WallyWest

Genellikle bir temel dönüştürme yaptığımda garantili sayıda basamak almanın en iyi yolunun önceden uygun bir değer eklemektir. Yani bunun yerine 2base{0\+.,9<}doolurdu 512+2base(;. Ayrıca böylece ziyade, niyet ise yalnızca doğru çıktı, işlemleri yeniden düzenleyebilirsiniz almak için dikkat {!}%sadece gereken ~temel dönüşüm öncesi girdi (ve daha sonra değiştirmek 512+ile 511&).
Peter Taylor

Teşekkürler @PeterTaylor - 512 numara mükemmel! Ancak sorunun ruhuna göre, olumsuzlamadan önce biraz değişmeliyiz diye düşünüyorum.
Ben Reich

Eğer sayarsak 2/biraz kayması olarak o zaman hala vardiya, sonra biraz olabilir ~, daha sonra baz dönüştürmek ...
Peter Taylor

@PeterTaylor Beğendim! Yardım için teşekkürler.
Ben Reich

3

K, 68 58

{"c"${$[a<32;95;a>126;-95;0]+a:6h$0b/:|~8#0b,0b\:x}'4h$'x}

.

k){"c"${$[a<32;95;a>126;-95;0]+a:6h$0b/:|~8#0b,0b\:x}'4h$'x}"missy"
"4tccd"

2

J - 61

u:-&95^:(>&126)"0+&95^:(<&32)"0#.|."1(1-0,0,}:)"1#:3&u:1!:1[1
missy
4tccd


1

Yakut, 115

Bu giriş rekabet açısından uzundur. Ben de gideceğim, "ama okuyabilirsiniz!" :-P

$><<gets.chars.map{|c|c=(c.ord.to_s(2)[0..-2].tr('01','10').reverse+'11').to_i(2)
(c+(c<32?95:c>126?-95:0)).chr}*''

Şuradan okur stdin:

missy
4tccd

1

Python 2.7, 106

Başka bir uzun cevap, ama hey bu benim ilk denemem:

for c in raw_input():x=sum(1<<7-i for i in range(8)if~ord(c)>>1+i&1);print'\b%c'%(x+95*((x<32)-(x>126))),

Darren Stone ve grc'nin aşağıdaki yorumları temel alınarak değiştirildi ...


Sonra alanı bırakabilirsiniz a:.
Darren Stone

Eğer nihai yerine chrbaşka 1-Char tasarrufu için bu ifadenin: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone

Biraz daha kısa:print'\b%c'%(x+95*((x<32)-(x>126))),
grc

1

Python 2.7-73 86

Kurallardaki değişiklik sayesinde, bunu ikili ve tamsayı manipülasyonu kullanarak yapmanın çok daha basit bir yolunu buldum. Bu, geçici bir değişkene ihtiyaç duymadan Quirlioms üzerinde yer tasarrufu sağlar:

for i in input():print chr((int(bin(ord(i)>>1^255)[:1:-1],2)-32)%95+32),

> python workit.py
"missy"
4 t c c d
> python workit.py
"P Diddy"
- 9 \ t T T d

Ve açıklama formunda:

for i in input():  # Take an input, better quote it
                   # Is it worth it? Let me work it
  print chr(
    int(bin(
        ord(i)>>1  # Put my thing down by bitshifting it
             ^255  # XOR it with 255 to flip the bits and pad to 8 bits
        )[:1:-1]   # Then reverse it (but don't take the cruft
                   # python puts at the start of binary strings)
    ,2) 
    )-32)%95+32    # This pulls everything into the 32-126 range
  ),
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.