Zzub Zzif (reverse Fizz Buzz)


36

ให้ตัวอย่างของการส่งออกเสียงพึมพำเป็นฟองที่มีหมายเลขทั้งหมดถูกลบออกกรอกข้อมูลในจำนวนที่ถูกต้องด้วยค่าที่เป็นไปได้ต่ำที่สุดเช่นข้อมูลตัวอย่างของเสียงพึมพำฟองถูกต้อง สำหรับวัตถุประสงค์ของการท้าทายนี้fizzและbuzzมีค่าปกติ 3 และ 5 ตามลำดับ

ถ้าใส่เป็นลำดับที่ไม่ถูกต้องfizz, buzzและสายว่างแล้วแทนการส่งออกเพียงzzubzzif(มีหรือไม่มีการขึ้นบรรทัดใหม่)

อินพุตและเอาต์พุตอาจเป็นบรรทัดที่คั่นด้วยบรรทัดใหม่หรือรูปแบบอาร์เรย์ของสตริงใด ๆ ที่สะดวกสำหรับภาษาของคุณ

คุณอาจเพิกเฉยหรือทำสิ่งที่คุณต้องการด้วยตัวพิมพ์ใหญ่

คุณจะต้องเลือกที่จะจัดการอย่างใดอย่างหนึ่งต่อไปนี้: fizzbuzz, fizz buzz, buzz fizzฯลฯ แต่คุณต้องเลือกอย่างน้อยหนึ่งรูปแบบเหล่านี้

คุณอาจจะคิดว่าทุกท่านเป็นลำดับของบางfizz, buzzและว่างเปล่าเส้น

ตัวอย่าง

การป้อนข้อมูล:
เดือดเป็นฟอง

เอาท์พุท:
2
fizz
4
การป้อนข้อมูล:
ฉวัดเฉวียน
เดือดเป็นฟอง

เอาท์พุท:
buzz
fizz
7
การป้อนข้อมูล:

FizzBuzz


เอาท์พุท:
13
14
fizzbuzz
16
17
การป้อนข้อมูล:


เอาท์พุท:

1
การป้อนข้อมูล:
เดือดเป็นฟอง
เดือดเป็นฟอง

เอาท์พุท:
zzubzzif
การป้อนข้อมูล:


เอาท์พุท:
zzubzzif

คำตอบ:


17

Java, 205 ไบต์

s->{o:for(int i=0,j,h=s.length;++i<16;){for(j=h;j-->0;)if(s[j].contains("fizz")^(i+j)%3<1||s[j].contains("buzz")^(i+j)%5<1)continue o;String z=i+"";for(j=1;j<h;)z+="\n"+(i+j++);return z;}return"zzubzzif";}

ใช้เป็นอินพุทและผลตอบแทนString[]String

โค้ดที่ขยายได้และรันได้:

public class C {

    static final java.util.function.Function<String[], String> f = s -> {
        o:
        for (int i = 0, j, h = s.length; ++i < 16;) {
            for (j = h; j --> 0;) {
                if (s[j].contains("fizz") ^ (i + j) % 3 < 1 ||
                    s[j].contains("buzz") ^ (i + j) % 5 < 1) {
                    continue o;
                }
            }
            String z = i + "";
            for (j = 1; j < h;) {
                z += "\n" + (i + j++);
            }
            return z;
        }
        return "zzubzzif";
    };

    public static void main(String[] args) {
        System.out.print(f.apply(new String[]{"fizz", "", "buzz"}));
    }
}

1
s / fizz / f, s / buzz / b
djechlin

10

C #, 212 ไบต์

ฉันคิดไม่ถึง ฉันใช้gotoคำสั่งเพื่อแยกวง!

string[]R(string[]a){for(int i,l=a.Length,n=0;n++<15;){for(i=l;i-->0;)if(((n+i)%3<1?"fizz":"")+((n+i)%5<1?"buzz":"")!=a[i])goto z;for(i=l;i-->0;)a[i]=a[i]==""?""+(n+i):a[i];return a;z:;}return new[]{"zzubzzif"};}

สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่าลำดับจะต้องเริ่มต้นภายใน 15 องค์ประกอบแรก

การเยื้องและบรรทัดใหม่สำหรับการอ่าน:

string[]R(string[]a){
    for(int i,l=a.Length,n=0;n++<15;){
        for(i=l;i-->0;)
            if(((n+i)%3<1?"fizz":"")+((n+i)%5<1?"buzz":"")!=a[i])
                goto z;
        for(i=l;i-->0;)
            a[i]=a[i]==""?""+(n+i):a[i];
        return a;
    z:;
    }
    return new[]{"zzubzzif"};
}

C # ไม่มีbreakคำหลัก?
แมว

2
@cat มันทำ แต่gotoกระโดดออกจากลูปด้านในและเหนือตรรกะส่วนที่เหลือของลูปภายนอก
Hand-E-Food

ครั้งแรกที่ฉันได้ยินเกี่ยวกับgotoใน C #! ไม่รู้ด้วยซ้ำว่า C # มีมา!
sergiol

4

CJam, 72 ไบต์

"zzubzzif":MaqN/:Q,_F+{)_[Z5]f%:!MW%4/.*s\e|}%ew{:sQ1$A,sff&:s.e|=}=N*o;

โปรแกรมจะออกจากที่มีข้อผิดพลาดถ้ามันมีการพิมพ์zzubzzif

การใช้ล่าม Java สามารถปิด STDERR เพื่อระงับข้อความแสดงข้อผิดพลาดในที่สุด หากคุณลองโปรแกรมในล่าม CJamให้ละเว้นเอาต์พุตทั้งหมดหลังจากบรรทัดแรก

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

"zzubzzif" e# Push that string.
:Ma        e# Save it in M and wrap in in an array.
qN/:Q      e# Split the input into lines and save in Q.
,_F+       e# Count the lines and add 15 to a copy of the result.
{          e# For each integer I between 0 and lines+14:
  )_       e#   Increment I and push a copy.
  [Z5]     e#   Push [3 5].
  f%       e#   Map % to push [(I+1)%3 (I+1)%5].
  :!       e#   Apply logical NOT to each remainder.
  MW%4/    e#   Push ["fizz" "buzz"].
  .*       e#   Vectorized string repetition.
  s\       e#   Flatten the result and swap it with I+1.
  e|       e#   Logical OR; if `s' pushed an empty string, replace it with I+1.    
}%         e#
ew         e# Push the overlapping slices of length "lines".
{          e# Find; for each slice:
  :s       e#   Cast its elements to string (e.g., 1 -> "1").
  Q1$      e#   Push the input and a copy of the slice.
  A,s      e#   Push "0123456789".
  ff&      e#   Intersect the slice's strings' characters with that string.
  :s       e#   Cast the results to string. This replaces "fizz", "buzz"
           e#   and "fizzbuzz" with empty strings.
  .e|      e#   Vectorized logical OR; replace empty lines of the input
           e#   with the corresponding elements of the slice.
  =        e#   Check the original slice and the modified input for equality.
}=         e# Push the first match or nothing.
           e# We now have ["zzubzzif"] and possibly a solution on the stack.
N*         e# Join the topmost stack item, separating by linefeeds.         
o          e# Print the result.
;          e# Discard the remaining stack item, if any.

1

Perl, 140 ไบต์

$f=fizz;$b=buzz;@a=<>;@x=map{s!\d!!gr.$/}@s=map{$_%15?$_%3?$_%5?$_:$b:$f:$f.$b}(++$c..$c+$#a)while$c<15&&"@x"ne"@a";print$c<15?"@s":zzubzzif

คำอธิบาย

  1. @a คืออาร์เรย์ของบรรทัดอินพุต
  2. ภายในwhileวง
  3. @s มีลำดับ fizz-buzz ที่สร้างขึ้น
  4. @xเหมือนกับ@sแต่แทนที่ตัวเลขด้วยสตริงว่างและบรรทัดใหม่ที่ผนวกเข้ากับทุกองค์ประกอบ (เพื่อให้ตรงกับ@a)
  5. $c คือเคาน์เตอร์ตั้งแต่ 1 ถึง 15
  6. ลูปจะทำงานจนกระทั่ง@xกลายเป็นอินพุทเดียวกัน@a
  7. นอกลูปเอาต์พุตเป็น@sหรือ zzufzzib โดยพิจารณาว่า$cอยู่ในขีด จำกัด หรือไม่

1

Python, 176 ไบต์

น่าจะทำได้ดีกว่านี้มาก แต่ลองเล่นกอล์ฟเป็นครั้งแรก เคล็ดลับชื่นชม :)

หด

def f(a):l=len(a);g=lambda n:'fizz'*(n%3<1)+'buzz'*(n%5<1);r=range;return next(([g(x)or x for x in r(i%15,i%15+l)]for i in r(1,16)if all(g(i+x)==a[x]for x in r(l))),g(0)[::-1])

เป็นต้นฉบับ

def f(a):
  l = len(a)
  g = lambda n: 'fizz'*(n%3<1)+'buzz'*(n%5<1)
  r = range
  return next(
    (
      [g(x) or x for x in r(i % 15,i % 15 + l)]
      for i in r(1,16)
      if all(
        g(i + x) == a[x] for x in r(l)
      )
    ),
    g(0)[::-1]
  )

ยินดีต้อนรับสู่ PPCG! แนวทางการจัดรูปแบบมาตรฐานคือคำนำหน้าคำตอบของคุณด้วยส่วนหัวดังนั้นผู้อ่านจึงรู้ว่าตัวอย่างภาษาและกระดานผู้นำสามารถแยกคำตอบของคุณได้อย่างถูกต้อง ตัวอย่างเช่น#Java, 205 Bytesเป็นบรรทัดแรกของคำตอบของคุณ
AdmBorkBork

1
ลองแทนที่แลมบ์ดาด้วยสิ่งต่อไปนี้: 'fizz'*(n%3<1)+'buzz'*(n%5<1)คุณสามารถลบการมอบหมาย f และ b แล้ว (f+b)[::-1]จากนั้นจะสามารถเรียกร้องให้รู้จัก 'FizzBuzz' g(15)[::-1]เช่น
ทอดด์

ขอบคุณสำหรับคำแนะนำ! ลงไปที่ 183! ผมคิดว่าg(0)ยังทำงานเพื่อประหยัดไบต์อีก :)
arcyqwerty

1
งูหลาม 2 ช่วยให้การลบช่องว่างบางอย่างก่อนที่คำหลักเมื่อไม่มีความคลุมเครือ: ยกตัวอย่างเช่นอาจจะเขียน..] for ..]forใช้เคล็ดลับนี้คุณจะได้รับ 177 chars
dieter

คุณสามารถรวมอินพุตที่คุณสมมติเมื่อคุณเขียนรหัสในครั้งถัดไปได้ไหม รายการเช่นของรูปแบบ ['','fizz','']นอกจากนี้ยังมีอีกไม่กี่ที่จะลบถ้าคุณเปรียบเทียบรายการการป้อนข้อมูล VS comp รายการแทนที่จะใช้ทั้งหมด ()if a==[g(i + x) for x in r(l)]
ทอดด์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.