트리플 밸런스 숫자


13

기술

세 부분으로 나눌 때 모든 부분의 자릿수가 같은 수인 경우 3 자리 이상의 균형을 가진 3 자리 이상의 정수를 고려합니다. 우리는 다음과 같이 숫자를 나눕니다.

abcdefghi - Standard case: the number of digits is divisable through 3:
abc def ghi

abcdefgh - Number % 3 == 2: The outer groups are both assigned another digit
abc de fgh (the inner group will have one digit less than both outer groups)

abcdefghij - Number % 3 == 1: The inner group is assigned the extra digit
abc defg hij (the inner group will have one digit more than the outer groups)

도전

당신의 임무는 3 자리 이상의 정수가 주어지면 주어진 숫자가 삼중 균형인지 여부를 결정하고 그 결과에 따라 진실 또는 거짓 값을 출력하는 프로그램을 작성하는 것입니다.

테스트 사례

333 -> True
343 -> False
3123 -> True
34725 -> True
456456 -> False
123222321 -> True

이것은 이므로 표준 허점이 적용되며 바이트 단위의 최단 답변이 이길 수 있습니다!


1
알다시피, 균등하게 나눌 수 있다면해야합니다.
완전히 인간적인

@ Mr.Xcoder 당신은 그것을 세 부분으로 나누었습니다 (여전히 @MagicOctopusUnr의 의견에 따라 작동하지 않습니다 :when split in three parts,
Stephen

4
앞으로 이러한 상황을 피 하려면 샌드 박스 사용을 고려하십시오 .
Mr. Xcoder

2
으악! 테스트 사례에 대해 혼란을 드려 죄송합니다. 머리에 약간의 왜곡이있는 것 같습니다. 이제 문제가 해결되었으므로 다시 도전하여 투표 해 주시기 바랍니다.
racer290

5
기본적으로 입력은 문자열로 허용됩니다. 숫자 배열로 사용할 수 있습니까?
Luis Mendo

답변:




3

망막 , 89 바이트

^|$
¶
{`¶(.)(.*)(.)¶
$1¶$2¶$3
}`^((.)*.)(.)¶((?<-2>.)*)¶(.)
$1¶$3$4$5¶
\d
$*
^(1+)¶\1¶\1$

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명 : 첫 번째 단계는 입력의 시작과 끝에 줄 바꿈을 추가합니다. 그런 다음 두 번째 단계는 줄 바꾸기에서 숫자를 쌍으로 이동하려고 시도하지만 중간에 충분한 숫자가 남아 있지 않으면 세 번째 단계에서 다시 이동하여 루프가 중지됩니다. 그런 다음 네 번째 단계는 각 숫자를 개별적으로 단항으로 변환하여 합산하는 반면 마지막 단계는 단순히 합계가 같은지 확인합니다.


2

수학, 142 바이트

(s=IntegerDigits@#;c=Floor;If[Mod[t=Length@s,3]==2,a=-1;c=Ceiling,a=Mod[t,3]];Length@Union[Tr/@FoldPairList[TakeDrop,s,{z=c[t/3],z+a,z}]]==1)&

2

젤리 , 20 바이트

DµL‘:3x2jSạ¥¥LRṁ@ḅ1E

온라인으로 사용해보십시오!

작동 원리

DµL‘:3x2jSạ¥¥LRṁ@ḅ1E  Main link. Argument: n

D                     Decimal; convert n to base 10, yielding a digits array A.
 µ                    Begin a new chain with argument A.
  L                   Compute the length of A.
   ‘                  Increment; add 1 to the length.
    :3                Divide the result by 3.
                      This yields the lengths of the outer chunks.
      x2              Repeat the result twice, creating an array C.
             L        Compute l, the length of A.
            ¥         Combine the two links to the left into a dyadic chain.
                      This chain will be called with arguments C and l. 
           ¥              Combine the two links to the left into a dyadic chain.
         S                    Take the sum of C.
          ạ                   Compute the absolute difference of the sum and l.
        j                 Join C, using the result to the right as separator.
                      We now have an array of the lengths of all three chunks the
                      digits of n have to be split in.
              R       Range; map each chunk length k to [1, ..., k].
               ṁ@     Mold swapped; takes the elements of A and give them the shape
                      of the array to the right, splitting A into chunks of the
                      computed lengths.
                 ḅ1   Convert each chunk from unary to integer, computing the sum
                      of its elements.
                   E  Test if the resulting sums are all equal.

1
설명을 읽고 싶습니다
Felix Dombek

@FelixDombek 설명을 추가했습니다.
Dennis


0

자바 스크립트, 178 바이트

(a)=>{b=a.split(/(\d)/).filter((v)=>v);s=Math.round(b.length/3);f=(m,v)=>m+parseInt(v);y=b.slice(s,-s).reduce(f,0);return b.slice(0,s).reduce(f,0)==y&&y==b.slice(-s).reduce(f,0)}

PPCG에 오신 것을 환영합니다! 페이지 를 읽었 습니까? 당신의 답을 골라 낼 수있는 많은 범위가 있습니다.
Neil

여전히 관심이 있으시면 답변을 106 바이트로 줄일 수있었습니다. ([...b],s=~b.length/3|0,f=(m,v)=>+m+ +v,y=b.splice(s).reduce(f))=>b.splice(-s).reduce(f)==y&y==b.reduce(f)(스택 교환이 보이지 않는 문자를 삽입 할 때 주석에서 복사 할 때주의하십시오).
Neil

아름다운! 거기에서 배울 많은 것들.
cdm

0

자바 8, 149 바이트

q->{int l=q.length,s=(l+1)/3,a=0,b=0,c=0,i=0;for(;i<s;a+=q[i++]);for(i=s,s=l/3*2+(l%3<1?0:1);i<s;b+=q[i++]);for(i=s;i<l;c+=q[i++]);return a==b&b==c;}

입력을로 사용합니다 int[].

설명:

여기에서 시도하십시오.

q->{                 // Method with int-array parameter and boolean return-type
  int l=q.length,    //  Length of the input-array
      s=(l+1)/3,     //  (Length + 1) divided by 3
      a=0,b=0,c=0,   //  Three sums starting at 0
      i=0;           //  Index-integer
  for(;i<s;          //  Loop (1) from 0 to `s1` (exclusive)
    a+=q[i++]        //   And increase `a` with the next digit
  );                 //  End of loop (1)
  for(i=s,s=l/3*2+(l%3<1?0:1);i<s;
                     //  Loop (2) from `s1` to `s2` (exclusive)
    b+=q[i++]        //   And increase `b` with the next digit
  );                 //  End of loop (2)
  for(i=s;i<l;       //  Loop (3) from `s2` to `l` (exclusive)
    c+=q[i++]        //   And increase `c` with the next digit
  );                 //  End of loop (3)
  return a==b&b==c;  //  Return if `a`, `b` and `c` are equal
}                    // End of method

다음은 각 길이에 대한 0 인덱스 (독점) 파트의 개요입니다.

Length:  Parts:    0-indexed (exclusive) parts:

 3       1,1,1     0,1 & 1,2 & 2,3
 4       1,2,1     0,1 & 1,3 & 3,4
 5       2,1,2     0,2 & 2,3 & 3,5
 6       2,2,2     0,2 & 2,4 & 4,6
 7       2,3,2     0,2 & 2,5 & 5,7
 8       3,2,3     0,3 & 3,5 & 5,8
 9       3,3,3     0,3 & 3,6 & 6,9
10       3,4,3     0,3 & 3,7 & 7,10
...
  • 옵션 a에서 우리 루프 0(length + 1) / 3)(이 값을 현재 저장된다 s);
  • 내용 b에서 우리 루프 slength / 3 * 2 +( 0길이 모듈로 3이 0 인 경우 1길이 모듈로 3이 1 또는 2 인 경우) (이 값은 현재의 저장소이다 s);
  • 의 경우 c에서 우리는 루프 slength.

(세 루프 모두 0 인덱싱 배타적 임)


0

로다 , 82 바이트

f s{n=((#s+1)//3)[s[:n],s[n:#s-n],s[#s-n:]]|[chars(_)|[ord(_)-48]|sum]|[_=_,_=_1]}

온라인으로 사용해보십시오!

설명:

f s{ /* function declaration */
    n=((#s+1)//3)
    [s[:n],s[n:#s-n],s[#s-n:]]| /* split the string */
    [ /* for each of the three strings: */
        chars(_)|    /* push characters to the stream */
        [ord(_)-48]| /* convert characters to integers */
        sum          /* sum the integers, push the result to the stream */
    ]|
    [_=_,_=_1] /* take three values from the stream and compare equality */
}

0

자바 스크립트, 129 , 104 바이트

([...n],l=n.length/3+.5|0,r=(b,e=b*-4,z=0)=>n.slice(b,e).map(x=>z-=x)&&z)=>r(0,l)==r(-l)&&r(l,-l)==r(-l)

함수 r은 매개 변수 b와 e를 기준으로 문자열을 슬라이스 한 다음 숫자를 합산하고 값을 반환합니다.

올바른 크기로 슬라이스하기 위해 길이를 3으로 나누고 결과를 반올림합니다. slice (0, result)를 호출하면 첫 번째 블록이, slice (result, -result)는 두 번째 블록을, slice (result)는 우리에게 마지막 블록을 제공합니다. slice를 호출하는 방식으로 인해 마지막 것 대신 slice (result, 4 * result)를 사용했지만 결과는 같습니다.

마지막으로 결과가 값이 같다는 것을 비교합니다.

편집 : 동일한 원칙, 더 나은 골프


JavaScript에서 로 변경할 &&&있습니까? 간접 검사 ( &&z&&y[1]==y[2])는 모두 값을 수정하지 않는 것 같습니다. 가능하면 내가 볼 수있는 결과에 영향을 미치지 않아야합니다.
Kevin Cruijssen

내가 살펴볼 게 &는 비트 연산 대 &&는 논리 연산이므로 출력을 true 또는 false 대신 1 또는 0으로 변경하지만이 경우에는 효과적입니다.
Grax32
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.