Dizeden Bitime Geçiş


10

Görev

Kod noktalarının 0 ile 128 (özel) arasında olduğu bir veya daha fazla ASCII karakterden oluşan bir giriş dizesi verildiğinde aşağıdakileri yapın:

  1. Her karakteri 7 bitlik ASCII koduna dönüştürün (ASCII kodu 7 bitten azsa, baştaki sıfır bitlerini koyun)
  2. Tüm bitleri birleştir (bu , karakter sayısının 7*nbulunduğu bitlerle sonuçlanır n)
  3. Bu bit akışındaki her bit için, önceki bitten farklıysa 1, aksi takdirde 0 yazdırın. İlk çıkış biti daima 1'dir.

Misal

Giriş:

Hi

Çıktı:

11011001011101

Açıklama:

"Hi" dizgisinde ASCII kodları var

72 105

hangi bitlerde:

1001000 1101001

Ve geçiş bitleri göstergeleri:

11011001011101

Bu kod golf. En düşük bayt sayısı kazanır.

Test Durumları

Test örneği 1:

Hello World!
110110010101110011010101101010110001110000111110000110000001011101101010101100110001

Test örneği 2:

%% COMMENT %%
1110111111011111100001100010010100001010110101011010011101010011111110011000001101111110111

Test örneği 3 (Luis Mendo'ya verilen kredi):

##
11100101110010

MATL'de 9 bayt ile en kısa çözüm için Luis Mendo'yu tebrik ediyoruz!


2
Önerilen test örneği ##(önde gelen 0bit; bazı cevaplar şu anda başarısız oldu)
Luis Mendo

4
Bu Manchester kodlama zorluğunun bir kopyası mı? Bir şey mi kaçırıyorum?
gastropner

2
Diğer zorluk , her bir '1' girişinin bir '01' ve her bir '0' girişinin bir '10' 'a çevrilmiş haliyle, bir girdi girdi akımının çift oranlı bir çıktı akımına dönüştürülmesini söylüyor . Bence dupe değil. Çok sayıda insan @ gastropner'ın yukarıdaki yorumunu kaldırırsa, unup dupe yapabilirim (veya bu yeteneğe sahip başka bir kullanıcı)
Luis Mendo

1
@Shaggy: Her iki test vakası da, sadece tek bir bit kümesine sahip olan ve 7. Bu yüzden, sorun ifadesinin her ascii kodunun tam olarak 7 bit uzunluğunda olacağını garanti ettiğini düşünmüyorum.
özyinelemeli

1
@SmileAndNod İkinci düşüncemde, sanırım boş bir dize kullanmanız gerekmiyor.
justhalf

Yanıtlar:


4

MATL , 9 bayt

Hj7&B!hdg

Çevrimiçi deneyin!

açıklama

H     % Push 2
j     % Read line of input, unevaluated
7&B   % Convert to binary with 7 bits. Gives a 7-column matrix
!     % Transpose
h     % Concatenate horiontally. The matrix is read in column-major order
d     % Consecutive differences
g     % Convert to logical. Implicitly display

1
Bu şimdiye kadarki en kısa. +1. Ardışık farklılıklar için yerleşik bir yapıya sahip olmak eğlencelidir.
justhalf


4

Japt -P , 11 bayt

0Matematiksel veya bu durumda üzerinde bitsel işlem yapmaya çalışırken boşlukların JavaScript'te zorlanabilmesinden yararlanır .

c_¤ù7Ãä^ i1

Deneyin veya tüm test senaryolarını çalıştırın

c_¤ù7Ãä^ i1     :Implicit input of string
c_              :Map codepoints
  ¤             :  Convert to binary string
   ù7           :  Left pad with spaces to length 7
     Ã          :End map
      ä^        :XOR consecutive pairs
         i1     :Prepend 1
                :Implicitly join and output

7-bit, 32 ise (boşluk karakteri için) olması gerektiği anlamına gelir 0100000. Ayrıca% karakteri (37)0100101
16'da

Şuan çalışıyor. +1
justhalf

2

CJam , 21 bayt

1q{i2b7Te[}%e__(;.^);

Çevrimiçi deneyin!

açıklama

Yığın, aşağıdaki örnek girdi ile gösteriliyor 5:

1 q      e# Push 1 and then the whole input: 1 "5"
{
  i      e# Convert to its char code: 1 [53]
  2 b    e# Convert to binary: 1 [[1 1 0 1 0 1]]
  7 T e[ e# Left-pad with 0 to length 7: 1 [[0 1 1 0 1 0 1]]
} %      e# Map this block over every character in the string
e_       e# Flatten array: 1 [0 1 1 0 1 0 1]
_ ( ;    e# Duplicate array and remove its first element: 1 [0 1 1 0 1 0 1] [1 1 0 1 0 1]
. ^      e# Element-wise xor: 1 [1 0 1 1 1 1 1]
) ;      e# Remove and pop the last element of the array: 1 [1 0 1 1 1 1]
         e# Stack implicitly printed: 1101111

Bir bitin önceki bitten farklı olup olmadığını görmek için, bit dizisi ile ilk dizi olmadan bit dizisi arasında bir vector (element-wise) xor yaparız. Ayrıca sonucun son bitini de kaldırıyoruz, çünkü bu her zaman uzun dizinin son bitidir.


2

APL (Dyalog Unicode) , 16 bayt SBCS

Tam program. Stdin'den dize ister.

1,2≠/∊1↓¨11DR¨⍞

Çevrimiçi deneyin!

 giriş istemi ("konsolda bir teklif")

11⎕DR¨ her karakteri bit-Boolean D ata R epresentation olarak değiştir

1↓¨ her birinden ilk biti düşür

ϵ nlist (düzleştir)

2≠/ ikili fark

1, başına bir tane



2

Kömür , 25 bayt

⭆θ◧⍘℅鲦⁷←Wⅈ←I﹪⍘KD²←01 ²1

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

⭆θ◧⍘℅鲦⁷←

Tüm karakterleri ikiliye dönüştürün ve 7 uzunluğa kadar doldurun ve yazdırın, ancak imleci son basamağın üzerinde bırakın.

Wⅈ

İmleç ilk basamağın üzerine gelinceye kadar tekrarlayın.

←I﹪⍘KD²←01 ²

Basamakların farklı olup olmadığını hesaplayın ve farkın her basamağının üzerine yazın.

1

İlk basamağın üzerine a ile yazın 1.






1

Dart , 213168 bayt

f(s,{t,i}){t=s.runes.map((r)=>r.toRadixString(2).padLeft(7,'0')).join().split('').toList();for(i=t.length-1;i>0;i--)t[i]=t[i]==t[i-1]?'0':'1';t[0]='1';return t.join();}

Önceki bir astar

f(String s)=>'1'+s.runes.map((r)=>r.toRadixString(2).padLeft(7,'0')).join().split('').toList().reversed.reduce((p,e)=>p.substring(0,p.length-1)+(p[p.length-1]==e?'0':'1')+e).split('').reversed.join().substring(1);

Çevrimiçi deneyin!

Bu ayrıntı ve kolay inşa edilmiş yapı eksikliği bunu gerçekten öldürüyor. Yine de bir astar çekmeyi başardı.

  • Bir astar kullanmadan ve for döngüsü kullanarak -45 bayt


1

Kotlin , 182 bayt

var l='6'
fun f(b:String)=b.fold(""){t,i->t+"".a(i.toInt())}.map{if(l==it){l=it;0} else {l=it;1}}
fun String.a(v:Int):String=if(v<=0)"${this}0".reversed() else "${this}${v%2}".a(v/2)

Çevrimiçi deneyin!

Umarım yakında bunu geliştirebilirim, iyileşme için bazı noktalar olması gerektiğini hissediyorum ama şu anda düşünemiyorum



1

C (gcc (MinGW)), 90 bayt

Sağlayan bir derleyici gerektirir itoa().

n[9],b,c;f(char*s){for(b=*s<64;c=*s++;printf("%07s",itoa((c^c/2)&127,n,2)))c|=b<<7,b=c&1;}


1

Yakut -p , 50 bayt

gsub(/./){"%07b"%$&.ord}
gsub(/./){$`=~/#$&$/?0:1}

Çevrimiçi deneyin!

açıklama

İlk satır, Value Ink'in cevabı ile aynı :

gsub(/./){       $&    }   # Replace each character $&…
                   .ord    # …with its ASCII code…
                %          # …formatted as…
          "%07b"           # …binary digits padded to 7 places.

İkinci çizgi:

gsub(/./){      $&      }  # Replace each character $&…
          $`               # …if the text to its left…
            =~             # …matches…
              /#  $/       # …the Regexp /c$/ where "c" is the character…
                    ?0:1   # …with 0, or 1 otherwise.

Ruby size örn Normal ifade değişmezleri, enterpolasyon kullanabilir /Hello #{name}/ve ile başlayan değişkenler için $ya @sen mesela eğer öyleyse, küme parantezi atlayabilirsiniz $&olan "0"grawlixy sonra /#$&$/olur /0$/.


1

K (ngn / k) , 9 13 bayt

Çözüm:

~=':,/(7#2)\'

Çevrimiçi deneyin!

Açıklama:

~=':,/(7#2)\' / the solution
           \' / convert each
      (   )   / do this together
       7#2    / 2 2 2 2 2 2 2
    ,/        / flatten
 =':          / equal to each-previous?
~             / not

Notlar:

  • Yalnızca 6 bitlik karakterlerden oluşan dizeleri desteklemek için +4 bayt

Bu #, örneğin girdi için başarısız gibi görünüyor (çıktıda yalnızca 6 bit vardır)
Luis Mendo

@streetster, sabit sürümü göndermek istiyor musunuz?
justhalf

1

Emoji kodu , 263 bayt

🏁🍇🔤🔤➡️🖍🆕s🔂b📇🆕🔡👂🏼❗️❗️🍇🍪s🔪🔡🔢b❗️➕128 2❗️1 7❗️🍪➡️🖍s🍉🔤?🔤➡️🖍🆕p🔂b s🍇↪️b🙌p🍇👄🔤0🔤❗️🍉🙅🍇👄🔤1🔤❗️🍉b➡️🖍p🍉🍉

Burada çevrimiçi deneyin .

Ungolfed:

🏁 🍇  💭 Main code block
    🔤🔤 ➡️ 🖍 🆕 s  💭 Start with s as the empty string
    🔂 b 📇 🆕 🔡 👂🏼  💭 For each byte b in the input ...
    ❗️ ❗️ 🍇
        🍪 s  💭 ... append ...
           🔪 🔡 🔢 b ❗️ ➕ 128  💭 ... b + 128 (this gives the leading zero(s) in case the binary representation of b is shorter than 7 digits) ...

                 2  💭 ... in binary ...
              ❗️
              1 7  💭 ... without the leading one ...
           ❗️
        🍪
        ➡️ 🖍 s  💭 ... to s
    🍉
    🔤?🔤 ➡️ 🖍 🆕 p  💭 This will be used as the previous character, by assigning it neither 0 nor 1 we assure the first bit output is always a one
    🔂 b s 🍇  💭 For each character in s:
        ↪️ b 🙌 p 🍇  💭 If it is the same as the previous character ...
            👄 🔤0🔤 ❗️  💭 ... output a zero ...
        🍉 🙅 🍇  💭  ... else ...
            👄 🔤1🔤 ❗️ 💭 ... output a one
        🍉
        b ➡️ 🖍 p  💭 And the current character becomes the new previous character.
    🍉
🍉


1

Python3.8 , 72 bayt

Çözüm:

lambda a:["10"[a==(a:=x)]for x in"".join(bin(ord(i)+128)[3:]for i in a)]

Açıklama:

Python 3.8, atama ifadelerini (standart atama ifadeleri yerine) tanıttığından beri, bunları son öğeyi hatırlaması gereken bir liste kavrayışında kullanmak istedim. Bunu yapmanın en iyi yolu bu değildir, ancak atama ifadesini kullanmanın ilginç bir yöntemini gösterir.

Kod, dönüştürülecek dize olan gerekli bağımsız değişkeni alan bir lambda işlevi oluşturur. Çağrıldığında, işlev aşağıdaki gibi ilerler. A'daki her karakter, 6 bitlik karakterlerle uğraşmak için 128'in eklendiği karakter koduna dönüştürülür (ikili gösterim her zaman 8 bit olur ve ilk biti kesebiliriz). Bu sayı ikilik biçime dönüştürülür ve 128 numaralı başlıktan ilk 1 kesilir. Bu yeni dizeler daha sonra daha büyük bir dizeye birleştirilir.

Bu yeni dizgideki her bir karakter için (metnin birleştirilmiş 7 bit gösterimini içerir), karakterin önceki karakterle aynı olup olmadığı kontrol edilir. İlk karakterle ne olur? İlk sonuç karakteri her zaman "1" olmalıdır, bu yüzden sadece son karakter değişkenindeki her şeyin "1" veya "0" olmadığından emin olmalıyız. Bunu, artık artık kullanmadığımız için orijinal parametreyi tekrar kullanarak yapıyoruz. Orijinal dize tek bir "0" ise (tek bir "1" işe yarıyorsa) bu bir sorun olabilir, ancak bunu göz ardı edeceğiz.

Karşılaştırma sırasında, önceki karakter değerlendirildi, bu nedenle önceki karakter değişkenini geçerli karaktere ayarlamak için atama ifadesini kullandığımızda, karşılaştırma ifadelerinin değerlendirmesini etkilemez.

Karşılaştırma, Python'da sırasıyla 1 veya 0 olarak da kullanılabilen Doğru veya Yanlış üretir, bu nedenle bir dizede "1" veya "0" aramak için kullanılır


Dize biçimi değişmez değerlerini kullanarak bazı baytlar kaydedebilirsiniz: bin(ord(i)+128)[3:]->f"{ord(i):07b}"
movatica

1

Tcl , 215 167 140 bayt

{{s {B binary} {X ~$w/64}} {join [lmap c [split $s {}] {$B scan $c c w;$B scan [$B format i [expr 2*$w^$w^$X<<7]] B7 r;set X $w;set r}] ""}}

Çevrimiçi deneyin!

Geçişleri saptamak için birer birer kaydırma ve özel- veya kullanır. Geçerli karakterin lsb'sini sonraki karakterin msb'sine taşır. Lmap tarafından döndürülen listeye katılarak her karakter için çıktıyı birleştirir.

Başlatma ve tekrarlanan komutlarda bayt kaydetmek için varsayılan bağımsız değişkenlere sahip lambdas kullanır.

Çalışma sırasına büyük ölçüde güvenir. Boş dize için çalışır.


1

05AB1E (eski) , 12 bayt

Çb7jð0:¥ÄJ1ì

Çünkü 05AB1E eski sürümünü kullanır jörtülü açık bir gerektiren, birlikte dizeleri katılır Jsonra j05AB1E yeni versiyonunda.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

Ç             # Convert the (implicit) input-string to a list of ASCII code-points
              #  i.e. "Hi#" → [72,105,35]
 b            # Convert each integer to a binary string
              #  → ["1001000","1101001","100011"]
  7j          # Prepend each with spaces to make them length 7,
              # and join everything together to a single string implicitly
              #  → "10010001101001 100011"
    ð0:       # Replace all those spaces with 0s
              #  → "100100011010010100011"
       ¥      # Get the deltas of each pair of 1s/0s
              #  → [-1,0,1,-1,0,0,1,0,-1,1,-1,0,1,-1,1,-1,0,0,1,0]
        Ä     # Get the absolute value of this
              #  → [1,0,1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0,1,0]
         J    # Join them all together
              #  → "10110010111011110010"
          1ì  # And prepend a 1
              #  → "110110010111011110010"
              # (after which the result is output implicitly)

1

Haskell , 137 bayt

import Data.Char
b 0=[]
b n=odd n:b(n`div`2)
d x|x='1'|1<2='0'
c=('1':).map d.(zipWith(/=)<*>tail).concatMap(reverse.take 7.b.(+128).ord)

Çevrimiçi deneyin!

Buradaki en büyük sorun booleanları (XOR'un sonucu) '0' / '1' e dönüştürmektir.





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.