Zzub Zzif (reverse Fizz Buzz)


36

Dato uno snippet di output del buzz fizz con tutti i numeri rimossi, inserisci i numeri corretti con i valori più bassi possibili in modo tale che lo snippet del buzz fizz sia corretto. Ai fini di questa sfida, fizze buzzhanno i loro valori abituali di 3 e 5, rispettivamente.

Se l'ingresso è una sequenza di valido fizz, buzze linee vuote, poi invece uscita solo zzubzzif(con o senza ritorni a capo).

L'input e l'output possono essere righe separate da una nuova riga o qualunque formato di array di stringhe sia conveniente per la tua lingua.

Puoi ignorare o fare quello che ti piace con le maiuscole.

Sarà necessario scegliere di gestire uno o più di questi: fizzbuzz, fizz buzz, buzz fizz, ecc, ma è necessario scegliere almeno uno di questi formati.

Si può presumere che tutto l'input è una sequenza di fizz, buzze svuotare linee.

Esempi

Ingresso:
effervescenza

Produzione:
2
fizz
4
Ingresso:
ronzio
effervescenza

Produzione:
buzz
fizz
7
Ingresso:

FizzBuzz


Produzione:
13
14
fizzbuzz
16
17
Ingresso:


Produzione:

1
Ingresso:
effervescenza
effervescenza

Produzione:
zzubzzif
Ingresso:


Produzione:
zzubzzif

Risposte:


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

Prende un String[]input e restituisce a String.

Codice espandibile e eseguibile:

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 byte

Ho fatto l'impensabile. Ho usato una gotodichiarazione per uscire da un ciclo!

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

Ciò sfrutta il fatto che la sequenza deve iniziare entro i primi 15 elementi.

Rientro e nuove righe per la leggibilità:

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 # non ha una breakparola chiave?
cat

2
@cat, lo fa, ma i gotosalti fuori dal loop interno e sopra il resto della logica del loop esterno.
Hand-E-Food

La prima volta che ne ho sentito parlare gotosu C #! Non sapevo nemmeno che C # l'avesse!
sergiol

4

CJam, 72 byte

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

Il programma uscirà con un errore se deve stampare zzubzzif .

Utilizzando l'interprete Java, STDERR può essere chiuso per sopprimere un eventuale messaggio di errore. Se si tenta il programma nell'interprete CJam , ignorare tutto l'output dopo la prima riga.

Come funziona

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

Spiegazione

  1. @a è l'array di linee di input
  2. All'interno del whileciclo,
  3. @s ha la sequenza fizz-buzz generata
  4. @xè uguale @sma con i numeri sostituiti con stringhe vuote e una nuova riga aggiunta a ogni elemento (da abbinare a @a)
  5. $c è un contatore da 1 a 15
  6. Il ciclo continua fino a quando @xdiventa lo stesso dell'ingresso@a
  7. Al di fuori del ciclo, l'output è @so zzufzzib in base al fatto che $cfosse o meno nei suoi limiti

1

Python, 176 byte

Probabilmente potrebbe fare molto meglio, ma primo tentativo di golf. Suggerimenti apprezzati :)

ristretto

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

Originale

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

Benvenuti in PPCG! Le linee guida standard per la formattazione sono di prefigurare la tua risposta con un'intestazione, in modo che i lettori sappiano che i frammenti di lingua e classifica possono analizzare correttamente la tua risposta. Ad esempio, #Java, 205 Bytescome prima riga della tua risposta.
AdmBorkBork,

1
Prova a sostituire la lambda con quanto segue: 'fizz'*(n%3<1)+'buzz'*(n%5<1)Puoi rimuovere le assegnazioni fe b. (f+b)[::-1]può quindi essere una chiamata a un noto "fizzbuzz", ad es g(15)[::-1].
Todd,

Grazie per il suggerimento! Fino a 183! Penso che g(0)
funzioni

1
python 2 consente di rimuovere alcuni spazi prima delle parole chiave in assenza di ambiguità: ad esempio ..] for può essere scritto ..]for. Applicando questo trucco, otterrai 177 caratteri
Dieter il

Potresti includere l'input che hai assunto quando hai scritto il codice la prossima volta. ad es. elenco del modulo ['','fizz','']Ci sono anche alcuni altri da rimuovere se si confronta l'elenco di input con un elenco comp piuttosto che utilizzare all ()if a==[g(i + x) for x in r(l)]
Todd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.