Zzub Zzif (리버스 피즈 버즈)


36

(A)의 조각이 주어 소다 버즈 되도록 최저 값으로 정확한 숫자를 삭제하고 숫자 출력 충전 소다 버즈 조각이 정확한지를. 이 과제의 목적을 위해, 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

자바, 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키워드가 없습니까?
cat

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

펄, 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에 있는지 여부 $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].
Todd

제안 해 주셔서 감사합니다! 183 년까지! 나는 g(0)또한 다른 바이트를 절약하기 위해 작동 한다고 생각 합니다 :)
arcyqwerty

1
파이썬 2는 모호성이 없을 때 키워드 앞에 공백을 제거 ..] for 할 수 있습니다 ..]for. 예를 들어 쓸 수 있습니다 . 이 속임수를 적용하면 177 자
Dieter

다음에 코드를 작성할 때 가정 한 입력 내용을 포함시킬 수 있습니까? 예를 들어 양식 ['','fizz','']목록 all ()을 사용하지 않고 입력 목록과 목록 구성을 비교하는 경우 제거 할 내용이 몇 가지 더 있습니다.if a==[g(i + x) for x in r(l)]
Todd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.