Ззуб Ззиф (обратный Fizz Buzz)


36

Учитывая фрагмент вывода fizz buzz со всеми удаленными номерами, заполните правильные числа минимально возможными значениями так, чтобы фрагмент fizz buzz был правильным. Для целей этой задачи 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

Впервые слышу про gotoC #! Даже не знал, что 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. Вне цикла вывод равен @szzufzzib или зависит от того, $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
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.