Zzub Zzif (membalikkan Fizz Buzz)

36

Diberikan potongan output buzz fizz dengan semua angka dihapus, isi angka yang benar dengan nilai serendah mungkin sehingga potongan buzz fizz benar. Untuk keperluan tantangan ini, fizzdan masing buzz-masing memiliki nilai 3 dan 5.

Jika input adalah urutan yang tidak valid dari fizz, buzzdan mengosongkan baris, maka sebaliknya output saja zzubzzif(dengan atau tanpa baris baru).

Input dan output mungkin garis yang dipisahkan baris baru, atau format array-of-string apa pun yang nyaman untuk bahasa Anda.

Anda dapat mengabaikan atau melakukan apa pun yang Anda suka dengan huruf besar.

Anda akan perlu memilih untuk menangani satu atau lebih dari ini: fizzbuzz, fizz buzz, buzz fizz, dll, tetapi Anda harus memilih setidaknya satu dari format ini.

Anda dapat mengasumsikan bahwa semua input adalah beberapa urutan fizz, buzzdan baris kosong.

Contohnya

Memasukkan:
mendesis

Keluaran:
2
fizz
4
Memasukkan:
berdengung
mendesis

Keluaran:
buzz
fizz
7
Memasukkan:

fizzbuzz


Keluaran:
13
14
fizzbuzz
16
17
Memasukkan:


Keluaran:

1
Memasukkan:
mendesis
mendesis

Keluaran:
zzubzzif
Memasukkan:


Keluaran:
zzubzzif
Trauma Digital
sumber
Terkait
Martin Ender

Jawaban:

17

Java, 205 byte

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";}

Mengambil String[]input as dan mengembalikan a String.

Kode diperluas, dapat dijalankan:

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"}));
    }
}
Ypnypn
sumber
1
s / fizz / f, s / buzz / b
djechlin
10

C #, 212 byte

Saya melakukan yang tidak terpikirkan. Saya menggunakan gotopernyataan untuk keluar dari lingkaran!

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"};}

Ini mengambil keuntungan dari fakta bahwa urutan harus dimulai dalam 15 elemen pertama.

Lekukan dan baris baru agar mudah dibaca:

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"};
}
Makanan Tangan
sumber
apakah C # tidak memiliki breakkata kunci?
kucing
2
@ kucing, memang, tapi gotomelompat keluar dari loop dalam dan melewati sisa logika loop luar.
Hand-E-Food
Pertama kali saya dengar tentang gotoC #! Bahkan tidak tahu C # memilikinya!
sergiol
4

CJam, 72 byte

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

Program akan keluar dengan kesalahan jika harus mencetak zzubzzif .

Menggunakan penerjemah Java, STDERR dapat ditutup untuk menekan pesan kesalahan akhirnya. Jika Anda mencoba program dalam juru bahasa CJam , abaikan semua output setelah baris pertama.

Bagaimana itu bekerja

"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.
Dennis
sumber
1

Perl, 140 byte

$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

Penjelasan

  1. @a adalah larik jalur input
  2. Di dalam whilelingkaran,
  3. @s memiliki urutan buzz-buzz yang dihasilkan
  4. @xsama seperti @stetapi dengan angka diganti dengan string kosong dan baris baru ditambahkan ke setiap elemen (untuk mencocokkan dengan @a)
  5. $c adalah penghitung dari 1 hingga 15
  6. Loop berjalan hingga @xmenjadi sama dengan input@a
  7. Di luar loop, outputnya @satau zzufzzib berdasarkan pada apakah $cdalam batasnya atau tidak
svsd
sumber
1

Python, 176 Bytes

Mungkin bisa melakukan jauh lebih baik, tetapi upaya pertama di Golf. Tips dihargai :)

Menyusut

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

Asli

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]
  )
arcyqwerty
sumber
Selamat datang di PPCG! Pedoman pemformatan standar adalah untuk mengawali jawaban Anda dengan tajuk, sehingga pembaca tahu bahasa dan cuplikan papan peringkat dapat menguraikan jawaban Anda dengan benar. Misalnya, #Java, 205 Bytessebagai baris pertama jawaban Anda.
AdmBorkBork
1
Coba ganti lambda dengan yang berikut: 'fizz'*(n%3<1)+'buzz'*(n%5<1)Anda dapat menghapus tugas f dan b kemudian. (f+b)[::-1]kemudian bisa menjadi panggilan ke misalnya 'fizzbuzz' yang dikenal g(15)[::-1].
Todd
Terima kasih untuk sarannya! Turun ke 183! Saya pikir g(0)juga berfungsi untuk menyimpan byte lain :)
arcyqwerty
1
python 2 memungkinkan untuk menghapus beberapa spasi sebelum kata kunci ketika tidak ada ambiguitas: misalnya ..] for dapat ditulis ..]for. Menerapkan trik ini, Anda mendapatkan 177 karakter
pelaku diet
Bisakah Anda memasukkan input yang Anda anggap ketika Anda menulis kode waktu berikutnya. mis. daftar formulir. ['','fizz','']Ada juga beberapa lagi yang harus dihapus jika Anda membandingkan daftar input dengan daftar comp daripada menggunakan semua ()if a==[g(i + x) for x in r(l)]
Todd