그루비 나선형을 따라 열광하는“빠른 갈색 여우”


12

소개

주어진 규칙에 따라 유명한 팬 그램의 발신 나선을 출력하는 프로그램을 작성하십시오.

도전

팬 그램은 한 번에 적어도 주어진 알파벳의 모든 문자를 사용 문장입니다. 가장 유명한 팬 그램 중 하나는 Windows 글꼴 뷰어에서 광범위하게 사용되는 것입니다. 즉, " 빠른 갈색 여우가 게으른 개 위로 뛰어 넘습니다 ." 이 텍스트를 기반으로 나선형을 출력하는 것이 문제입니다.

당신의 작업은 다음과 같은 정확한 텍스트를 출력합니다 :

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

생성 방법은 다음과 같습니다.

  • 팬 그램을 즐기는 열성적인 여우가있었습니다. "빠른 갈색 여우가 게으른 개 위로 뛰어 넘습니다." 어느 날 그는 나선의 중심에 있었고 그 안으로 뛰어 들기로 결심했습니다.
  • 그는 처음부터 끝까지 팬 그램을 살펴보고 싶습니다. 알파벳의 n 번째 문자 인 경우 n 번 페인트하고 싶습니다.
  • 그러나 여우는 모퉁이를 돌리는 데별로 좋지 않았으므로 각 모퉁이에 도달하면 멈추고 다음 글자로 전환해야했습니다.
  • 그는 또한 것을 강조하기 위해 팬 그램의 세 번을 반복하기로 결정 빠른 갈색 여우.
  • 당신의 임무는 여우가 그 문자들을 모두 그린 후에 나선이 어떻게 보일지를 보여주는 것입니다.

(이야기가없는 일반 판)

  • 유명한 팬 그램 "빠른 갈색 여우가 게으른 개를 뛰어 넘다"는 공백을 제거하고 모든 문자를 소문자로 3 번 반복하여 생성합니다.

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • 나선은 중심에서 시작하여 문자 "t"로 시작하며 오른쪽으로 이동하여 시작하여 시계 방향으로 바깥쪽으로갑니다. 현재 문자가 알파벳의 n 번째 문자이면 다음 문자로 전환합니다.

    • 나선이 모서리에 도달하거나
    • 현재 문자는 정확히 n 번 인쇄됩니다.

더 잘 설명하기 위해 처음 세 단어 "thequickbrown"과 관련된 나선형이 어떻게 생성되는지 설명하겠습니다.

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

여우는 "t"에서 시작하여 오른쪽으로 이동하여 첫 번째 코너에 도달하여 "t"로 칠한 다음 "h" 로 전환 한 다음 내려 가서 두 번째 코너에 도달하여 "e"로 전환하여 왼쪽으로 이동하여 세 번째 코너, "q"로 전환, 상승, 네 번째 코너, "u"로 전환, 우회전, 코너, "i"로 전환, 하향, 코너 도달 및 "c"로 전환 왼쪽, 다음 코너에 도달하기 전에 3 개의 "c"를 페인트하고 , "k"로 전환 하고 왼쪽으로 간다. 바로 코너에 도달하고, "b"로 전환하여 올라가고, 2 "b"를 페인트 하기 전에 페인트한다. 다음 코너는 "r"로 전환됩니다위로 올라가서 모퉁이에 도달하여 "o"로 전환 한 다음 오른쪽으로 이동 한 다음 "w", 아래로, "n", 왼쪽으로갑니다.

명세서

  • 표준 형식 의 문자열 을 포함하는 선택적 입력을 취할 수 있습니다.

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • 출력은 문자열로 형식화되어야하며 파일 또는 STDERR 대신 STDOUT으로 이동해야하며 줄 바꿈이 올바르게 배치됩니다. 빈 줄의 제목과 끝은 중요하지 않습니다. 각 줄의 머리말과 뒷줄은 허용되지만 일관성이 있어야합니다. 따라서 주어진 텍스트의 한 줄 앞에 5 개의 공백을 추가하면 나선이 동일하게 보이도록 각 행 앞에 정확히 5 개의 공백을 추가해야합니다.

  • 이것은 가장 적은 바이트 수의이기는 입니다.

  • 평소와 같이 기본 허점 이 여기에 적용됩니다.


필요하지는 않지만 설명은 환영합니다.

caird coinheringaahing에 의해 댓글 당 팬 그램이되도록 제목이 편집되었습니다.

게으른 개가 이야기에 나타나기에는 너무 게으르다.

좌표의 간단한 함수로 출력 할 문자를 계산할 수없는 문자열 챌린지를 만드는 것을 목표로합니다.


2
그것은 제목이 팬 그램 아니라고 부끄러운
케어 드 coinheringaahing

@cairdcoinheringaahing 좋은 지적, 나는 하나를 생각해 낼 것입니다. 어떤 제안?
Weijun Zhou

4
@cairdcoinheringaahing 업데이트
Zhou

사소한 점 : 첫 번째 'the'의 'h'가 't'가 아닌 두 번 반복되어서는 안됩니까?
mudkip201 2019

@ mudkip201 다음 문자로 전환하기 전에 모서리에 원래 문자가 그려져 있습니다. 어쩌면 내가 분명히해야합니다.
Weijun Zhou

답변:


5

Stax , 35 34 33 32 바이트

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

온라인으로 실행 및 디버깅

Stax는 약 6 개월 동안 작업해온 언어입니다. 이것은 최초의 퍼블릭 골프입니다. 사업에 착수합시다.

Stax는 일반적으로 인쇄 가능한 ASCII 문자 집합으로 작성됩니다. 이 34 바이트 제출은 CP437 문자 세트의 변형으로 압축 됩니다. 해당 아스키 표현은

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax는 스택 기반 언어이지만 "main"과 "input"의 두 데이터 스택이 있습니다. 대부분의 작업은 기본 스택을 사용하지만 입력 스택에서 입력이 시작됩니다. Stax 명령어는 대부분 1 ~ 2 개의 문자 ASCII 시퀀스입니다. 그것들의 대부분은 오버로드되어, 그들의 행동은 스택의 최상위 몇 값에 의해 결정됩니다.

높은 수준에서이 프로그램은 마지막 행에 문자열을 반복적으로 추가하여 그리드를 만듭니다. 마지막 행이 채워지면 그리드가 시계 방향으로 회전합니다. 결국 그리드를 수평으로 미러링합니다. 더 자세하게 프로그램은 다음과 같이 작동합니다.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row

와우, 나는 도전이 골프 언어로 골프를 치는 첫 공개 모습을 볼 수 있다는 사실에 정말 놀랐습니다. 당신의 지원에 대단히 감사합니다! 이달의 언어에 관심이있으세요? 더 많은 사용자가이 기능을 사용하고 있으며 후보 목록에 곧 표시 될 수 있기를 바랍니다.
Weijun Zhou

@WeijunZhou : 당신은 이것을 의미 합니까? 나는 그것이 지금까지 일인지 몰랐습니다. 나는 지명하지 않습니다. 더 확립 된 언어에 더 적합한 것 같지만 반대하지는 않습니다.
재귀 적

예. 말씀 드린대로 더 잘 설립되면 추천 할 수 있습니다. 오래 걸리지 않기를 바랍니다.
Weijun Zhou

"각 행의 표제 공간은 일관성이있는 한 중요하지 않기 때문에"원하는 경우 다른 바이트를 절약 할 수 있습니다.
Weijun Zhou

1
난 그냥 만든 제출을 STAX를 사용하여. 원한다면 그에 대한 조언을 줄 수도 있습니다. 편집 : 얼마나 우연의 일치. 나는 당신의 제출에서 배우려고 노력할 것입니다.
Weijun Zhou

11

, 66 40 36 바이트

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 텍스트를 입력으로 사용하여 16 바이트를 저장했습니다. 설명:

≔²η

t어떤 이유로 2 초로 시작하십시오 .

FS«

팬 그램의 모든 문자를 반복합니다.

F¬η«

우리는 아직 모퉁이에 도달 했습니까?

한 줄 아래로 (또는 다음 방향이 무엇이든) 움직입니다.

인쇄 방향을 시계 방향으로 90 ° 돌립니다.

⊞υη≔⊕÷Lυ²η

다음 변의 길이를 계산하십시오.

¶»

커서 위치 고정을 완료하십시오. (숯은 모서리 바로 앞쪽이 끝나는 것을 선호하므로 모서리 자체에서 회전했습니다.)

F⊕⌕βι

알파벳에서 현재 문자의 위치만큼 반복합니다.

¿η«

우리가 모퉁이에 도달하지 않으면

≦⊖ηι

수를 줄이고 현재 문자를 인쇄하십시오.


감사합니다. 훌륭하고 잘 설명했습니다. 작은 오타 : 거기에-> 세 번.
Weijun Zhou

이 43 바이트 버전도 사양에 따라 허용됩니다. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Zhou

1
@WeijunZhou 감사합니다, 나는 이전 질문에서 그 절을 눈치 채지 못했습니다.
Neil

2

루비 , 217 212 209 208 바이트

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

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

포인터를 관리하는 데 상당한 시간을 소비하므로 더 많은 골프를 할 여지가있을 수 있습니다.

-5 바이트 : 입력 하기 전에 팬 그램을 3 배로 합니다. Weijun Zhou 에게 감사합니다 .

-3 바이트 : 마지막 다리를 처음부터 생성하는 대신 입력 문자열을 채우고 마지막 다리를 자릅니다.

-1 바이트 : &&버리기 값을 갖는 삼항 연산자 대신 사용하십시오 .

설명:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}

1
좋은 제출과 명확하게 설명했다. 나는의 사용을 감사 rl람다. 현재 답변을 바탕으로 마지막 다리는 샘플 출력을 생성하기 위해 C 스 니펫을 작성하지 않았지만 문제를 일으키는 것으로 보입니다 ...
Weijun Zhou

1
s*=3완전히 저장 0하고 ?:연산자를 생략 할 수 있습니다 . tio.run/…
Zhou

1
@WeijunZhou Ahh, 팁 주셔서 감사합니다. 0그래도 필요합니다 . 그렇지 않으면 Ruby가 c+=1다음 행에서 를 가져 와서 대부분 의 시간 동안 만 실행합니다 . 그리고 좋은 도전!
benj2240

네 말이 맞아 나는 조심스럽게 보지 않았다. 감사합니다. 나는 당신이 그것을 즐거워서 기쁘다.
Weijun Zhou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.