ถอดรหัสสตริง


41

นี่เป็นความท้าทายครั้งแรกของฉันใน ppcg!

อินพุต

สตริงที่ประกอบด้วยอักขระ ASCII สองตัวที่แตกต่างกัน ตัวอย่างเช่น

ABAABBAAAAAABBAAABAABBAABA

ท้าทาย

ภารกิจคือถอดรหัสสตริงนี้ตามกฎเหล่านี้:

  1. ข้ามอักขระสองตัวแรก
  2. แยกส่วนที่เหลือของสตริงออกเป็นกลุ่มละ 8 ตัวอักษร
  3. ในแต่ละกลุ่มให้แทนที่อักขระแต่ละตัวด้วย0ถ้าอักขระนั้นเหมือนกันกับอักขระตัวแรกของสตริงเดิมและ1อื่น ๆ
  4. ตอนนี้แต่ละกลุ่มแสดงถึงไบต์ แปลงแต่ละกลุ่มให้เป็นอักขระจากรหัสอักขระไบต์
  5. เชื่อมอักขระทั้งหมดเข้าด้วยกัน

ตัวอย่าง

ลองถอดรหัสสตริงข้างต้น

 AB  AABBAAAA  AABBAAAB  AABBAABA
 ^^     ^         ^         ^
 |      |         |         |
 |      \---------|---------/
 |                |
Skip      Convert to binary

ขอให้สังเกตว่าAเป็นตัวอักษรตัวแรกในสตริงเดิมและBตัวที่สอง ดังนั้นแทนที่แต่ละAที่มี0และแต่ละคนด้วยB 1ตอนนี้เราได้รับ:

00110000  00110001  00110010

ซึ่งอยู่[0x30, 0x31, 0x32]ในไบนารี ค่าเหล่านี้เป็นตัวแทนของตัวอักษรตามลำดับเพื่อผลลัพธ์สุดท้ายที่ควรจะเป็น["0", "1", "2"]012

เกณฑ์การให้คะแนน

แน่นอนว่านี่คือซึ่งหมายถึงทำให้รหัสของคุณสั้นที่สุด คะแนนวัดเป็นไบต์

ข้อ จำกัด และรูปแบบ IO

ใช้กฎมาตรฐาน นี่คือกฎเพิ่มเติมบางส่วน:

  • คุณสามารถรับอินพุตที่ถูกต้องได้
    • สตริงที่ป้อนประกอบด้วยอักขระที่แตกต่างกันสองตัว
    • อักขระสองตัวแรกนั้นแตกต่างกัน
    • ความยาวที่น้อยที่สุดของสตริงอินพุตคือ 2 ตัวอักษร
    • ความยาวจะให้ 2 โมดูโล 8 เสมอ
  • คุณสามารถสันนิษฐานได้ว่าสตริงจะประกอบด้วยอักขระ ASCII ที่พิมพ์ได้เท่านั้น
    • ทั้งในอินพุตและในสตริงที่ถอดรหัส
  • ช่องว่างนำหน้าและต่อท้ายได้รับอนุญาตในผลลัพธ์ (ทุกอย่างที่ตรงกัน/\s*/)

5
ต้องบอกว่าผู้ชายสำหรับความท้าทายครั้งแรกนี่เป็นหนึ่งในความท้าทายที่จัดรูปแบบที่ดีกว่าที่ฉันเคยเห็น ในฐานะที่เป็น fyi sandbox ของชุมชนเป็นสถานที่ที่ยอดเยี่ยมสำหรับข้อเสนอแนะก่อนโพสต์ดังนั้นคุณจะไม่ถูกวางระเบิดแบบสุ่มสำหรับกฎที่คุณไม่รู้จัก
Magic Octopus Urn

@MagicOctopusUrn ขอขอบคุณ! ไม่ทราบเกี่ยวกับ sandbox ฉันจะโพสต์ที่นั่นในครั้งต่อไป :)

2
ส่วนใหญ่ฉันจะใช้เพื่อให้ผู้คนสามารถโทรหาฉันสำหรับคำถามที่ซ้ำกันง่ายมากที่จะปฏิบัติตามกฎค่อนข้างยากที่จะรู้เกี่ยวกับการหลอกโดยไม่ต้องจำเมตา :) ฉันขอแนะนำให้ตรวจสอบห้องสนทนาเรามีการสนทนาเกือบทุกภาษาที่คุณสามารถหวังว่าจะเรียนรู้และสนับสนุนคำถาม
Magic Octopus Urn

1
ความท้าทายครั้งแรกที่ยอดเยี่ยม! บางกรณีทดสอบเพิ่มเติมจะเรียบร้อย
ลินน์

ความท้าทายแรกที่ดีจริงๆ สนุกกับการเล่นกับอันนี้
ElPedro

คำตอบ:


13

brainfuck , 76 71 65 ไบต์

-6 ไบต์ขอบคุณ Nitrodon!

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

ลองออนไลน์!

รู้สึกงูหลามแปลก ๆ ...


1
ไม่ใช่ถ้าคำหลัก 8 รายการใน BF นั้นยาวเท่ากับ Python
user202729

ช่วยให้ BF แปลงยูนิโคดโดยอัตโนมัติ
LastStar007


8

Stax , 15 11 ไบต์

ó║¥U⌂½íèäöñ

เรียกใช้และแก้ไขปัญหาได้ที่ staxlang.xyz!

วิธีสกปรกอย่างรวดเร็ว 'n' พยายามปรับปรุงมัน ปรับปรุงแล้ว!

คลายการแพคข้อมูล (13 ไบต์) และคำอธิบาย

2:/8/{{[Im:bm
2:/              Split at index 2. Push head, then tail.
   8/            Split into length-8 segments.
     {      m    Map block over each segment:
      {  m         Map block over each character:
       [             Copy first two elements (below) in-place.
        I            Index of character in first two characters.
          :b       Convert from binary.
                 Implicit print as string.

Ahhhh ... ฉันรู้ว่านี่จะชนะเรา
Magic Octopus Urn

6

JavaScript (Node.js) , 67 ไบต์

s=>s.replace(/./g,x=(c,i)=>(x=x*2|c==s[1],Buffer(i<3|i&7^1?0:[x])))

ลองออนไลน์!

อย่างไร?

เราใช้ไวยากรณ์ที่แตกต่างกันสองแบบของตัวBufferสร้าง:

  • Buffer([n])สร้างบัฟเฟอร์ที่มี แต่เพียงผู้เดียวไบต์nและบังคับให้ตัวอักษร ASCII ที่สอดคล้องกัน เฉพาะ 8 บิตที่มีนัยสำคัญน้อยที่สุดของnเท่านั้นที่ถูกพิจารณา
  • Buffer(n)สร้างบัฟเฟอร์ของnไบต์ ดังนั้นBuffer(0)สร้างบัฟเฟอร์ว่างเปล่าซึ่งถูกบีบอัดให้เป็นสตริงว่าง

หมายเหตุ: ทั้งคู่ถูกคัดค้านในโหนดรุ่นล่าสุด Buffer.from([n])และBuffer.alloc(n)ควรใช้แทน

แสดงความคิดเห็น

s =>                   // given the input string s
  s.replace(/./g, x =  // initialize x to a non-numeric value (will be coerced to 0)
    (c, i) => (        // for each character c at position i in s:
      x = x * 2 |      //   shift x to the left
          c == s[1],   //   and append the new bit, based on the comparison of c with s[1]
      Buffer(          //   invoke the constructor of Buffer (see above):
        i < 3 |        //     if i is less than 3
        i & 7 ^ 1 ?    //     or i is not congruent to 1 modulo 8:
          0            //       replace c with an empty string
        :              //     else:
          [x]          //       replace c with the ASCII char. whose code is the LSB of x
      )                //   end of Buffer constructor
  ))                   // end of replace(); return the new string

6

bash, 59 58 52 ไบต์

tr -t "$1" 01 <<<$1|cut -c3-|fold -8|sed 'i2i
aP'|dc

ลองออนไลน์!

ขอบคุณวัวที่ต้มตุ๋นสำหรับการบันทึก 6 ไบต์

ความท้าทายนี้ทำงานได้ดีอย่างน่าทึ่งกับชุดแกนกลาง (และdcเพื่อทำการแปลงและส่งออกในตอนท้าย) ก่อนอื่นเราใช้

tr -t "$1" 01 <<<$1

เพื่อถอดอักขระสองตัวในอินพุตเป็นศูนย์และอักขระ การ-tตั้งค่าสถานะตัดทอนอาร์กิวเมนต์แรกเป็นความยาวของวินาทีดังนั้นจะลดการทับศัพท์ตัวละครสองตัวแรกในอินพุต0และและ1ซึ่งเป็นสิ่งที่เราต้องการ จากนั้น

cut -c3-

ลบอักขระสองตัวแรกและ

fold -8

เอาต์พุต 8 ของอักขระต่อบรรทัด ในที่สุดsedคำสั่งเปลี่ยนแต่ละบรรทัดเป็นdcข้อมูลโค้ดที่อ่านตัวเลขเป็นไบนารี่และเอาท์พุทไบต์


ยินดีเสมอที่จะเห็นคำตอบของ bash :) คุณสามารถใช้ sed เพื่อทำให้การคำนวณ dc ง่ายขึ้นโดยการแปลงแต่ละบรรทัดเป็นรหัส dc ที่พิมพ์อักขระแต่ละตัวออกแล้วประเมินค่าใน dc tio.run/##S0oszvj/และ ช่องว่างหลังcut -cสามารถถอดออกได้)
Kritixi Lithos

6

รหัสเครื่อง Z80 บน Amstrad CPC ขนาด 32 31 30 ไบต์

000001  0000  (9000)        ORG &9000
000002  9000  EB            EX DE, HL
000003  9001  46            LD B, (HL)
000004  9002  23            INC HL
000005  9003  5E            LD E, (HL)
000006  9004  23            INC HL
000007  9005  56            LD D, (HL)
000009  9006  1A            LD A, (DE)
000010  9007  05            DEC B
000011  9008  13            INC DE
000012  9009  4F            LD C, A
000014  900A                Light
000015  900A  26 01         LD H, &01
000016  900C                Last
000017  900C  13            INC DE
000018  900D  05            DEC B
000019  900E  C8            RET Z
000021  900F                Loop
000022  900F  1A            LD A, (DE)
000023  9010  B9            CP C
000024  9011  28 01         JR Z, Lable
000025  9013  37            SCF
000026  9014                Lable
000027  9014  ED 6A         ADC HL, HL
000028  9016  30 F4         JR NC, Last
000029  9018  7D            LD A, L
000030  9019  CD 5A BB      CALL &BB5A
000032  901C  18 EC         JR Light

รหัสจะใช้คำสั่งแทนที่ตัวละครแต่ละตัวด้วย0ถ้าตัวละครนั้นเหมือนกันกับตัวอักษรตัวแรกของสตริงเดิมและ1อื่น ๆตามตัวอักษรและไม่เคยรำคาญที่จะตรวจสอบว่าตัวละครที่ตรงกับตัวละครที่สองในสายป้อน มันแค่ตรวจสอบตัวอักษรเดียวกับตัวแรกและตัวละครที่แตกต่างจากตัวแรก

ฉันวิ่งออกจากการลงทะเบียน (คน Z80 มีเพียง 7 ที่ใช้งานได้อย่างง่ายดายลงทะเบียน 8 บิตคำแนะนำส่วนที่เหลือจำเป็นอีกต่อไป) ดังนั้นฉันใส่&01ในHพร้อมกับการใช้Lเพื่อสร้างอักขระ ASCII (I เพียงแค่รู้ว่ามันไม่จำเป็นที่จะ initialise Lประหยัดหนึ่งไบต์ ) เมื่อHโอเวอร์โฟลว์ไปยังแฟล็ก Carry ตัวละครในLก็พร้อมที่จะออก โชคดีที่มี 16- บิตADC( โฆษณา d กับC arry) ที่ทำงานของคำสั่งกะซ้าย

(DE)สามารถอ่านได้Aแต่(HL)สามารถอ่านได้ในการลงทะเบียน 8 บิตใด ๆ ดังนั้นจึงเป็นการประนีประนอมที่จะใช้ ฉันไม่สามารถเปรียบเทียบ(DE)กับCโดยตรงเพื่อให้ฉันได้โหลดหนึ่งเข้ามาในAครั้งแรก ป้ายกำกับเป็นเพียงคำสุ่มที่ขึ้นต้นด้วยL(ข้อกำหนดของแอสเซมเบลอร์)

  • A the Accumulator - การลงทะเบียนเท่านั้นที่สามารถทำการเปรียบเทียบได้
  • Bลงทะเบียนที่เคาน์เตอร์สำหรับการเรียนการสอนDJNZ: D ecrement ( B) และJขานถ้ายังไม่มีข้อความเกี่ยวกับZปอง โดยการจัดเรียงรหัสใหม่ฉันสามารถทำงานDJNZด้วยไบต์ที่น้อยลงหนึ่งตัว
  • C อักขระตัวแรกในสตริงอินพุต
  • D, Eเป็นDEที่อยู่ของตัวท่านในปัจจุบัน
  • H ทริกเกอร์พกพา (ทุกวงที่ 8)
  • L อักขระเอาต์พุตที่ถูกสร้างขึ้น

ป้อนคำอธิบายรูปภาพที่นี่


6

05AB1E , 10 ไบต์

¦¦Sk8ôJCçJ

ลองออนไลน์!

-3 ขอบคุณ emigna


Ù             # Unique letters, in order they appear.
 v            # For each...
  yN:         # Push letter and index, replace in input.
     }        # End loop.
      ¦¦      # Remove first x2.
        8ô    # Split into eighths.
          C   # Convert to integer.
           ç  # Convert to char.
            J # Join together entire result.

1
คุณสามารถใช้01‡แทนการวนซ้ำ แก้ไข: หรือดียิ่งขึ้น:¦¦Sk8ôJCçJ
Emigna


5

J, 17 13 ไบต์

u:_8#.\2}.1{=

-4 ขอบคุณ FrownyFrog

เวอร์ชั่นเก่า:

u:_8#.\2&({.i.}.)

คำอธิบาย:

u:_8#.\2}.1{=
            =  | Self classify, for each unique element x of y, compute x = y, element-wise
          1{   | Second row
       2}.     | Drop 2
  _8#.\        | Convert non-intersecting subarrays of length 8 from binary
u:             | Convert to characters

ตัวอย่าง:

   = 'ABAABBAAAAAABBAAABAABBAABA'
1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1
0 1 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0

   2}.1{= 'ABAABBAAAAAABBAAABAABBAABA'
0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0

   _8#.\2}.1{= 'ABAABBAAAAAABBAAABAABBAABA'
48 49 50

   u:_8#.\2}.1{= 'ABAABBAAAAAABBAAABAABBAABA'
012

1
2}.1{=เพื่อบันทึก 4 ไบต์
FrownyFrog

โอ้ข้าผูกแล้ว ... ข้าไม่สามารถหาไบต์อื่นได้
Magic Octopus Urn

1
@MagicOctopusUrn ก็จริงตัวอย่างก็ควรจะมี[:ในช่วงเริ่มต้น :)
FrownyFrog


5

R , 71 ไบต์

function(s)intToUtf8(2^(7:0)%*%matrix((y=utf8ToInt(s))[-1:-2]==y[2],8))

ลองออนไลน์!

น่าประหลาดใจที่กอล์ฟ!

ครั้งแรกที่แปลงสตริงเพื่อ ASCII รหัสจุดที่มีบันทึกเป็นutf8ToInt การถอดตัวละครสองตัวแรกที่มีการจัดทำดัชนีเชิงลบจะสั้นกว่าการใช้ytail

อาเรย์y[-1:-2]==y[2]นั้นเทียบเท่ากับบิตเมื่อ%*%มีการใช้การคูณเมทริกซ์ แต่ก่อนอื่นเราจะเปลี่ยนรูปร่างของอาเรย์นั้นmatrixด้วยnrow=8การแปลงจากอาเรย์เชิงเส้นไปเป็นการจัดกลุ่มไบต์ โชคดีที่เราก็สามารถแปลงไปจุดรหัส ASCII โดยใช้คูณเมทริกซ์ที่มีอำนาจที่เหมาะสมของ 2, และจากนั้นเราแปลงจุดรหัสกลับไปสตริงกับ2^(7:0)intToUtf8



4

PHP, 73 71 ไบต์

while($s=substr($argn,-6+$i+=8,8))echo~chr(bindec(strtr($s,$argn,10)));

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

golfings:

  • ดัชนีเริ่มต้นที่-6และเพิ่มขึ้นก่อน8
  • ใช้ประโยชน์จากการstrtrละเว้นตัวอักษรมากเกินไปในพารามิเตอร์ที่ยาวขึ้น (ไม่substrจำเป็น)
  • แปล10แล้วกลับความต้องการไม่มีคำพูด -> -1 ไบต์
  • อักขระ invert แทนรหัส ascii -> ~ทำหน้าที่เป็นขอบเขตของคำ -> -1 ไบต์

3
อย่างน้อยคุณควรจับคู่ brainfuck:for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Christoph

2
@ Christoph ฉันชอบที่ Brainfuck เป็นมาตรฐานสำหรับความยาวคำตอบที่สมเหตุสมผล
นิตย์

4

Pyth, 20 9 ไบต์

CittxLQQ2

บันทึก 11 ไบต์ด้วย FryAmTheEggman

ลองที่นี่

คำอธิบาย

CittxLQQ2
    xLQQ    Find the index of each character in the string.
  tt        Exclude the first 2.
 i      2   Convert from binary.
C           Get the characters.

@FryAmTheEggman ขอบคุณ เห็นได้ชัดว่าฉันยังมีอะไรอีกมากให้เรียนรู้เกี่ยวกับ Pyth
ช่วยในการจำ

ฮ่าฮ่าฉัน! มันเป็นภาษากอล์ฟที่ซับซ้อนมาก ฉันหวังว่าคุณจะเล่นกอล์ฟต่อไป :)
FryAmTheEggman

3

Ruby , 82 79 ไบต์

->s{s[2..-1].tr(s[0,2],'01').chars.each_slice(8).map{|s|s.join.to_i(2).chr}*''}

ลองออนไลน์!


1
ยินดีต้อนรับสู่ PPCG! ฉันไม่เห็นว่ามีอยู่แล้วคำตอบในรูบีก่อนที่ผมโพสต์ของเราเอง แต่บางเทคนิคการเล่นกอล์ฟทั่วไปนำไปใช้กับวิธีการของคุณมากเกินไป - เช่นสุดท้าย.joinจะถูกแทนที่ด้วย*''และโดยs[0..1] s[0,2]
คิริลล์ลิตร

3

Japt, 11 ไบต์

¤£bXÃò8 ®Íd

ลองมัน


คำอธิบาย

¤               :Slice from the 3rd character
 £  Ã           :Map over each X
  bX            :  Get the first 0-based index of X in the input
     ò8         :Split to an array of strings of length 8
        ®       :Map
         Í      :  Convert from base-2 string to base-10 integer
          d     :  Get the character at that codepoint

ใช้s2ทางลัดอย่างชาญฉลาดดีมาก
นิด

3

PHP + GNU หลายแม่นยำสูง, 63 61

<?=gmp_export(gmp_init(substr(strtr($argn,$argn,"01"),2),2));

น่าเสียดายที่ส่วนขยายของ GMP ไม่ได้เปิดใช้งานเป็นค่าเริ่มต้น (แต่จัดส่ง)

ทำงานแบบนี้:

echo "ABABABAAAAABABAAAAAABAABBAABAAAABBABAAABBB" | php -F a.php

<?=บันทึก 2 ไบต์และอาจเป็นวันที่ ;-)
ติตัส

@Tios ใช่ แต่น่าเสียดายที่มันไม่ได้ทำงานด้วย-R(ฉันพยายาม)
Christoph

1
ลอง-Fแทน
ติตัส


3

Java 8, 143 142 141 ไบต์

s->{char i=47;for(;++i<50;)s=s.replace(s.charAt(i%2),i);for(i=2;i<s.length();)System.out.print((char)Long.parseLong(s.substring(i,i+=8),2));}

-1 ขอบคุณไบต์@ OlivierGrégoire

ลองออนไลน์

คำอธิบาย:

s->{                            // Method with String parameter and no return-type
  char i=47;                    //  Index character, starting at 47
  for(;++i<50;)                 //  Loop 2 times
    s.replace(s.charAt(i%2),i)  //   Replace first characters to 0, second characters to 1
  for(i=2;i<s.length();)        //  Loop `i` from 2 upwards over the String-length
    System.out.print(           //   Print:
     (char)                     //    As character:
      Long.parseLong(           //     Convert Binary-String to number
       s.substring(i,i+=8)      //      The substring in range [i,i+8),
      ,2));}


2

Python 3 , 99 86 ไบต์

lambda s:[chr(int(str(list(map(s.find,s[i:i+8])))[1::3],2))for i in range(2,len(s),8)]

ลองออนไลน์!

ขอบคุณ ASCII-only สำหรับทุกสิ่งจริงๆ


ดี แต่มันล้มเหลวที่นี่

86 พอร์ตของงูหลาม 2 วิธี ส่งคืนตามรายการ แต่อย่างน้อยก็ใช้งานได้
เฉพาะ ASCII เท่านั้น

2

APL + WIN, 30 ไบต์

ดัชนีเริ่มต้น 0 พร้อมรับคำสำหรับการป้อนสตริง

⎕av[2⊥¨(+\0=8|⍳⍴b)⊂b←2↓s≠↑s←⎕]

คำอธิบาย:

s≠↑s←⎕ prompts for string and creates binary vector not equal to first character

b←2↓s drops first two elements of binary

(+\0=8|⍳⍴b)⊂ splits binary into groups of 8

2⊥¨ converts each group to decimal

⎕av[...] displays decoded characters

ฉันคิดว่า Quad-AV นั้นสอดคล้องกับ ASCII สำหรับ APL + WIN หรือไม่
Zacharý

@ Zacharýใช่สำหรับ 128 ตัวแรก อักขระ APL พิเศษแทนที่อักขระบางตัวในชุดอักขระ ASCII ที่ขยายเพิ่ม
เกรแฮม

2

สีแดง 110 ไบต์

func[s][t: 0 i: 128 foreach c next next s[if c = s/2[t: t + i]i: i / 2 if i = 0[prin to-char t t: 0 i: 128]]] 

ลองออนไลน์!

คำอธิบาย:

ทางออกที่เรียบง่ายตรงไปตรงมาไม่มี builtins

f: func [s] [                      ; s is the argument (string)
    t: 0                           ; total - initially 0
    i: 128                         ; powers of 2, initially 0
    b: s/2                         ; b is the second charachter
    foreach c next next s [        ; for each char in the input string after the 2nd one
        if c = b [t: t + i]        ; if it's equal to b than add the power of 2 to t
        i: i / 2                   ; previous power of 2
        if i = 0 [                 ; if it's 0 
            prin to-char t         ; convert t to character and print it
            t: 0                   ; set t to 0
            i: 128                 ; i to 128
        ]
    ]
] 

2

Google ชีต, 123 ไบต์

=ArrayFormula(Join("",IfError(Char(Bin2Dec(Substitute(Substitute(Mid(A1,3+8*(Row(A:A)-1),8),Left(A1),0),Mid(A1,2,1),1))),""

A1ป้อนข้อมูลอยู่ในมือถือ Google จะเพิ่ม)))ในตอนท้ายของสูตรโดยอัตโนมัติ

คำอธิบาย:

  • Mid(A1,3+8*(Row(A:A)-1),8) คว้าชิ้นอักขระ 8 ตัวในแต่ละครั้งโดยเริ่มจากตัวที่สาม
  • Substitute(Mid(~),Left(A1),0) แทนที่แต่ละอินสแตนซ์ของอักขระตัวแรกด้วย 0
  • Substitute(Substitute(~),Mid(A1,2,1),1) แทนที่อักขระตัวที่สองด้วย 1
  • Char(Bin2Dec(Substitute(~))) แปลง chunk เป็นทศนิยมจากนั้นเป็น ASCII
  • IfError(Char(~,""))แก้ไขข้อผิดพลาดทั้งหมดที่เป็นผลมาจากความจริงที่ว่าRow(A:A)ผลตอบแทนที่ไกลค่าเกินกว่าที่เราเพื่อBin2Decให้เราเป็นจำนวนมากของค่านิยมและศูนย์Charข้อผิดพลาดออกมาในศูนย์
  • ArrayFormula(Join("",IfError(~)))รวมCharผลลัพธ์ทั้งหมดเข้าด้วยกันและArrayFormulaเป็นสิ่งที่ทำให้การRow(A:A)คืนค่าอาร์เรย์เป็นค่าแทนที่จะเป็นเพียงค่าแรก

2

Ruby , 61 42 ไบต์

-19 ไบต์ขอบคุณ benj2240

->s{[s[2..-1].tr(s[0,2],"01")].pack("B*")}

ลองออนไลน์!


packเป็นตัวเลือกที่ได้รับแรงบันดาลใจ แต่ตอนนี้คุณกำลังเดินทางไกล มันสามารถทำงานได้มากขึ้นสำหรับคุณ
benj2240

1
อ้างว่าเป็นความคิดที่บล็อกทั้งหมดจากด้านข้างของฉัน ...
คิริลล์ลิตร



2

Python 2 , 88 ไบต์

i=input()
f=''.join('10'[x==i[0]]for x in i[2:])
while f:print chr(int(f[:8],2));f=f[8:]

ลองออนไลน์!

ไม่ใช่วิธีที่สั้นที่สุด - เป็นอีกทางเลือก

เวอร์ชันต่อไปนี้จะพิมพ์เอาต์พุตบนหนึ่งบรรทัดเป็น 98 ไบต์แม้ว่าจะระบุกฎว่าอนุญาตให้เว้นวรรคช่องว่างได้:

i=input();f=''.join('10'[x==i[0]]for x in i[2:]);o=""
while f:o+=chr(int(f[:8],2));f=f[8:]
print o

ลองออนไลน์!


ผลลัพธ์สุดท้ายควรอยู่ในหนึ่งบรรทัดไม่ใช่สามบรรทัด
idrougge

จาก OP: "อนุญาตช่องว่างนำหน้าและต่อท้ายในเอาต์พุต (ทุกสิ่งที่ตรงกับ / \ s * /)" ขึ้นบรรทัด/\s*/ใหม่
ElPedro

1
ขออภัยฉันไม่รอบรู้ในสัญกรณ์ regex : /
idrougge

ทั้งฉัน แต่ฉัน Googled เพียงเพื่อให้แน่ใจ ;-)
ElPedro




1

Haskell , 124 105 93 ไบต์

f(x:_:y)=fromEnum.(/=x)<$>y
g[]=[]
g s=(toEnum.sum.zipWith((*).(2^))[7,6..0])s:g(drop 8s)
g.f

ลองออนไลน์!

fแปลงสตริงไปยังรายการของบิตโดยการเปรียบเทียบตัวละครแต่ละตัวจะเป็นคนแรกที่หันBools fromEnumเข้าไปในศูนย์และคนที่มี gแบ่งรายการนี้ออกเป็นกลุ่ม 8 แปลงเป็นทศนิยมและนำค่าของตัวเลขที่ได้รับมาเป็น a Enumซึ่งCharเป็นตัวอย่างของ

การเปลี่ยนแปลง:

  • -19 ไบต์ขอบคุณ @Laikoni (ลบการนำเข้า, ฝังmapเข้าไปในฟังก์ชั่น)
  • -12 ไบต์แรงบันดาลใจจากคำตอบของ @ Lynn (กำจัดtakeโดยการซิปด้วยรายการที่สั้นกว่า)

2
คุณสามารถใช้toEnumแทนchrและปล่อยการนำเข้า นอกจากนี้สามารถนำมารวมอยู่ในmap สามารถลบgช่องว่างระหว่าง 8 s
Laikoni

1

Forth (gforth) , 83 ไบต์

: f over c@ 0 rot 2 do 2* over i 4 pick + c@ <> - i 8 mod 1 = if emit 0 then loop ;

ลองออนไลน์!

อินพุตเป็นเอาต์พุตเอาต์พุตสตริง (แอดเดรสและความยาว) มาตรฐานที่พิมพ์ไปยัง stdout

คำอธิบาย

over c@          \ get the value of the first character in the string
0 rot            \ add a starting "byte" value of 0 and put the length on top of the stack
2 do             \ start a loop from 2 to length-1
   2*            \ multiply the current byte value by 2 (shift "bits" left one)
   over          \ copy the reference char to the top of the stack
   i 4 pick +    \ add the index and the starting address to get address of the current char
   c@ <>         \ get the char at the address and check if not equal to the reference char
   -             \ subtract the value from our bit count, -1 is default "true" value in forth
   i 8 mod 1 =   \ check if we are at the last bit in a byte
   if            \ if we are
      emit 0     \ print the character and start our new byte at 0
   then          \ and end the if statement
loop             \ end the loop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.