코드 골프의 애니메이션


28

코드를 휘젓는 몇 개의 문자를 제거하는 코드 골프 항목을 볼 때, 나란히 다른 diff에 대한 편집 히스토리를 살펴 보겠습니다. 보고 배우기 :)

이 과제는 가장 귀여운 애니메이션 차이를 생성하는 프로그램을 만드는 것입니다.

  • 입력은 일련의 일련의 텍스트 버전이됩니다.
  • 프로그램은 모든 프로그래밍 언어로 작성 될 수 있습니다.
  • 프로그램이 특정 프로그래밍 언어로 데이터를 입력하도록 제한하는 것이 허용됩니다.
  • 프로그램은 특정 입력 데이터로 조정되지 않아야합니다. 이 프로그램은 일반적이어야하며 주문 된 일련의 텍스트 버전에서 작동해야합니다.
  • 입력의 각 버전에 대해 버전의 전체 텍스트가 표시되는 출력 애니메이션에 해당 시간이 있어야합니다. 버전 단계 사이의 차이를 애니메이션해야하며 모든 버전 단계가 있어야하며 출력에 순서대로 있어야합니다. 이 키 프레임에는 버전 크기가 표시되어야하며 뷰어는 이것이 해당 시점에서보고있는 완전한 버전임을 이해해야합니다.
  • 프로그램은 diff를 계산하기 위해 타사 코드를 사용할 수 없습니다.
  • 구문 강조 출력은 선택 사항입니다. 프로그램이 구문 색상을 지정하는 경우 타사 코드를 사용하지 않을 수 있습니다.
  • 출력은 애니메이션 GIF입니다.
  • 프로그램은 타사 라이브러리를 사용하여 GIF를 작성할 수 있습니다.
  • 이것은이다 정도의 정의에 따라, 인기 콘테스트 이 사이트에서 가장 많은 표를 승리로 항목 .

다음 은 Python의 ndiffPillow의 기본적인 애니메이션 GIF 지원을 사용하고 각 추가 및 제거 단계에 애니메이션을 적용 하는 간단한 예제 스크립트 입니다 .

개인적으로, 이것은 꽤 가난한 직업이라고 생각합니다. 구문 강조 표시를 수행하지 않고 재 배열 된 코드 청크를 이동하거나 이동하지 않으며 누군가가 실시간으로 편집하는 느낌이 들지 않습니다. 또한 키 프레임에서 입력 크기를 바이트 단위로 표시하는 것과 관련된 규칙을 위반하고 타사 라이브러리를 사용하여 디핑을 수행합니다. 개선의 여지가 많습니다!

또한 잘 알려진 항목이 codegolf.stackexchange.com 커뮤니티에도 유용한 재미있는 도구가되기를 바랍니다. 따라서 다른 사람들이 프로그램을 쉽게 실행하고 사용할 수 있다면 높이 평가됩니다.


1
확장 된 대화가 여기에서 사라지는 것처럼 보입니다. 이 게시물에 대한 토론은이 메타 질문 에서 찾을 수 있습니다 .
Doorknob

답변:


11

(OP)

여기에 이미지 설명을 입력하십시오

이것은 질문의 예제 Python 스크립트를 기반으로합니다.

나는 영리한 인내심 차이보다는 가장 간단한 편집 거리를 사용했습니다.

게놈 정렬을 위해 Multi Sequence Alignment 알고리즘이 있으며 각 인접 프레임 쌍을 고려하는 것보다 더 나은 작업을 수행 할 수 있습니까?

diff의 편집 거리 를 구현하는 것이 얼마나 간단한 지 즐겁게 놀랐고 파이썬 difflib.ndiff형식 과 호환되도록 만들었습니다 . 웹에서 찾을 수있는 편집 거리에 대한 많은 Python 구현이 있지만, 내 공식은 약간 정교하고 실제로 테이블의 경로를 결정하는 까다 롭지 만 필수적인 부분을 처리한다고 생각합니다. 우리의 맥락에서, 우리는 단지 몇 개의 단계가 아니라 하나를 다른 것으로 바꾸는 단계를 알아야합니다.

나는 부족함, 파이썬 등을 포함하여 대부분의 c와 같은 언어에 대처할 수 있어야 하는 매우 간단한 토크 나이저 를 사용하여 구문 강조를 도입 했습니다. 소스를 구두점, 공백, 문자열 (이스케이프 지원)로 분할하고 다른 모든 항목은 식별자이며 키워드 목록과 비교하여 확인됩니다. 색상은 또한 변화에 용이하다.

구문 강조를 동적 언어로 쉽게 통합 할 수있었습니다. 형광펜은 문자 및 색상 쌍의 목록을 출력하며 차이점은 문자열을 비교하는지 또는 비교 가능한 임의의 반복 가능한지 여부에 관계가 없습니다! 먼저 강조 표시 한 다음 디핑하는 흥미롭고 의도적 인 효과는 변경되지 않고 색상이 변경되는 문자가 애니메이션으로 표시된다는 것입니다. 각 프레임의 하이라이트를 계산하고 싶지 않기 때문에 닫는 문자열을 삭제하면 갑자기 큰 텍스트 덩어리가 문자열로 깜박입니다.

GIF 제작에 대한 파이썬의 지원은 다소 제한적입니다. PIL은 그것을하지 않으며 베개는 오히려 나쁘게합니다. 필로우를 사용하지만 루핑 등을 압축하고 추가하려면 gifsicle을 실행해야합니다. 필로우는 프레임 타이밍을 정확하게 쓰지 못하고 처리 방법 등을 관리하지 못하게합니다. 이는 다른 방법으로 평평한 프레임을 처리하는 후 처리 단계보다 장면을 이해하는 것이 부끄러운 일입니다.

소스 코드


1
동일한 diff 알고리즘을 구현했습니다. 나중에 Cython을 사용하여 다시 작성하고 100 배의 속도를 얻었습니다.
Ray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.