앨리스의 첫 번째 코드 검토


20

Alice는 Brainfuck을 클라이언트 측 및 서버 측 개발의 기본 언어로 사용하는 회사의 인턴입니다. Alice는 방금 첫 번째 코드를 작성했으며 첫 번째 코드 검토를 준비 할 때 약간 긴장합니다.

Alice는 자신의 코드를 올바르게 형식화하고 멋지게 보이기를 원하지만 328 페이지의 회사 코드 스타일 가이드를 읽을 시간이 없으므로 완벽한 정사각형 으로 형식화하기로 결정했습니다 . 아아, 코드 길이가 사각형을 형성하기에 충분하지 않을 수 있으므로 중간에 직사각형 간격 을두기로 결정했습니다 . 간격은 완벽해야 중심 과 같은 가까운 광장 할 수있다.

++++++         +++++         +++++         +++++         +++++         +++++
++++++         +++++         +++++         +  ++         ++ ++         +++++
++++++         ++ ++         +   +         +  ++         +   +
++++++         +++++         +++++         +++++         ++ ++         +++++
++++++         +++++         +++++         +++++         +++++         +++++

Perfect         OK         Acceptable   Unacceptable    No way!        Nope.

Alice를 돕는 프로그램이나 함수를 작성하십시오. Alice의 코드를 입력 문자열로 지정하면 가능한 경우 아래 설명 된대로 올바른 형식의 코드를 출력하십시오. 포맷이 불가능하면 울음 이모티콘을 출력하십시오 :~(.

이것은 이므로 답은 바이트 수로 목표 점수가됩니다.

제약

  1. 프로그램 또는 함수는 단일 문자열을 입력으로 사용하여 하나 이상의 텍스트 줄을 출력해야합니다 (또는 함수를 구현하는 경우 여러 줄 문자열 또는 문자열 배열을 반환).
  2. 입력 문자열에는 공백을 포함한 모든 ASCII 문자가 포함될 수 있습니다.
  3. 입력 된 모든 공백은 무시해야합니다. 코드 길이를 계산해서는 안되며 출력에 사용해서는 안됩니다.
  4. 입력 문자열에 공백이 아닌 문자가 하나 이상 포함되어 있습니다.
  5. 형식이 지정된 코드는 입력 코드와 동일한 순서로 공백이 아닌 문자를 사용해야합니다.
  6. 형식이 지정된 코드는 완전한 정사각형이어야합니다. 즉, 모든 줄의 길이는 같아야하고 줄 수는 줄 길이와 같아야합니다.
  7. 형식화 된 코드에는 중간에 공백이있을 수 있습니다.
  8. 공백 문자 (ASCII 코드 32) 만 공백에 사용할 수 있습니다.
  9. 갭 (있는 경우)은 직사각형이어야합니다.
  10. 형식이 지정된 코드의 모든 줄은 공백이 아닌 문자를 하나 이상 포함해야합니다. 즉 간격 너비는 반드시 사각형 너비보다 작아야합니다 (갭 5x1은 5x5 사각형에는 사용할 수 없음).
  11. 간격은 수평이어야합니다. 즉 간격 폭은 간격 높이 이상이어야합니다.
  12. 간격은 완벽하게 중앙에 있어야합니다.
  13. 결과적으로 간격 너비와 높이 패리티는 사각형 너비 패리티와 같아야합니다 (예 : 5x5 사각형 간격의 경우 1x1, 3x1 또는 3x3 일 수 있음).
  14. 가능하면 간격없이 사각형을 출력하십시오.
  15. 여러 솔루션의 경우 간격이 정사각형에 가장 가까운 것을 선택하십시오. 즉, 간격 너비와 간격 높이의 차이가 최소화됩니다 (예 : 간격 10x10이 8x6보다 더 바람직하고 8x6이 6x2보다 더 바람직 함).
  16. 여전히 동점이있는 경우, 최소 갭 면적을 가진 솔루션을 선택하십시오 (예 : 갭 2x2가 4x4보다 더 좋습니다).
  17. 코드를 전혀 포맷 할 수 없으면 output을 출력하십시오 :~(.
  18. 마지막 줄 뒤의 줄 바꿈은 선택 사항입니다.
  19. [New] 33 이하의 코드를 가진 문자는 공백으로 가정합니다. 골프에 도움이 되길 바랍니다.

테스트

Input           Output      Code length     Comment

+++++++++       +++                   9     Alice is lucky, 
                +++                         her code perfectly fits a square. 
                +++


++++++++        +++                   8     Though code length isn't enough for a square, 
                + +                         a small gap fixes it.
                +++


++++++          :~(                   6     No luck, code cannot be formatted.


Hello,          Hell                 12     Input may contain any ASCII characters, 
World!          o  ,                        but whitespaces in input should be ignored.
                W  o
                rld!


+++++ + +++++   +++++                22     Gap is not required to be a square, 
+++++ + +++++   +++++                       it can be a rectangle.
                +   +
                +++++
                +++++

+++ + +++       ++++++++             28     There exists another solution: 
+++ + +++       +      +                    6x6 square with 4x2 gap, 
+++ + +++       +      +                    but in Alice's opinion square gap 
+++ + +++       +      +                    makes code more readable.
                +      +
                +      +
                +      +
                ++++++++

까다로운 테스트

This must be    Thism                24     7x7 with 5x5 gap looks good,
5x5 with 1x1    ustbe                       but 5x5 with 1x1 gap is better,
gap.            5x 5w                       because gap area is smaller.
                ith1x
                1gap.

+++ +++ +++     :~(                  18     In case you tried 5x5 square
+++ +++ +++                                 with 7x1 gap ;)

자원

공간을 절약하기 위해 tio.run 에서 샘플 코드 및 추가 테스트 사례를 찾을 수 있습니다.

[New] 최대 100 자까지 입력 가능한 솔루션 표를 살펴볼 수 있습니다 . 좀 더 직관적으로 보이기 때문에 너비와 높이를 바꿨습니다.

고무시키는 : 정사각형의 텍스트

변경

  • 2 개의 테스트를 추가하고 샘플 코드의 버그를 수정했습니다.

  • 최대 100 개의 솔루션 표를 추가하고 공백을 추가했습니다.


3
"포맷이 불가능하면 울부 짖는 이모 지 출력"-불필요한 보풀이있어서 출력이 더 나은 IMO가 될 수 있습니다.
조나단 앨런

1
@JonathanAllan, 형식화가 항상 가능하다는 것을 보장하는 것이 좋습니다. 유효성 검사를 입력하십시오!
얽히고 설킨

1
@Jonathan Allan, 모든 출력 이 너무 넓어서 허점에 취약 할 수 있습니다. 나는 잘못된 값을 사용하도록 생각했지만 다른 언어간에 출력이 일치하지 않을 것입니다. 나는 또한 빈 문자열을 사용하는 것을 고려했지만 테스트 사례를 덜 시각적으로 만들었습니다. 또한 "오류"와 같은 다른 메시지에 대해서도 생각했지만 전 세계의 Brainfuck 개발자를 지원하기 위해 더 짧게하기로 결정했습니다.
Daniil Tutubalin

1
@Shaggy, 이것은 단지 입력 검증이 아닙니다. 해결책이 없다는 것을 찾는 것은 퍼즐의 중요한 부분입니다. 검색을 중단 할시기를 찾아야합니다.
Daniil Tutubalin

2
@DaniilTutubalin 특정 입력 만 여기에 제공되도록하는 것이 매우 일반적입니다. 이러한 "유효하지 않은"입력에 대한 출력을 허용하는 것도 일반적인 접근 방식이며 문제의 핵심과 관련이없는 상용구 코드를 피합니다. 그러한 경우 출력으로 변하지 않는 것을 정말로 원한다면 입력 자체를 제안합니다. 나는 지금 당신이 그것을 바꿀 것을 제안하지는 않지만 ... 또한 이것은 매우 좋은 도전입니다!
조나단 앨런

답변:


5

C (gcc) , 354 바이트

h,i,j,k,l,m;g,v,w,d;f(char*s){for(i=l=0;s[i];l+=!isspace(s[i++]));d=g=l;for(i=0;i++<l;)if(h=i*i-l)for(j=0;j<i-++j;h>0&h%k<1&k<=m&m<i&m+~k&&m-k<g|m==k+g&(d-2*v)*(d-2*w)>h?w=(i-m)/2,v=j,g=m-k,d=i:j)k=i-2*j,m=h/k;else g=0,v=w=d=i;if(g-l)for(i=j=1;*s;j+=!i++,k=0,i%=d+1)for(putchar(i?v>=j|j>d-v|w>=i|i>d-w?k=1,*s:32:10);k;k*=isspace(*++s));else puts(":~(");}

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


탭이 "공백"이라고 생각하지만 정확하게 계산하는 것이 무엇인지 명확하게 요구했습니다.
Jonathan Allan

게시물을 업데이트했습니다. 당신은 대체 할 수 isspace(x)와 함께 x<33.
Daniil Tutubalin


4

자바 스크립트 (ES6),  284 ...  274270 바이트

@Shaggy 덕분에 4 바이트 절약

문자열 배열을 반환합니다.

s=>(s=s.replace(/\s/g,''),n=s.length,o=[':~('],W=d=g=(x,w=0,h=p=0)=>4*~-x>n?o:h>w?++w>x-2?g(-~x):g(x,w):g(x,w,h+1,o=n-x*x+w*h|(w^x|h^x)&!!(w|h)|w-h>d|w-h==d&w>W?o:[...Array(x)].map((_,Y,a)=>a.map((_,X)=>2*X>=x-w&2*X<x+w&2*Y>=x-h&2*Y<x+h?' ':s[p++]).join``,d=w-h,W=w)))``

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


잘 했어! 이 테스트를 시도해보십시오 : This must be 5x5 with 1x1 gap.(24 자)
Daniil Tutubalin

1
@DaniilTutubalin 그렇기 때문에 초기 게시물을 삭제하고 이러한 테스트 사례를 제안했지만 이제는 올바르게 지원됩니다.
Arnauld

[\s\n]그냥 수 없습니다 \s?
얽히고 설킨

++w>x-2w++>=x-2w++>=x42\s

4

Stax , 80 바이트

ö╦Çc▀╕╡ëé╓]µiÖ9♪`W|╣▐↑╖D┘↕♫╗╔äƒ■úφ■U`ÿ⌠%é┴☼vAú)☺@ı◄¬¶¢(îÉ┼6⌠D~♀└lfæA.I@º╤∟òîü╦(

실행 및 디버깅

어떻게 작동합니까?

  • 직사각형 컷 아웃이있는 모든 정사각형을 고려하십시오.
  • 올바른 크기가 아닌 프로그램 셰이프를 필터링하십시오.
  • 일치하는 패리티가없는 프로그램 셰이프를 필터링하십시오.
  • 컷 아웃이 사각형에 비해 너무 큰 프로그램 모양을 필터링하십시오.
  • 아무것도 발견되지 않으면 출력이 실패하고 종료됩니다.
  • 컷 아웃의 "직사각형"을 최소화 한 다음 컷 아웃 크기로 모양을 찾으십시오.
  • 프로그램 형태의 각 문자를 프로그램 입력의 해당 문자로 바꿉니다.

포장을 풀고 포장을 풀고 다음과 같이 주석 처리했습니다.

                input e.g. "big socks"
L$j$            remove whitespace from input e.g. "bigsocks"
cr{~F           copy push each remaining character to input stack in reverse order
%c              get length L of flattened input and copy e.g. 8
^r3:$           create triples [a,b,c] in range 0..n e.g. [[0,0,0], [0,0,1], ... [8,8,8]]
{E*NsJ+n=f      filter triples: require a*a-b*c=L e.g. [[3,1,1], [4,1,8], ...]
{ET>f           filter triples: a>b and a>c e.g. [[3,1,1]]
{{2%m:u_0#+f    filter triples: a%2=b%2=c%2 or b*c=0 e.g. [[3,1,1]]
":~("s|c        if there are no triples, output ":~(" and terminate
{D:s_D:*\oh     sort by [abs(b-c),b*c]; keep the first e.g. [3,1,1]
X               store the chosen triple in the X register
E               explode onto stack e.g. 3, 1, 1
z)]*            using last two values, make a rectangle of zeroes e.g. 3, [[0]]
~               this will be the cutout, push it to the input stack
c'X*]*          make a square of "X" e.g. ["XXX", "XXX", "XXX"]
xEd-h           given the dimensions in x register, calculate the centered cutout coordinates
xEsd-h          e.g. ["XXX", "XXX", "XXX"], 1, 1
,||             embed the cutout grid at the specified coordinates e.g. ["XXX", "X X", "XXX"]
m'X{,]}R        for each line, regex replace "X" with a character from the input stack

이것을 실행


압축이 풀린 버전도 제공해 주시겠습니까?
Daniil Tutubalin

1
@DaniilTutubalin 설명을 추가했습니다.
재귀

고맙습니다! 잘 했어!
Daniil Tutubalin

2

, 120 바이트

≔E⮌⪫⪪S ωιθ≔⁰ηF⊕Lθ¿⁼Lθ×ιι«≔ιη≔ιζ≔ιε»F⊘ιF⊕κF∧⁼Lθ⁻×ιι×⁻ι⊗⊕κ⁻ι⊗⊕λ∨¬η›⁻ζε⁻κλ«≔ιη≔⊕κζ≔⊕λε»¿η«UOη#JεζF›η⊗ζUO⁻η⊗ε⁻η⊗ζψUMKA⊟θ»:~(

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔E⮌⪫⪪S ωιθ

입력에서 공백을 제거한 다음 반전하고 문자로 분할하여 나중에 문자를 더 쉽게 반복 할 수 있습니다.

≔⁰η

결과를 찾을 수 없음 (아직)을 나타내는 0 크기로 시작하십시오.

F⊕Lθ

줄 길이까지 모든면의 길이를 확인하십시오. (나눗셈을 던지면 물론 코드가 빨라집니다.)

¿⁼Lθ×ιι«≔ιη≔ιζ≔ιε»

결과가 완벽한 사각형으로 판명되면 사각형 크기를 저장하고 테두리 크기로 설정하십시오.

F⊘ιF⊕κ

가능한 테두리 높이와 너비를 반복합니다 (테두리 너비는 테두리 높이보다 크지 않으므로 간격 높이는 간격 너비보다 크지 않습니다).

F∧⁼Lθ⁻×ιι×⁻ι⊗⊕κ⁻ι⊗⊕λ∨¬η›⁻ζε⁻κλ«≔ιη≔⊕κζ≔⊕λε»

테두리의 크기가 원하는 길이이고 아직 솔루션이 없거나이 솔루션만큼 정사각형이 아닌 경우이 사각형 및 테두리 크기로 솔루션을 업데이트하십시오.

¿η«

해결책이 있다면 ...

UOη#

주어진 정사각형 크기의 임의의 문자로 사각형을 그립니다.

JεζF›η⊗ζUO⁻η⊗ε⁻η⊗ζψ

테두리가 틈새를 남기기에 충분히 작 으면 틈을 지 웁니다. (그림 명령은 음수 값을 위아래로 왼쪽으로 그리며 0 값을 전혀 좋아하지 않습니다.)

UMKA⊟θ

모든 (나머지) 문자를 입력 문자로 바꿉니다.

»:~(

그렇지 않으면 출력 :~(합니다.


2

젤리 , 91 85 바이트

ÆDżU$<Ạa;ḂEɗʋƇṢƑƇ;€€
ḟ⁶ḟ⁷;©⁶L’²<¥Ðḟ²_ç;,`Wɗ¹?⁸ʋ€$Ẏạ/ÞḢµIH+""Rp"/ḟ@/ŒṬ€ĖP€Sị®Yµ“:~(”¹?

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

입력 문자열을 인수로 사용하고 형식이 지정된 출력 또는을 사용하여 문자열을 반환하는 모나드 링크입니다 :~(.


1

파이썬 2, 287 281 279 바이트

c=list("".join(input().split()))
l=len(c)
p=[]
for q in range(l*l):x=q%l;y=q/l;s=(l+x*y)**.5;p+=[(abs(x-y)/2,int(s),-x)]*(s%1==0)*(x<s-1>y>=s%2==x%2==y%2or x<1)
if p:d,s,x=min(p);b=(s+x)/2;Y=0;exec"c[b:b]=' '*-x*(b+d<=Y<s-b-d);print''.join(c[:s]);c=c[s:];Y+=1;"*s
else:print':~('

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

솔루션을 선택하고 인쇄하는 데 동일한 값을 사용하여 Python의 사전 사전 목록 비교를 사용합니다. 10 4 2 정도의 바이트가 여전히 잘릴 수 있다고 확신 합니다.

설명

c=list("".join(input().split()))
l=len(c)
p=[]

공백으로 나누고와 결합하여 공백을 제거한 ""다음 나중에 입력을 목록으로 변환하십시오. 또한 l실제 코드 길이와 p유효한 가능성 목록으로 초기화하십시오 .

for q in range(l*l):x=q%l;y=q/l;s=(l+x*y)**.5;

간격 크기의 모든 가능성을에서 0*0로 반복 합니다 l*l. l코드 문자와 x*y공백 을 사용하여 정사각형의 가장자리 길이를 계산합니다 s.

p+=[(abs(x-y)/2,int(s),-x)]*(s%1==0)*(x<s-1>y>=s%2==x%2==y%2or x<1)

다음 조건이 일치하는지 확인하십시오.

  • s % 1 == 0즉, 완벽한 사각형이 형성됩니다
  • x < s-1 > yx, y기껏 s-2해야 사각형 안에 들어갑니다.
  • s % 2 == x % 2 == y % 2모두를, 즉 xy가장자리의 패리티 일치를 중심으로 할 수있다
  • 그러나 x < 1, 즉 x == 0, 완벽한 제곱 요구 사항을 제외한 모든 것을 무시하면

조건이 일치하면 튜플에 다음 항목을 추가 p하여 최적 의 조건 을 찾으십시오.

  • abs(x-y)/2; 최초의 최소한의 차이를 확인 x하고 y가장 평방 격차를 얻을 수 있습니다. 이것은 항상 짝수이므로 2로 나눕니다.
  • int(s); 다음으로 최소 측면 길이를 찾으십시오. 이후는 s정수 및 갭 영역으로 증가이고 x*y, 갭 면적이 종류.
  • -x; 다음으로 가로 간격을 선호하는 최대 너비를 찾으십시오. 이는이 개발 된 방법으로 지역 후 제공하지만, 지역에 대해 동일 x*yy*x작동하므로.
if p:d,s,x=min(p);b=(s+x)/2;Y=0

유효한 레이아웃을 찾으면 위에서 설명한대로 최적의 레이아웃을 찾으십시오. 가로 테두리를 계산하고 b줄 번호 Y를 0으로 초기화하십시오 .

exec"c[b:b]=' '*-x*(b+d<=Y<s-b-d);print''.join(c[:s]);c=c[s:];Y+=1;"*s

줄 번호 Y가 간격 안에 있으면 (수직 테두리는 튜플 b+d과 함께 d) 가로 테두리 다음에 간격 너비의 공백을 추가합니다 c. (수정은 c리스트가 필요한 이유입니다.) 그런 다음 사각형의 선을 인쇄하여에서 제거하십시오 c. s라인 번호를 증가 시키면서 반복 횟수.

else:print':~('

레이아웃이 없으면 실패합니다.


잘 했어! 아아, 그것은 멀티 라인 입력에서 잘 작동하지 않습니다. 또한 직사각형 간격을 지원하지 않는 것 같습니다 (길이 22 테스트 참조).
Daniil Tutubalin

1
@DaniilTutubalin 입력을 파이썬 문자열로 제공해야합니다 "some\ntext". 여러 줄은 문자 그대로 구분 기호입니다. ( input()입력 행을 Python 코드로 평가합니다.) 이것이 허용되지 않는 경우 알려주십시오. 길이 22도 나를 위해 작동합니다.
PurkkaKoodari

아야, 미안 아마도 입력에 문제가 있었을 것입니다.
Daniil Tutubalin

1

Pyth , 99 98 바이트

#JscQ)=QshKh|oaFtNSf!|%hT1&eT|t{%R2TgeStThT+L@+lJ*Fd2^UJ2
":~("Am/-Qd2tKW=W}~hZrG-QGJj*eKdcJ]H<~>J

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

이것은 내 파이썬 답변과 동일한 알고리즘을 사용하지만 많은 세부 사항이 Pyth에서 짧게 변경되었습니다.

Pyth는 시대에 업데이트되지 않았고 인쇄 가능한 ASCII 문자 (데이터가 아닌 코드의 경우) 만 사용하므로 많은 공간을 낭비하기 때문에 나이가 여기에 표시됩니다.

흥미롭게도, Pyth가 Stax와 같은 종류의 base-256 패킹을 사용한다면,이 프로그램은 Stax (80 바이트)와 Jelly (85 바이트) 바로 옆에 log98 log 256 95⌉ = 81 바이트 가 될 수 있습니다 . 나는 이것이 골프 언어가 그들의 패러다임과 얼마나 밀접한 관계에 있는지 잘 보여주고 있다고 생각합니다.

설명 (코드보다 약간 덜 읽을 수 없음)

#while True:메시지를 억제하고 오류가 발생하면 종료되는 모든 항목을 래핑 합니다.

JscQ) cQ공백에서 입력 ( )을 호핑 s하고 부품을 함께 음소거하여 결과를에 저장합니다 J.

^UJ2(인덱스들의리스트를 만든다 U들) J및 소요 2ND 직교 전력 ( ^모든 쌍의 결과) [h,w]0<=h<len(J)하고 0<=w<len(J).

+L@+lJ*Fd모든 (위해 L) 이러한 쌍 d(추가 +(제곱근) @... 2(의) l의 ength J플러스 ( +) 생성물 ( *F한 쌍의) d삼중를 만들어 한쌍의 왼쪽) [side length, gap height, gap width].

f!|%hT1&eT|t{%R2TgeStThT: f삼중 항 T에 대한 ilter

  • ( !|) 중 어느 것도 :
    • 측면 길이 ( hT) 모듈로 1 ( %1)은 0이 아닙니다
    • ( &) 둘 다 :
      • 간격 높이 ( eT)는 0이 아닙니다
      • ( |) 중 하나 :
        • 중복 ( ) 및 첫 번째 고유 ( )가 제거 된 삼중 항 ( R) 모듈로 2 ( %2)의 각 숫자 는 비어 있지 않습니다.{t
        • (큰 eS갭 높이 및 간극 폭 (의)이 tT)는 g측면 길이보다 reater 또는 동등 ( hT)

S트리플렛을 사전 식으로 정렬합니다 (옆 길이, 간격 높이 기준). oaFtN그런 다음 갭 높이와 갭 너비 ( ) oa절대 값 차이로 트리플렛 을 조정합니다 tN.

이 시점에서 유효한 솔루션이 없으면 |두 번째 인수 인 평가하여 \n":~("를 인쇄하고 반환합니다 :~(. h최적의 솔루션을 취하거나 ":"그렇지 않은 경우에 저장됩니다 K. 그런 다음 h측면 길이 (또는 ":"없는 경우)를 가져 와서 s정수로 캐스트하거나 실패하면 종료하고에 저장됩니다 ( =) Q.

그런 다음 ( m) [gap height, gap width]( tK) 각각을 -측면 길이 ( Q) 에서 빼고 ( ) 결과를 2 ( /2)로 나눕니다 . 결과는 있습니다 A에 ssigned G하고 H.

마지막으로, While 루프를 시작합니다. Z0에서 시작하고 각 반복마다 증가하지만 이전 값 ( ~hZ, Z++C로 생각 )을 사용하십시오.

  • (만약 W) 이전 값이 (에 {)에 r플랜지 G(측면 길이 -로 G) ( -QG), 할당 ( =로) J다음 cJ위치에 ( ]) Hj폭 차이로 절반 OIN eK회 ( *) 공백 ( d). 값이 범위 내에 있지 않으면를 반환하십시오 J. 이 결과가 비어 있으면 루프를 중지하십시오.
  • >첫 번째 Q문자를 제거하고 ( ) 결과를에 J할당하십시오 ( ~) J. 의 이전 값 에서 첫 번째 문자 J( <)를 가져 와서 Q인쇄하십시오.

마지막으로 #루프가 다시 시작되고 숫자 cQ)Q포함하는 것이 잘못되어 오류가 발생하고 종료 됩니다.


솔직히 말하면 인쇄 가능한 코드가 더 좋습니다. 이진 코드는 공간을 덜 차지하지만, apealing은 훨씬 덜 보이고 (그리고 16 진수 덤프로 보는 것을 선호합니다) 일반적으로 동일한 언어의 솔루션간에 비교가 수행됩니다. 따라서 다른 포장 된 Stax 솔루션에 비해 포장 된 Stax 솔루션이 짧아서 포장을 풀고 나면 여전히 짧아집니다. 포장은 전체 Kolmogorov 복잡성에만 적합합니다.
Daniil Tutubalin

에 관계없이 비교가 일반적으로 수행하는 방법의 @DaniilTutubalin, 그것은 또 다른 golflang를 이길 여전히 좋다)
PurkkaKoodari

1

05AB1E , 95 89 바이트

… 
    мDg©Ý3ãʒćnsP-®Q}ʒć‹P}ʒÈËyß_~}Dg_i…:~(ëΣ¦DÆÄsP‚}н©¤_iнë¬Uć᤮Ås<иs;R`X*+šXnª£®θð×ýX}ô»

여기에 몇 바이트가 있고 확실히 골프를 칠 수 있습니다.

프로그램의 처음 세 단계는 @recursive 의 Stax 답변 에서 영감을 얻었 으므로 그를 찬성 해야합니다!

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

1 단계 : 공백을 모두 제거하십시오.

 
                   # Push string " \n\t"
    м              # And remove those from the (implicit) input-string

[a,b,c]aa×ab×c[0,a]

  • a2b×c=LL
  • (a>b) and (a>c)
  • (a(mod2)=b(mod2)=c(mod2)) or (min(a,b)0)

L=28[[6,2,4],[6,4,2],[8,6,6]]

Dg                 # Get the length of this string (without popping by duplicating first)
  ©                # Store this length in variable `®` (without popping)
   Ý               # Create a list in the range [0,®]
    3ã             # Create all possible triplets by repeating the cartesian product 3 times
ʒ                  # Filter these triplets by:
 ć                 #  Extract head; pop and push remainder-list and head to the stack
  n                #  Square the head
   sP-             #  Take the product of the remainder, and subtract it from the squared head
      ®Q           #  And check if it's equal to the string length in variable `®`
                 # Filter the remaining triplets further by:
  ć‹P              #  Where the first integer is larger than the other two
      }          # And filter it a third time by:
  ÈË               #  Where all three are either odd or even
       ~           #  Or
    yß_            #  It does not contain any 0s

":~("(abs(bc),b×c)

예를 들어 : 트리플렛 [[6,2,4],[6,4,2],[8,6,6]]이로 정렬되고 그 [[8,6,6],[6,2,4],[6,4,2]]후에 만 [8,6,6]남아 있습니다.

Dg_i               # If this completely filtered list is now empty:
    …:~(           #  Push string ":~("
ë                  # Else:
 Σ                 #  Sort the triplets by:
  ¦                #   Remove the first character
   DÆÄ             #   Get the absolute difference between the remaining two integers
   sP             #   And pair it with the product of the remaining two integers
                 #  After we're done sorting: only leave the first triplet

4 단계 : 공백을 삽입하기 위해 문자열을 분할하는 방법에 대한 목록을 작성하십시오. 이것은 다음과 같이 수행됩니다.

[a,b,c]

  • ab2×a+ac2
  • b1ac
  • 마지막 항목으로 :a2

예를 들어 triplet [7,3,5]은 list가 [15,2,2,35]됩니다.

©                  #  Store this triplet in variable `®` (without popping)
 ¤_i               #  If the last value is 0 (which means the string is a square without gap):
    н              #   Simply keep the first value of the triplet
   ë               #  Else:
    ¬U             #   Store the first value in variable `X` (without popping)
      ć            #   Extract the first value; pop and push remainder-list and head to the stack
       α           #   Get the absolute difference of this head with the other two values
        ¤          #   Push the last value (without popping the pair itself)
         ®Ås     #   And repeat it the middle element or `®` minus 1 amount of times
       s           #   Swap to get the difference pair again
        ;          #   Halve both values
         R`        #   Push them reversed to the stack
           X*      #   Multiple the first value by `X`
             +     #   And then add it to the second value
              š    #   Prepend this in front of the repeated list
               Xnª #   And also append the square of `X`

cc

"Alongtesttoseeifitworksasintended."[15,2,2,35]["Alongtesttoseei","fi","tw","orksasintended."]c=5"Alongtesttoseei fi tw orksasintended."a=7["Alongte","sttosee","i f","i t","w o","rksasin","tended."]

    £              #   Then split the string into parts based on this list
     ®θð×          #   Push a string consisting of the last value of `®` amount of spaces
         ý         #   Join the list of substrings by this
          X        #   Push variable `X`
                 #  After the if-else: split the string into parts of that size
     »             #  And then join these by newlines
                   # (after which the top of the stack is output implicitly as result)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.