สตริงการเปลี่ยนบิต


10

งาน

รับสตริงอินพุตของอักขระ ASCII หนึ่งตัวหรือมากกว่าที่ codepoints อยู่ระหว่าง 0 ถึง 128 (พิเศษ) ให้ทำดังนี้:

  1. แปลงอักขระแต่ละตัวเป็นรหัส ASCII 7 บิต (ถ้ารหัส ASCII น้อยกว่า 7 บิตใส่ศูนย์นำหน้าบิต)
  2. ต่อเชื่อมบิตทั้งหมด (ผลลัพธ์นี้เป็น7*nบิตที่nจำนวนอักขระ)
  3. สำหรับแต่ละบิตในบิตสตรีมนี้ให้พิมพ์ 1 หากแตกต่างจากบิตก่อนหน้าและพิมพ์ 0 มิฉะนั้น บิตแรกที่ส่งออกคือ 1 เสมอ

ตัวอย่าง

การป้อนข้อมูล:

Hi

เอาท์พุท:

11011001011101

คำอธิบาย:

สตริง "Hi" มีรหัส ASCII

72 105

ซึ่งในบิตคือ:

1001000 1101001

และตัวบ่งชี้บิตการเปลี่ยนแปลง:

11011001011101

นี่คือรหัสกอล์ฟ จำนวนไบต์ต่ำสุดชนะ

กรณีทดสอบ

กรณีทดสอบ 1:

Hello World!
110110010101110011010101101010110001110000111110000110000001011101101010101100110001

กรณีทดสอบ 2:

%% COMMENT %%
1110111111011111100001100010010100001010110101011010011101010011111110011000001101111110111

กรณีทดสอบ 3 (ให้เครดิตกับ Luis Mendo):

##
11100101110010

ขอแสดงความยินดีกับ Luis Mendo สำหรับวิธีแก้ปัญหาที่สั้นที่สุดด้วย 9 ไบต์ใน MATL!


2
กรณีทดสอบที่แนะนำ##( 0บิตนำส่วนหนึ่งคำตอบบางอย่างล้มเหลวในขณะนี้เพราะเหตุนั้น)
Luis Mendo

4
นี่เป็นสิ่งที่ท้าทายการเข้ารหัสแบบแมนเชสเตอร์อย่างไร ฉันพลาดอะไรไปรึเปล่า?
Gastropner

2
ความท้าทายอื่น ๆ กล่าวว่าการแปลงกระแสอินพุทของบิตเป็นกระแสออกสองครั้งที่อัตราการป้อนข้อมูลด้วยกัน '1' แปลไปสู่ '01' และแต่ละป้อนข้อมูล '0' แปลไปสู่ '10' ดังนั้นอย่าหลอกในความคิดของฉัน หากผู้คนจำนวนมากโหวตความคิดเห็นของ @ gastropner ด้านบนฉันสามารถยกเลิกการดักฟัง (หรือผู้ใช้คนอื่นที่มีความสามารถนั้น)
Luis Mendo

1
@Shaggy: ทั้งสองกรณีทดสอบรวมถึงช่องว่างซึ่งมีเพียงชุดบิตเดียวและไม่ใช่ที่ 7 ดังนั้นฉันไม่คิดว่าคำแถลงปัญหาจะรับประกันได้ว่ารหัส ascii แต่ละอันจะมีความยาว 7 บิตอย่างแน่นอน
เรียกซ้ำ

1
@ SmileAndNod ในความคิดที่สองฉันคิดว่าคุณไม่จำเป็นต้องจัดการกับสตริงว่าง
justhalf

คำตอบ:


4

MATL , 9 ไบต์

Hj7&B!hdg

ลองออนไลน์!

คำอธิบาย

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
นี่คือที่สั้นที่สุด +1 มันสนุกที่ได้มีบิวท์อินสำหรับความแตกต่างติดต่อกัน
justhalf


4

Japt -P 11 ไบต์

ใช้ประโยชน์จากความจริงที่ว่าช่องว่างสามารถถูกบังคับ0ใน JavaScript เมื่อพยายามดำเนินการทางคณิตศาสตร์หรือในกรณีนี้การดำเนินการระดับบิตในนั้น

c_¤ù7Ãä^ i1

ลองใช้หรือเรียกใช้กรณีทดสอบทั้งหมด

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 บิตหมายถึงว่าถ้ามันเป็น 32 (สำหรับตัวละครของช่องว่าง) 0100000ก็จะเป็น ตัวละคร% (37) ก็จะเป็นด้วย0100101
justhalf

มันใช้งานได้แล้ว +1
justhalf

2

CJam , 21 ไบต์

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

ลองออนไลน์!

คำอธิบาย

แสดงสแต็กด้วยอินพุตตัวอย่างของ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

เพื่อดูว่าบิตแตกต่างจากบิตก่อนหน้านี้หรือไม่เราทำเวกเตอร์ (องค์ประกอบที่ชาญฉลาด) xor ระหว่างบิตอาร์เรย์และบิตอาร์เรย์โดยไม่มีองค์ประกอบแรก นอกจากนี้เรายังลบผลลัพธ์สุดท้ายเนื่องจากเป็นบิตสุดท้ายของอาร์เรย์ที่ไม่เปลี่ยนแปลง


2

APL (Dyalog Unicode) , 16 ไบต์SBCS

โปรแกรมเต็มรูปแบบ พร้อมต์สำหรับสตริงจาก stdin

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

ลองออนไลน์!

 พรอมต์สำหรับการป้อนข้อมูล ("คำพูดในคอนโซล")

11⎕DR¨ เปลี่ยนอักขระแต่ละตัวเป็น bit-Boolean D ata R epresentation

1↓¨ ปล่อยบิตแรกจากแต่ละ

ϵ รายการ (แบน)

2≠/ ความแตกต่างแบบคู่

1, เสริมหนึ่ง



2

ถ่าน 25 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

⭆θ◧⍘℅鲦⁷←

แปลงอักขระทั้งหมดเป็นไบนารี่และวางลงบนความยาว 7 แล้วพิมพ์ออกมา แต่วางเคอร์เซอร์ไว้เหนือหลักสุดท้าย

Wⅈ

ทำซ้ำจนกว่าเคอร์เซอร์จะอยู่เหนือหลักแรก

←I﹪⍘KD²←01 ²

คำนวณว่าตัวเลขต่างกันหรือไม่และเขียนทับแต่ละหลักด้วยความแตกต่าง

1

เขียนทับหลักแรกด้วย a 1.


2

PowerShell , 73 56 49 ไบต์

$args|%{$b=+$_
6..0}|%{+($c-ne($c=($b-shr$_)%2))}

ลองออนไลน์!

-17 ไบต์ขอบคุณที่ mazzy :)



เยี่ยมมากคุณต้องโพสต์ด้วยตัวเอง
Andrei Odegov

คำตอบนี้สำหรับคุณ เจ้าหญิงของฉันอยู่ในปราสาทอีก :))))
mazzy

1
@mazzy, บางส่วน -7 ไบต์ :)
Andrei Odegov

ยอดเยี่ยมและยอดเยี่ยม! 【ツ】
mazzy


2

อ็อกเท36 36ไบต์

แก้ไขด้วยLuis Mendo

-2 ไบต์ขอบคุณSanchises

@(a)[1;~~diff(de2bi(a,7)'(:))]

ลองออนไลน์!


de2biคุณอาจจะสามารถโกนค่อนข้างไม่กี่ไบต์ด้วย
Sanchises

ไม่ได้ทำงานให้ฉันก่อน @sanchises แต่ฉันจะดูอีกครั้งเมื่อฉันสามารถ
ข้อมูลหมดอายุ


1

Python 2 , 104 ไบต์

lambda w:reduce(lambda(A,P),C:(A+'10'[P==C],C),bin(reduce(lambda a,c:a*128+ord(c),w,1))[3:],('','x'))[0]

ลองออนไลน์!

แทงอย่างรวดเร็วที่มัน


เคล็ดลับที่ชาญฉลาดด้วยa*128+ord(c)! แต่ไม่ใช่reduceและlambdaมีราคาแพงใช่ไหม
justhalf

1

โผ , 213 168 ไบต์

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();}

ก่อนหน้าหนึ่งซับ

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);

ลองออนไลน์!

การใช้คำฟุ่มเฟื่อยและการขาด ins ที่สร้างง่ายนี้คือการฆ่าอันนี้จริงๆ ยังมีการจัดการเพื่อดึงหนึ่งซับแม้ว่า

  • -45 ไบต์โดยไม่ใช้หนึ่งซับและใช้สำหรับลูป


1

Kotlin , 182 ไบต์

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)

ลองออนไลน์!

หวังว่าฉันจะสามารถปรับปรุงได้ในเร็ว ๆ นี้ฉันรู้สึกว่าต้องมีบางจุดที่ต้องปรับปรุง แต่ตอนนี้ฉันไม่สามารถคิดได้




1

Ruby -p , 50 ไบต์

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

ลองออนไลน์!

คำอธิบาย

บรรทัดแรกเหมือนกับคำตอบของ Value Ink :

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

บรรทัดที่สอง:

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.

ในทับทิมคุณสามารถใช้การแก้ไขในตัวอักษร Regexp เช่น/Hello #{name}/และสำหรับตัวแปรที่เริ่มต้นด้วย$หรือ@คุณสามารถละเว้นวงเล็บปีกกาดังนั้นถ้าเช่น$&เป็น"0"แล้ว grawlixy กลายเป็น/#$&$//0$/


1

K (ngn / k) , 9 13 ไบต์

สารละลาย:

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

ลองออนไลน์!

คำอธิบาย:

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

หมายเหตุ:

  • +4 ไบต์เพื่อรองรับสตริงที่ประกอบด้วยตัวอักษร 6 บิตเท่านั้น

ดูเหมือนว่าจะล้มเหลวในการป้อนข้อมูล#(เอาต์พุตมีเพียง 6 บิต)
Luis Mendo

@streetster คุณต้องการโพสต์รุ่นที่แก้ไขหรือไม่
justhalf

1

อิโมจิโคด , 263 ไบต์

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

ลองออนไลน์ได้ที่นี่

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 ไบต์

สารละลาย:

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

คำอธิบาย:

ตั้งแต่ Python 3.8 แนะนำการแสดงออกที่มอบหมาย (แทนที่จะเป็นคำแถลงการมอบหมายมาตรฐาน) ฉันต้องการที่จะใช้มันในรายการความเข้าใจที่จำเป็นต้องจดจำรายการสุดท้าย นี่ไม่ใช่วิธีที่ดีที่สุดในการทำเช่นนี้ แต่แสดงวิธีการที่น่าสนใจในการใช้นิพจน์การมอบหมาย

รหัสสร้างฟังก์ชั่นแลมบ์ดาซึ่งรับอาร์กิวเมนต์ที่ต้องการซึ่งเป็นสตริงการแปลง เมื่อเรียกใช้ฟังก์ชันจะดำเนินการดังนี้ อักขระทุกตัวใน a จะถูกแปลงเป็นรหัสตัวละครซึ่งมีการเพิ่ม 128 สำหรับการจัดการกับตัวละคร 6 บิต (การแทนแบบไบนารี่จะเป็น 8 บิตเสมอและเราสามารถตัดบิตแรก) หมายเลขนี้ถูกแปลงเป็นไบนารีและส่วนหัว (0x) และ 1 เริ่มต้นจากการเพิ่ม 128 ถูกตัดออก สตริงใหม่เหล่านี้จะถูกรวมเข้าด้วยกันเป็นหนึ่งสตริงที่มีขนาดใหญ่กว่า

สำหรับอักขระแต่ละตัวในสตริงใหม่นี้ (ซึ่งมีการแสดงข้อความแบบ 7 บิตที่ต่อกัน) จะมีการตรวจสอบว่าอักขระนั้นเหมือนกับตัวอักษรก่อนหน้าหรือไม่ เกิดอะไรขึ้นกับตัวละครตัวแรก? อักขระผลลัพธ์แรกควรเป็น "1" ดังนั้นเราต้องตรวจสอบให้แน่ใจว่าสิ่งที่อยู่ในตัวแปรอักขระสุดท้ายไม่ใช่ "1" หรือ "0" เราทำสิ่งนี้โดยการนำพารามิเตอร์เดิมมาใช้ใหม่ตอนนี้เราไม่ได้ใช้อีกต่อไป นี่อาจเป็นปัญหาหากสตริงเดิมเป็น "0" เดียว (เกิดขึ้นเพียงครั้งเดียวกับ "1") แต่เราจะไม่สนใจสิ่งนั้น

ในระหว่างการเปรียบเทียบอักขระก่อนหน้านี้ถูกประเมินค่าเป็นอันดับแรกดังนั้นเมื่อเราใช้นิพจน์การมอบหมายเพื่อตั้งค่าตัวแปรอักขระก่อนหน้าเป็นอักขระปัจจุบันจะไม่มีผลต่อการประเมินผลของนิพจน์เปรียบเทียบ

การเปรียบเทียบจะสร้างจริงหรือเท็จซึ่งสามารถใช้เป็น 1 หรือ 0 ตามลำดับใน Python ดังนั้นจึงใช้เพื่อค้นหา "1" หรือ "0" ในสตริง


คุณสามารถบันทึกบางไบต์โดยใช้ตัวอักษรรูปแบบสตริง: bin(ord(i)+128)[3:]->f"{ord(i):07b}"
movatica

1

Tcl , 215 167 140 ไบต์

{{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}] ""}}

ลองออนไลน์!

ใช้ shift-by-one และ exclusive หรือเพื่อตรวจจับการเปลี่ยน ดำเนินการ lsb ของอักขระปัจจุบันเป็น msb ของอักขระถัดไป รวมเอาท์พุทสำหรับแต่ละตัวละครโดยการเข้าร่วมรายการกลับโดย lmap

ใช้ lambdas พร้อมกับอาร์กิวเมนต์เริ่มต้นเพื่อบันทึกไบต์ในการกำหนดค่าเริ่มต้นและคำสั่งที่ทำซ้ำ

ต้องอาศัยคำสั่งในการปฏิบัติงานเป็นอย่างมาก ใช้งานได้กับสตริงว่าง


1

05AB1E (ดั้งเดิม) 12 ไบต์

Çb7jð0:¥ÄJ1ì

ใช้เวอร์ชันดั้งเดิมของ 05AB1E เนื่องจากjรวมสตริงเข้าด้วยกันโดยปริยายซึ่งต้องมีความชัดเจนJหลังจากjในเวอร์ชันใหม่ของ 05AB1E

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Ç             # 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 ไบต์

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)

ลองออนไลน์!

ปัญหาที่ใหญ่ที่สุดที่นี่คือการแปลงบูลีน (ผลของ XOR) เป็น '0' / '1'





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.