이진 문자열 반 반전


12

이것은 내의 후속 질문 Puzzling.SE 질문 : 함수가 있다면 내가 물었다 F 그래서, 부울 문자열로 부울 문자열을 매핑 F (F (B)) = (b)는 반대로 모든 입력 문자열 B . ( 역순으로 , 나는 비트 순서를 반대로하는 함수를 의미합니다.)

위의 링크에는 위의 f ''라는 증거가 포함 된 긍정적 인 답변이 포함되어 있지만 살펴보기 전에 스스로 질문을 숙고하고 싶을 수도 있습니다.

그러한 함수 f 를 가능한 한 적은 바이트로 구현하십시오.

  • STDIN에서 입력을 읽거나 함수 인수를 취할 수 있습니다. 결과 문자열을 STDOUT에 쓰거나 리턴하십시오.

  • 어느 쪽이든, 두 개의 다른 바이트 또는 선택한 문자 (예 : 01, 및 \x00\x01)의 실제 문자열을 사용 하거나 진실 / 거짓 값 의 배열 / 목록으로 작업 할 수 있습니다 . 그러나 두 가지 값을 선택하고 그 값을 고수하십시오.

  • f 의 단일 응용 프로그램 결과는 이진 문자열 자체 여야합니다b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b .

  • 귀하의 기능은 총체적 이어야합니다 . 특히, 입력은 빈 문자열이거나 1 비트 길이 일 수 있습니다. 문자열 길이의 상한은 없습니다.

  • 또한 순수 해야합니다 : 함수 호출간에 전역 상태를 유지하지 마십시오. 입력 문자열은 출력 문자열을 완전히 결정해야합니다.


출력과 입력의 길이가 다를 수 있습니까?
Luis Mendo

확실한! (실제로, 그렇지 않으면 도전은 불가능할 것입니다.)
Lynn

길이가 1 또는 0 인 문자열에 대해 작동해야합니까?
CalculatorFeline

예; 기능은 총계 여야합니다. 나는 질문에서 이것을 분명히했다!
Lynn

답변:



7

파이썬 2, 64 69 바이트

def f(s):p=(s+s).find(s,1);return[s[~p::-1],s+s[:p]][len(s)/p%2]

언 골프 드 :

def f(s):
    p = (s+s).find(s,1)
    n = len(s)/p
    return s[:p][::1|n%-2] * -~(n-1^1)

이것은 즉, 최소한의 문자열의 기간, 발견 p그러한 s길이의 문자열입니다 p반복 n시간 (I가 발견 golfy 방법 SO에 대한 참조). 그런 다음 n홀수이면 기간이 한 번 더 반복됩니다. 경우 n에도, 그것은 시대의 하나의 반복을 제거하고 반전.

1 <-> 2, 3 <-> 4 등의 함수 매핑을 구현하는 데 도움을 주신 @ Sp3000에게 감사합니다.


... 골프되지 않은 코드는 언제 업데이트됩니까?
CalculatorFeline

@CatsAreFluffy 나는 ungolfed 코드를 수정하는 계획이 없습니다. 반면에 영어는 최신입니다.
feersum

2

펄, 49 47 바이트

에 +2 포함 -lp

@feersum의 매우 멋진 알고리즘을 기반으로

STDIN에서 입력으로 실행

perl -lp halfreverse.pl <<< "101001"

halfreverse.pl:

/^(.+?)((\1\1?)*)$/;$_=$3eq$1?reverse$2:$_.$1

설명

/^               $/         Match the complete input string
  (.+?)                     Non-greedy match. Try only one digit at the start,
                            if that doesn't work try 2, then 3 etc. The string
                            being tried is remembered in backreference \1
       ((\1\1?)*)           Try to repeat \1 as many times as possible but
                            prefer in groups of 2. Fall back to only 1 at the
                            end of the string if the trailing part has an odd
                            number of \1 (so the total count is even)

   $3eq$1                   So the last match $3 equals the first match $1
         ?                  if and only if the total count is even
          reverse$2         If total count is even drop the first instance of
                   :        \1 and reverse
                    $_.$1   If total count is odd extend $_ by one instance
$_=                         Assign result

어떻게 작동합니까 ??
CalculatorFeline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.