Fizz Buzz เป็นข้อความ


29

บทนำ

ฉันไม่ได้โดยเฉพาะอย่างยิ่งทราบว่าแนวโน้มฉวัดเฉวียนเดือดเป็นฟองมาจาก มันอาจจะเป็น meme หรืออะไรบางอย่าง แต่มันค่อนข้างเป็นที่นิยม

ท้าทาย

งานของคุณในวันนี้คือการแปลง Fizz Buzz เป็นไบนารี (0, 1) ตามลำดับและแปลงไบนารีนั้นเป็นข้อความ สิ่งที่ได้มาตรฐานสวย

มันทำงานอย่างไร

FizzBuzzBuzzFizzBuzzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz จะแปลเป็น 01101000 01101001 จากนั้นจะแปลเป็น "hi"

ข้อ จำกัด

  • อินพุตคือ Fizz Buzz ในมุมมองไบนารี (ดูตัวอย่างด้านล่าง)
  • ผลลัพธ์จะต้องเป็นข้อความ
  • คุณสามารถสมมติว่าอินพุต FizzBuzz ถูกต้อง
  • นี่คือไบต์ที่สั้นที่สุดชนะ

อินพุต

FizzBuzzBuzzFizzBuzzFizzFizz FizzBuzzBuzzFizzBizzFizzBizz FizzFizzBuzzFizzFizzFizzBuzz

เอาท์พุต

"Hi!"


15
Meme? เกมนี้เป็นเกมหลัก (ระดับประถมศึกษา)
Beta Decay

2
เราไม่สามารถใช้ช่องว่างในอินพุตได้หรือไม่?
HyperNeutrino

2
เราไม่สามารถใช้พื้นที่นั้นได้หรือไม่? ฉันสามารถบันทึกสามไบต์ถ้าฉันไม่ต้องป้อนพื้นที่นั้น
HyperNeutrino

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

8
@dmckee "บล็อกอื่น" ที่ Joel อ้างถึงคือ Jeff Atwood's ผู้ก่อตั้ง Stackoverflow รายอื่น
pilsetnieks

คำตอบ:


55

C, 59 ไบต์

i;f(char*s){while(*s&3?*s&9||(i+=i+*s%5):putchar(i),*s++);}

ตัวเลขเวทย์มนตร์หมายเลขเวทย์มนตร์ทุกที่!

(นอกจากนี้ C สั้นกว่า Python, JS, PHP และ Ruby ไม่เคยได้ยินจาก!)

นี่คือฟังก์ชันที่รับสตริงเป็นอินพุตและเอาต์พุตไปยัง STDOUT

เกมส์

โครงสร้างพื้นฐานคือ:

i;           // initialize an integer i to 0
f(char*s){
while(...);  // run the stuff inside until it becomes 0
}

ที่นี่ "สิ่งที่อยู่ภายใน" คือพวงของรหัสตามด้วยโดย,*s++ที่เครื่องหมายจุลภาคส่งกลับค่าของอาร์กิวเมนต์ที่สองเท่านั้น ดังนั้นสิ่งนี้จะทำงานผ่านสตริงและตั้งค่า*sเป็นตัวละครทุกตัวรวมถึงการต่อท้าย NUL ไบต์ (เนื่องจาก postfix ++คืนค่าก่อนหน้า) ก่อนที่จะออก

ลองดูที่เหลือ:

*s&3?*s&9||(i+=i+*s%5):putchar(i)

การลอกแบบไตรภาคและการลัดวงจรออกไปสิ่ง||นี้สามารถขยายได้

if (*s & 3) {
    if (!(*s & 9)) {
        i += i + *s % 5;
    }
} else {
    putchar(i);
}

หมายเลขมายากลเหล่านี้มาจากไหน นี่เป็นตัวแทนไบนารีของตัวละครทั้งหมดที่เกี่ยวข้อง:

F  70  01000110
B  66  01000010
i  105 01101001
z  122 01111010
u  117 01110101
   32  00100000
\0 0   00000000

ก่อนอื่นเราต้องแยกช่องว่างและ NUL ออกจากตัวละครที่เหลือ วิธีการทำงานของอัลกอริธึมนี้จะเก็บสะสมของหมายเลข "ปัจจุบัน" และพิมพ์เมื่อใดก็ตามที่มันมาถึงช่องว่างหรือจุดสิ้นสุดของสตริง (เช่น'\0') โดยการสังเกตว่า' 'และ'\0'เป็นตัวอักษรเพียงตัวเดียวที่ไม่มีชุดบิตที่มีนัยสำคัญน้อยที่สุดสองชุดเราสามารถ bitwise และอักขระที่มี0b11ศูนย์เป็นศูนย์ได้ถ้าอักขระนั้นมีช่องว่างหรือ NUL และไม่ใช่ศูนย์

ขุดลึกลงไปในครั้งแรก "ถ้า" FBizuสาขาตอนนี้เรามีตัวละครที่เป็นหนึ่งใน ฉันเลือกที่จะอัปเดตแอคคอมมูเลเตอร์Fของ s และBs เท่านั้นดังนั้นฉันต้องการวิธีการกรองizus สะดวกFและBทั้งสองชุดมีบิตที่สำคัญน้อยที่สองสามหรือเจ็ดและตัวเลขอื่น ๆ ทั้งหมดมีบิตอื่น ๆ อย่างน้อยหนึ่งชุด ในความเป็นจริงพวกเขาทั้งหมดมีบิตที่มีนัยสำคัญน้อยที่สุดที่หนึ่งหรือสี่ ดังนั้นเราสามารถบิตและด้วย0b00001001ซึ่งก็คือ 9 ซึ่งจะให้ 0 FและBและไม่ใช่ศูนย์อื่น ๆ

เมื่อเราได้พิจารณาแล้วว่าเรามีFหรือBเราสามารถ map ให้พวกเขา0และ1ตามลำดับโดยการโมดูลัสของพวกเขา 5 เพราะFเป็น70และเป็นB 66จากนั้นตัวอย่าง

i += i + *s % 5;

เป็นเพียงวิธีการตีกอล์ฟ

i = (i * 2) + (*s % 5);

ซึ่งสามารถแสดงเป็น

i = (i << 1) | (*s % 5);

ซึ่งแทรกบิตใหม่ที่ตำแหน่งสำคัญน้อยที่สุดและเลื่อนทุกอย่างอื่นไป 1

"แต่เดี๋ยวก่อน!" คุณอาจประท้วง "หลังจากที่คุณพิมพ์iจะได้รับการรีเซ็ตเป็น 0 เมื่อใด" ทีนี้putcharมันปลดการทะเลาะกันของมันunsigned charซึ่งมันก็มีขนาด 8 บิต นั่นหมายความว่าทุกอย่างที่ผ่านบิตที่สำคัญน้อยที่สุดที่ 8 (เช่นขยะจากการทำซ้ำก่อนหน้านี้) ถูกโยนทิ้งไปและเราไม่จำเป็นต้องกังวลเกี่ยวกับมัน

ขอบคุณ@ETHproductions ที่แนะนำให้แทนที่57ด้วย9การบันทึกไบต์!


เคล็ดลับที่ดีกับ putchar
Computronium

นี่มันยอดเยี่ยมมาก C ถูกต้อง!
Gustavo Maciel

13
เมื่อพูดถึงการทำสิ่งที่ถูกต้องนี่คือความเห็นที่ไม่ถ่อมตนของฉันว่าควรจะทำอย่างไรเพื่อให้ได้คำตอบกอล์ฟ คุณโพสต์คำตอบที่ชาญฉลาดและชาญฉลาดพร้อมด้วยคำอธิบายที่สมบูรณ์และเป็นลายลักษณ์อักษรที่จะสอนคนเกี่ยวกับภาษาที่อาจเป็นประโยชน์ในสถานการณ์อื่น ๆ
Cody Grey

3
@CodyGray ตรงนี้ หนึ่งในเหตุผลที่ Code Golf ไม่ได้อยู่ในอันดับต้น ๆ ของ SE ที่ฉันเข้าชมบ่อยๆเป็นเพราะคำตอบมากมายเป็นเพียง "รหัสที่นี่" ในขณะที่มันเจ๋งสำหรับคนที่คุ้นเคยกับภาษามากมันก็ดูเหมือนจะเป็นเสียงสำหรับฉัน ฉันชอบที่จะเห็นคำอธิบายเช่นนี้เพราะมันเผยให้เห็นวิธีการซึ่งฉันคิดว่าคนส่วนใหญ่พบว่ามันน่าสนใจกว่าโค้ดตัวเอง เพียงสองเซ็นต์ของฉัน ...
คริส Cirefice

ดีมากเสียดี แต่คุณนับบิตของคุณจาก MSB (ซ้าย) ถึง LSB (ขวา)? IMO วิธีเดียวที่มีเหตุผลในการนับจำนวนบิตในไบต์ 8 บิต (หรือเวกเตอร์ SIMD 128 บิตหรืออะไรก็ตาม) มาจาก LSB = บิต 0 ถึง MSB = บิต 7
Peter Cordes

10

เยลลี่ขนาด 9 ไบต์

Ḳm€4O%5ḄỌ

ลองออนไลน์!


โอ้สมาร์ทแบนมันไม่จำเป็น ดี
HyperNeutrino

@HyperNeutrino หมายเหตุความคิดเห็นที่ฉันได้ทำกับคุณฉันใช้อัลกอริทึมที่แตกต่างกันเล็กน้อยเพื่อหลีกเลี่ยงการซ้ำซ้อน (แม้ว่าฉันจะไม่ชอบมันในทางเทคนิคแล้ว)
Erik the Outgolfer

@downvoter: คุณเคยทดสอบเรื่องนี้มาก่อนหรือไม่
Erik the Outgolfer


9

Python 3 , 169 101 93 91 85 81 ไบต์

lambda s,j="".join:j(chr(int(j('01'[b<"C"])for b in c[::4]),2))for c in s.split())

ลองออนไลน์!

คำอธิบาย:

lambda s,j="".join:  # Create a lambda function
    j(  # call "".join, adds characters together with nothing in between
        chr(  # character by int
            int(  # string to int
                j(  # "".join again
                    '01'[b<"C"]  # 1 or 0, based on what character we get
                    for b in c[::4]  # For every first of 4 characters
                ),
                2)  # Base 2
        )
        for c in s.split()  # for every group of Fizz and Buzz with any whitespace character after it
    )

นั่นเร็วมาก. +1
HyperNeutrino

ฉันทำบางสิ่งบางอย่างคล้ายกับที่ผ่านมามันเป็นเพียงเรื่องของการคัดลอกและเปลี่ยนเป็น FizzBuzz: P
Martmists

1
โอ้ที่อธิบาย : P แต่คุณถูก outgolfed; _;
HyperNeutrino


1
อ๊ะทำมันอีกครั้ง 85 ไบต์ในครั้งนี้ด้วยlambdaฟังก์ชั่น
Mr. Xcoder

8

JavaScript (ES6), 80 79 ไบต์

let f =

s=>`${s} `.replace(/.{4} ?/g,m=>m[s=s*2|m<'F',4]?String.fromCharCode(s&255):'')

console.log(f("FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz"))


ดีมาก. ฉันพยายามและล้มเหลวที่จะเกิดขึ้นกับสิ่งที่สั้นกว่าแม้ว่าจะมีหลายทางเลือกแก้ปัญหา 80 ไบต์ใช้.replace(/..zz/g,, '0b'+ฯลฯ
ETHproductions

@ETHproductions การกำจัดnช่วยให้ถึง 79 เศร้านี้ต้องมีพื้นที่พิเศษเพื่อเพิ่มการป้อนข้อมูล `${s} ` ดังนั้นค่าใช้จ่ายค่อนข้าง
Arnauld

7

Japt , 26 24 19 17 ไบต์

¸®ë4 ®c u5Ãn2 dÃq

ลองออนไลน์!

บันทึก 2 ไบต์ขอบคุณ@Shaggyและ 2 ไบต์ขอบคุณ @ETHproductions

คำอธิบาย

input: "FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz"

¸®                // ["FizzBuzzBuzzFizzBuzzFizzFizzFizz","FizzBuzzBuzzFizzBuzzFizzFizzBuzz","FizzFizzBuzzFizzFizzFizzFizzBuzz"]
  ë4              // ["FBBFBFFF","FBBFBFFB","FFBFFFFB"]
     ®c           // [[70,66,66,70,66,70,70,70],[70,66,66,70,66,70,70,66],[70,70,66,70,70,70,70,66]]
        u5Ã       // ["01101000","01101001","00100001"]
           n2     // [104,105,33]
              d   // ["h","i","!"]
               Ãq // "hi!"

1
คุณสามารถแทนที่ 2 ด้วย}) Ãมีอะไรมากกว่านี้ที่จะได้รับการบันทึกมากกว่านั้น แต่ฉันไม่สามารถทำให้โทรศัพท์ทำงานได้
Shaggy

1
เยี่ยมมากขอบคุณที่ใช้ Japt! คุณสามารถบันทึกสองสามไบต์ได้ด้วยการแทนที่ò4...q n2ด้วยë4...n2( ë4ทำเช่นเดียวกันò4ยกเว้นกลับรายการแรกเท่านั้นที่น่าประหลาดใจมันดูเหมือนจะไม่มีการบันทึกไว้)
ETHproductions

1
@ ETHproductions ขอบคุณที่ทำ Japt!
powelles

6

Ruby, 65 63 60 ไบต์

->s{s.split.map{|x|x.gsub(/..../){$&.ord%5}.to_i(2).chr}*''}

นี่เป็น proc แบบไม่ระบุชื่อที่รับอินพุตและให้เอาต์พุตเป็นสตริง

->s{
s.split            # split on whitespace
.map{|x|           # for each word as x,
  x.gsub(/..../){  # replace each sequence of four characters with
    $&.ord%5       # the ASCII value of the first character, mod 5
                   # F is 70, B is 66, so this yields 0 for Fizz and 1 for Buzz
  }.to_i(2)        # interpret as a binary number
  .chr             # the character with this ASCII value
}*''               # join on empty string
}

6

JavaScript (ES6), 95 88 85 81 ไบต์

s=>s.replace(/..zz/g,m=>m<"F"|0).replace(/\d+ ?/g,m=>String.fromCharCode("0b"+m))
  • 4 ไบต์บันทึกขอบคุณที่ETHproductions

ลองมัน

f=
s=>s.replace(/..zz/g,m=>m<"F"|0).replace(/\d+ ?/g,m=>String.fromCharCode("0b"+m))
oninput=_=>o.innerText=f(i.value)
o.innerText=f(i.value="FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz")
*{font-family:sans-serif}
<input id=i><p id=o>


ฉันเชื่อว่า+สั้นกว่าparseInt
Kritixi Lithos

2
ฉันคิดว่า+(m[0]<"F")อาจถูกตัดให้สั้นลงm<"F"|0
ETHproductions

5

Perl 5, 33 Bytes

print(pack'B*',<>=~y/FB -z/01/dr)

แทนที่ 'F' และ 'B' ในอินพุตด้วย 0 และ 1 ตามลำดับและลบอักขระอื่น ๆ จากนั้นใช้packฟังก์ชันของ perl เพื่อแปลงสตริงบิตนี้เป็นอักขระ ASCII


ว้าวนี่คือ golfed ลงไปประมาณครึ่งหนึ่งของความพยายาม Perl 5 ของฉัน ความรุ่งโรจน์
David Conrad

1
ฉันเชื่อว่าคุณสามารถทำให้สิ่งนี้สั้นลงได้อย่างมากโดยใช้-p0ตัวเลือกบรรทัดคำสั่ง (ซึ่งจะช่วยคุณ<>=~rในการป้อนข้อมูลและอนุญาตให้คุณใช้$_=แทนprint()) ทั้งนี้ขึ้นอยู่กับว่าคุณต้องการที่จะจัดการกับการขึ้นบรรทัดใหม่, 0คุณอาจไม่ได้ต้องการ (แม้ว่าคุณต้องการหลีกเลี่ยงบทลงโทษของตัวเลือกบรรทัดคำสั่งsayจะสั้นกว่าprint)

@Chris ไม่ใช่ของฉัน faubiguy แต่ขอบคุณ. ;)
David Conrad

@DavidConrad ฮ่าฮ่าแย่จัง
คริส

1
คุณไม่จำเป็นต้องมี 0 อย่างแน่นอน เพียงใช้แฟล็ก -p และ$_=pack'B*',y/FB -z/01/drโปรแกรมของคุณจะลดคะแนนลงเหลือ 26 ไบต์
คริส

5

Python 2 , 90 83 82 81 ไบต์

ขอบคุณสำหรับ -1 ไบต์โดยสิ้นเชิงมนุษย์
-1 ไบต์ขอบคุณ Martmists
-1 ไบต์ขอบคุณ Jonathan Frech

lambda x:''.join(chr(int(`[+(l<'D')for l in b[::4]]`[1::3],2))for b in x.split())

ลองออนไลน์!



คุณสามารถบันทึกไบต์โดยเปลี่ยน*1 forเป็น*1for
Martmists

ตั้งแต่คุณใช้*1การแปลงจากบูลเป็นจำนวนเต็มคุณสามารถบันทึกไบต์โดยใช้เป็น+: สามารถ(l<'D')*1for +(l<'D')for
Jonathan Frech

3

ช่องว่าง 123 ไบต์

ตัวแทนที่มองเห็นได้:

SSNNSSNSNSSSNSNSTNTSTTTSSSTSSSSSNTSSTSNSNTSSNSSSTSSTTSNTSSTNTSTNSSSTNTSSSNSSTNSSNSNSSNSTNTSTNTSTNTSTSSSNSNNNSSSNSNTTNSSNSNN

โปรแกรมที่ไม่ได้ทำให้รำลึกถึง:

    push  0
loop:
    dup
    push  0
    dup
    ichr
    get
    push  32
    sub
    dup
    jz    space
    push  38
    sub
    jz    fizz
    push  1
    add
fizz:
    push  0
    dup
    dup
    ichr
    ichr
    ichr
    add
    jmp   loop
space:
    swap
    pchr
    jmp   loop

ไม่มีอะไรแปลกโดยเฉพาะเกี่ยวกับการนำไปใช้งานการเล่นกอล์ฟที่แท้จริงเพียงอย่างเดียวคือการใช้ชั่วขณะชั่วคราวและไม่สนใจเกี่ยวกับการเติบโตของสแต็กที่ไม่มีขอบเขตเพื่อลดจำนวนไบต์ที่เพิ่มขึ้น


3

คู่ , 59 57 53 ไบต์

@(s)['',bi2de(flip(reshape(s(65<s&s<71)<70,8,[]))')']

สิ่งนี้ใช้ไม่ได้กับ TIO เนื่องจากไม่มีการใช้งานกล่องเครื่องมือการสื่อสาร มันทำงานได้ดีถ้าคุณคัดลอกวางคู่ออนไลน์ มันไม่ได้ใกล้เคียงกับรหัสการทำงานใน MATLAB

จัดการเพื่อบันทึกสองไบต์ด้วยการแปลงเมทริกซ์หลังจากพลิกมันแทนวิธีอื่น ๆ

คำอธิบาย:

@(s)             % Anonymous function that takes a string as input
    ['',<code>]  % Implicitly convert the result of <code> to its ASCII-characters

เริ่มกันตั้งแต่กลาง<code>:

s(65<s&s<71)      % Takes the elements of the input string that are between 66 and 70 (B and F)
                  % This gives a string FBBFFBBFBBBFFFBF...
s(65<s&s<71)<70   % Converts the resulting string into true and false, where F becomes false.
                  % Transformation: FBBFFB -> [0, 1, 1, 0, 0, 1]

ขอเรียกที่เกิดบูล (binary) tเวกเตอร์

reshape(t,8,[])       % Convert the list of 1 and 0 into a matrix with 8 rows, one for each bit
flip(reshape(t,8,[])) % Flip the matrix vertically, since bi2de reads the bits from the wrong end
flip(reshape(t,8,[]))' % Transpose it, so that we have 8 columns, and one row per character
bi2de(.....)'          % Convert the result decimal values and transpose it so that it's horizontal

3

Perl 5, 28 ไบต์ + 4 ไบต์สำหรับแฟล็ก = 32 ไบต์

วิ่งด้วยธง -040pE

$_=chr oct"0b".y/FB -z/01/dr

-040 ตั้งค่าตัวคั่นเร็กคอร์ดเป็นช่องว่างเพื่อให้ Perl เห็นแต่ละกลุ่มของ FizzBuzzes เป็นบรรทัดแยกต่างหากจากนั้นวนซ้ำไปตามบรรทัดเหล่านั้นเปลี่ยน F เป็น 0, B เป็น 1 ลบทุกอย่างอื่นจากนั้นเปลี่ยนเป็นไบนารีและจากตรงนั้นเป็น ascii


2

เยลลี่ขนาด 9 ไบต์

Ḳm€4=”BḄỌ

ลองออนไลน์!

Ḳm€4=”BḄỌ  Main Link
Ḳ          Split on spaces
  €        Map
 m 4       Take every fourth letter (F and B)
    =”B    Check if each letter is equal to B (gives the binary representation)
       Ḅ   Binary -> Integer
        Ọ  Unord; gives chr(i)

-3 ไบต์ขอบคุณ Erik the Outgolfer


ขอให้เรายังคงอภิปรายนี้ในการแชท
Erik the Outgolfer


2

Brain-Flak , 107 ไบต์

{(((((()()()()){}){}){})({}[{}])()())((){[()](<{}>)}{}<>)<>{(<{}{}{}{}>)<>({}({}){})<>}{}}<>{({}<>)<>}<>

ลองออนไลน์!

+3 ไบต์สำหรับ -cแฟล็ก

คำอธิบาย

{                                        For each character in input:
 (((((()()()()){}){}){})({}[{}])()())    Push 32-n and 66-n
 ((){[()](<{}>)}{}<>)<>                  If character is B, push 1 on second stack.  Otherwise, push 0
 {                                       If character is not space:
  (<{}{}{}{}>)                           Burn 3 additional characters
  <>({}({}){})<>                         Multiply current byte by 2 and add previously pushed bit
 }                                       (otherwise, the pushed 0 becomes the new current byte)
 {}                                      Remove character from input
}
<>{({}<>)<>}<>                           Reverse stack for output

2

q / kdb +, 41 40 37 33 ไบต์

วิธีการแก้:

{10h$0b sv'66=vs[" ";x][;4*(!)8]}

ตัวอย่าง:

q){10h$0b sv'66=vs[" ";x][;4*(!)8]}"FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz"
"hi!"

คำอธิบาย:

แบ่งสตริงป้อนเข้า" "เพื่อให้รายการที่แตกต่างของFizzBuzz...ดัชนีลงในแต่ละรายการเหล่านี้ที่ตัวละครตัวแรก (เช่น0 4 8 ... 28) ส่งคืนรายการบูลีนที่พิจารณาโดยกำหนดว่าอักขระแต่ละตัวคือ"B"(ASCII 66) แปลงรายการเหล่านี้เป็นฐาน 10 จากนั้นแปลงผลลัพธ์เป็นสตริง

{10h$0b sv'66=vs[" ";x][;4*til 8]} / ungolfed solution
{                                } / lambda function with x as implicit input
              vs[" ";x]            / split (vs) input (x) on space (" ")
                           til 8   / til 8, the range 0..7 inclusive
                         4*        / vectorised multiplication, 0 1 2 3 => 0 4 8 12
                       [;       ]  / index the 2nd level at these indices (0, 4, 8 ... 28)
           66=                     / 66 is ASCII B, 66="FBBFBFFF" -> 01101000b
     0b sv'                        / join (sv) each row back with 0b (converts from binary)
 10h$                              / cast to ASCII (0x686921 -> "hi!")

1

Haskell, 72 ไบต์

(>>= \w->toEnum(foldl1((+).(2*))[mod(fromEnum c)5|c<-w,c<'a']):"").words

ลองออนไลน์!

มันทำงานอย่างไร

            words      -- split input string into words at spaces
(>>=      )            -- map the function to each word and flatten the resulting
                       -- list of strings into a single string
   \w->                -- for each word w
       [  |c<-w,c<'a'] -- take chars c that are less than 'a' (i.e. B and F)
     mod(fromEnum c)5  -- take ascii value of c modulus 5, i.e. convert to bit value
    foldl1((+).(2*))   -- convert list of bit to int
  toEnum(   ):""       -- convert ascii to char.  :"" forces toEnum to be of type String
                       -- now we have a list of single char strings, e.g. ["h","i","!"]        

1

JavaScript ES6 - 98 ไบต์

ไบต์มากเกินไป แต่อย่างน้อยก็สามารถอ่านได้

กำหนดเป็นฟังก์ชั่นมันคือ 98 ไบต์

let s=>s.replace(/(F)|(B)|./g,(c,F,B)=>B?1:F?0:'').replace(/.{8}/g,v=>String.fromCharCode('0b'+v))

ทดสอบ:

"FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz"
.replace(/(F)|(B)|./g,(c,F,B)=>F?0:B?1:'').replace(/.{8}/g,v=>String.fromCharCode('0b'+v))

คำอธิบาย:

/(F)|(B)|./

จับคู่ตัวอักษร F และ B และสิ่งอื่นใดเป็นกลุ่ม

(c,F,B)=>F?0:B?1:''

เป็นฟังก์ชั่นที่จับภาพกลุ่มส่งคืนค่า 0 สำหรับ F และ 1 สำหรับ B หรือ ''

c คืออักขระที่จับคู่
F และ B ตอนนี้เป็นพารามิเตอร์! 3
กลุ่ม ommitted เป็นพารามิเตอร์

F และ B คือundefinedเมื่อจับคู่กลุ่มที่ 3
B คือundefinedเมื่อจับคู่กลุ่ม F

สตริง 0100 .. ที่เป็นผลลัพธ์

ถูกตัดเป็นชิ้น ๆ ละ 8 ไบต์

.replace(/.{8}/g,v=>String.fromCharCode('0b'+v))

และประมวลผลเป็นสตริงไบนารี0b


2
ยินดีต้อนรับสู่ PPCG! วัตถุประสงค์ของความท้าทายนี้คือการให้โปรแกรมหรือฟังก์ชั่นการแปลสตริง FizzBuzz โดยพลการ ฉันไม่รู้ JavaScript แต่การส่งฟังก์ชั่นที่ถูกต้องอาจเป็นs=>s.replace( ...ไปได้ นอกจากนี้โปรดระบุจำนวนไบต์ในส่วนหัวของคำตอบของคุณ
Laikoni

ฉันล้างข้อมูลการจัดรูปแบบโค้ดบางส่วนให้คุณ นอกจากนี้คุณไม่ต้องการletฟังก์ชั่นที่ไม่ระบุชื่อเป็นที่ยอมรับ
Shaggy




0

Google ชีตขนาด 94 ไบต์

=ArrayFormula(JOIN("",CHAR(BIN2DEC(SPLIT(SUBSTITUTE(SUBSTITUTE(A1,"Fizz",0),"Buzz",1)," ")))))

ฉันไม่คุ้นเคยกับเลขฐานสองของ FizzBuzz แต่ดูเหมือนว่าพวกมันถูกกำหนดโดยช่องว่างดังนั้นสูตรนี้จึงอาศัย ตรรกะค่อนข้างง่าย:

  • แทนที่Fizzด้วย0และBuzzด้วย1
  • แยกผลลัพธ์ออกเป็นอาร์เรย์โดยใช้ช่องว่างเป็นตัวคั่น
  • แปลงแต่ละองค์ประกอบจากไบนารีเป็นทศนิยม
  • แทนที่แต่ละองค์ประกอบด้วย ASCII ที่เทียบเท่ากัน
  • เข้าร่วมแต่ละองค์ประกอบโดยไม่มีตัวคั่น

0

Java 8, 117 115 ไบต์

s->{for(String x:s.split(" "))System.out.print((char)Long.parseLong(x.replace("Fizz","0").replace("Buzz","1"),2));}

ฉันสงสัยว่าคุณสามารถทำการแทนที่ regex แฟนซีใน Java ได้เหมือนคำตอบอื่น ๆ ส่วนใหญ่เป็นเพราะคุณไม่สามารถทำอะไรกับกลุ่มการจับภาพใน Java-regexes .. (Ie "$1".charAt(...)หรือ"$1".replace(...)เป็นไปไม่ได้)

คำอธิบาย:

ลองที่นี่

s->{                          // Method with String parameter and no return-type
  for(String x:s.split(" "))  //  Loop over the input split by spaces:
    System.out.print(         //   Print:
     (char)                   //    Each character
     Long.parseLong(          //    after we've converted each binary-String to a long
      x.replace("Fizz","0").replace("Buzz","1")
                              //    after we've replaced the Fizz/Buzz to 0/1
     ,2));
}                             // End of method

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