Zzub Zzif (zumbido reverso do Fizz)


36

Dado um fragmento da saída de buzz fizz com todos os números removidos, preencha os números corretos com os valores mais baixos possíveis, de modo que o snippet de buzz fizz esteja correto. Para os propósitos deste desafio, fizze buzztenha seus valores usuais de 3 e 5, respectivamente.

Se a entrada é uma sequência inválida de fizz, buzze as linhas em branco, em seguida, em vez de saída apenas zzubzzif(com ou sem várias linhas).

A entrada e a saída podem ser linhas separadas por nova linha ou qualquer formato de matriz de strings que seja conveniente para o seu idioma.

Você pode ignorar ou fazer o que quiser com letras maiúsculas.

Você terá que escolher para lidar com um ou mais dos seguintes: fizzbuzz, fizz buzz, buzz fizz, etc, mas você deve escolher pelo menos um desses formatos.

Pode-se presumir que todas as entradas é uma sequência de fizz, buzze esvaziar linhas.

Exemplos

Entrada:
efervescer

Saída:
2
fizz
4
Entrada:
zumbido
efervescer

Saída:
buzz
fizz
7
Entrada:

fizzbuzz


Saída:
13
14
fizzbuzz
16
17
Entrada:


Saída:

1
Entrada:
efervescer
efervescer

Saída:
zzubzzif
Entrada:


Saída:
zzubzzif

Respostas:


17

Java, 205 bytes

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

Pega a String[]como entrada e retorna a String.

Código executável expandido:

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

11
s / fizz / f, s / zumbido / b
djechlin

10

C #, 212 bytes

Eu fiz o impensável. Eu usei uma gotodeclaração para sair de um loop!

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

Isso tira proveito do fato de que a sequência deve começar dentro dos 15 primeiros elementos.

Recuo e novas linhas para facilitar a leitura:

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 # não tem uma breakpalavra - chave?
gato

2
@cat, sim, mas os gotosaltos para fora do loop interno e sobre o restante da lógica do loop externo.
Hand-E-Food

Primeira vez que ouvi falar gotoem C #! Nem sabia que C # tinha!
Sergiol 25/06

4

CJam, 72 bytes

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

O programa será encerrado com um erro se for necessário imprimir o zzubzzif .

Usando o interpretador Java, o STDERR pode ser fechado para suprimir uma eventual mensagem de erro. Se você tentar o programa no intérprete CJam , ignore todas as saídas após a primeira linha.

Como funciona

"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 bytes

$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

Explicação

  1. @a é a matriz de linhas de entrada
  2. Dentro do whileloop,
  3. @s tem a sequência fizz-buzz gerada
  4. @xé o mesmo que @scom números substituídos por cadeias vazias e uma nova linha anexada a cada elemento (para combinar com @a)
  5. $c é um contador de 1 a 15
  6. O loop é executado até @xse tornar o mesmo da entrada@a
  7. Fora do loop, a saída é @sou zzufzzib, com base $cem seus limites ou não

1

Python, 176 bytes

Provavelmente poderia fazer muito melhor, mas primeira tentativa no Golf. Dicas apreciadas :)

Encolhido

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

Original

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

Bem-vindo ao PPCG! As diretrizes de formatação padrão devem preceder sua resposta com um cabeçalho, para que os leitores saibam que o idioma e os snippets do cabeçalho podem analisar adequadamente sua resposta. Por exemplo, #Java, 205 Bytescomo a primeira linha da sua resposta.
AdmBorkBork

11
Tente substituir o lambda pelo seguinte: 'fizz'*(n%3<1)+'buzz'*(n%5<1)Você pode remover as atribuições f e b. (f+b)[::-1]pode ser uma chamada para um conhecido 'fizzbuzz', por exemplo g(15)[::-1].
Todd

Obrigado pela sugestão! Até 183! Eu acho que g(0)também trabalha para salvar outro byte :)
arcyqwerty

11
O python 2 permite remover alguns espaços antes das palavras-chave quando não há ambiguidade: por exemplo, ..] for pode ser escrito ..]for. Aplicando este truque, você tem 177 caracteres
Dieter

Você poderia incluir a entrada que assumiu ao escrever o código da próxima vez. por exemplo, lista do formulário ['','fizz','']Há também mais alguns a serem removidos se você comparar a lista de entrada versus uma lista comp em vez de usar all ()if a==[g(i + x) for x in r(l)]
Todd:
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.