Zzub Zzif (зворотний Fizz Buzz)


36

З огляду на фрагмент вихідного сигналу fizz buzz зі всіма видаленими номерами, заповніть правильні цифри з найнижчими можливими значеннями, такими, що фрагмент гучного сигналу fizz є правильним. Для цілей цього завдання, fizzі buzzмають свої звичайні значення 3 і 5, відповідно.

Якщо вхід неприпустимою послідовності fizz, buzzі порожні рядки, то замість виведення тільки zzubzzif(з або без символів нового рядка).

Введення та виведення можуть бути розділеними рядками нового рядка або будь-який формат масивів рядків зручний для вашої мови.

Ви можете ігнорувати чи робити все, що завгодно, з великої літери.

Вам потрібно буде вибрати для обробки одного або декількох з них: fizzbuzz, fizz buzz, buzz fizzі т.д., але ви повинні вибрати принаймні один з цих форматів.

Можна вважати , що все вхідні деяка послідовність fizz, buzzі порожні рядки.

Приклади

Вхід:
фіз

Вихід:
2
fizz
4
Вхід:
гудіння
фіз

Вихід:
buzz
fizz
7
Вхід:

фізбуз


Вихід:
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[]як вхід і повертає a 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

Перший раз я чув про gotoC #! Навіть не знав, C # мав це!
серхіол

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 має сформовану послідовність фіз-гудів
  4. @x- це те саме, що @sі з числами, заміненими порожніми рядками та новим рядком, доданим до кожного елемента (для відповідності @a)
  5. $c є лічильником від 1 до 15
  6. Цикл працює, поки не @xстає таким же, як вхід@a
  7. Поза межами циклу, вихід @sчи zzufzzib виходячи з того, $cбув він у його межах чи ні

1

Пітон, 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
python 2 дозволяє видалити пробіли перед ключовими словами, коли немає двозначності: наприклад, ..] for може бути написано ..]for. Застосовуючи цю хитрість, ви отримуєте 177 символів
дієти

Чи можете ви включити вхід, який ви припускали, коли ви писали код наступного разу. наприклад, список форми ['','fizz','']Ви можете також видалити ще кілька, якщо порівнювати вхідний список із списком, а не використовувати всі ()if a==[g(i + x) for x in r(l)]
Тодд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.