회전 대칭이있는 숫자


27

정수 주어 출력은 truthy의 그것이 동일한 거꾸로 경우 값이나 (180 ° 회전) falsy 그렇지 값.

0, 18회전 대칭이있다. 6되고 9그 반대도 마찬가지입니다.

확실한 결과를 산출하는 일련의 숫자 : OEIS A000787

0, 1, 8, 11, 69, 88, 96, 101, 111, 181, 609, 619, 689, 808, 818, 888, 906, 916, 986, 1001, 1111, 1691, 1881, 1961, 6009, 6119, 6699, 6889, 6969, 8008, 8118, 8698, 8888, 8968, 9006, 9116, 9696, 9886, 9966, 10001, 10101, 10801, 11011, 11111, 11811, 16091, ...

이 질문은 게시 당시의 저의 명성에서 영감을 받았습니다 6009.


이것은 인쇄 안전 숫자 의 속임수처럼 보입니다 .
xnor

2
@xnor 그들은 전혀 같지 않습니다. 이 질문은 숫자가 같은 숫자인지 아닌 회전 할 때 숫자가 다른 유효한 숫자가 될지 여부를 나타냅니다. 나는 내 질문을 게시하기 전에 그 질문을 조사했다.
mbomb007

@ mbomb007 내 실수. 나는 다시 열었다.
xnor

입력을 문자열로 취할 수 있습니까?
xnor

@xnor 언어에 숫자 유형이있는 경우 예를 들어 함수 매개 변수에 해당 유형을 사용해야합니다. 그러나 파이썬에서 예를 들어을 가져 가면 raw_input사용자가 정수를 입력하면 배경 뒤의 문자열이됩니다. 괜찮아.
mbomb007

답변:


6

05AB1E , 22 16 15 14 바이트

암호:

Â23457ð«-69‡Q

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


이전 코드 :

Â69‡Q¹¹„vd•ÃQ*

문자열이 회전 대칭 인 경우 파악하기 위해, 우리는 단지 음역 필요 6996문자열을 반대하고 그들이 동일한 경우 확인. 수 있다면 우리가 알아야 할 다른 것은은 단지 숫자 포함 0, 1, 8, 69. 이것이 바로 우리가 할 일입니다.

                     # Bifurcate the input, which pushes input and input[::-1]
 69Â                  # Bifurcate 69, which pushes 69 and 96.
    ‡                 # Transliterate 69 with 96 in the input, e.g. 1299 becomes 1266.
     Q                # Check for equality.
      ¹¹              # Push input again twice.
        „vd•          # Compressed version for 10869.

„vd•부분은 실제로 문자열 변환 vd에서 베이스 (190)베이스 (10) . 여기서 시도해 볼 수 있습니다 .

            Ã        # Keep the characters of the second string in the first string.
                       667788 would become 6688 (since 7 is not in 10869).
             Q       # Check for equality.
              *      # Multiply the top two numbers, which actually does an AND function.

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


9

파이썬 2, 50 바이트

lambda n:`n`==`map('01xxxx9x86'.find,`n`)`[-2::-3]

이 메서드 '01xxxx9x86'.find는 뒤집을 수없는 숫자를 사용하여 숫자를 거꾸로 한 숫자로 만듭니다 -1. 이 함수는 반전 된 숫자 문자열에 매핑되어 숫자 목록을 생성합니다.

이것은 대신 [1::3]트릭 을 사용하여 문자열로 변환됩니다 ( 단, [-2::-3]Dennis에게 감사하여 4 바이트 절약). 원래 숫자 문자열과 비교하여 수행합니다. 모든 -1unflippable 자리에서의 그것이 실패하고, 변환을 잘못 정렬됩니다.


56 바이트 :

lambda n:`n`[::-1]==`n`.translate('01xxxx9x86______'*16)

거꾸로 된 숫자 문자열이 거꾸로 된 대체품과 동일한 지 확인합니다. 뒤집을 수없는 숫자는 'x'항상 잘못된 답을 제공하도록 대체됩니다 .

대체는 translate256 자 문자열로 이루어지며 해당 ASCII 값을 대체합니다. 만 10 개 값은 48하는 57문제,하지만 난 짧은 방법이 경우 총 길이가 256 I 경이 될 수 있도록 길이 16 패딩.

다른 접근법 (길이 59, 60, 60) :

lambda n:set(zip(`n`,`n`[::-1]))<=set(zip('01896','01869'))
r=lambda s:set(zip(s,s[::-1]));lambda n:r(`n`)<=r('9018106')
lambda n:all(a+b in'001188969'for a,b in zip(`n`,`n`[::-1]))

아마 이것이 도움이 될 것입니다 : codegolf.stackexchange.com/a/48994/34718
mbomb007

6

루비, 54 46 바이트

 ->a{(b=a.to_s).tr('1-9','1w-z9x86').reverse==b}

모르겠습니다. 익명 기능은 허용 여부와 다릅니다.

기본적으로 Python2 답변과 동일한 아이디어입니다. 입력이 정수가 아닌 경우, 나쁜 행동을합니다 (예 : aba제공 true)


1
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! Nice first answer : D 익명의 함수 일반적인 명명 된 함수가 허용되는 모든 컨텍스트에서 허용됩니다.
cat


4

자바 스크립트 (ES6), 56 바이트

n=>n==[...''+n].reverse().map(c=>'0100009086'[c]).join``

배열에서 ...는 무엇을합니까?
ericw31415

@ ericw31415이 경우 문자열을 문자 배열로 바꿉니다. 더 일반적으로 반복 가능한 것을 제공 할 수 있으며 반복하고 배열에 요소를 포함시킵니다.
Neil

[... ''+ n]은 n.split ( "")과 본질적으로 같은 것입니까? 이에 대한 자세한 내용은 어디서 볼 수 있습니까?
ericw31415

@ ericw31415 예,이 경우에는을위한 속기로 사용합니다 split``. 참조 더 강력한 배열 리터럴

2

펄, 29 26 바이트

에 +1 포함 -p

STDIN의 입력으로 실행하십시오.

rotation.pl <<< 69

rotation.pl:

#!/usr/bin/perl -p
$_=reverse==y/962-7/69a/r

2

젤리, 16 15 바이트

,ȷ9+90860¤Dị/⁼Ṛ

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

작동 원리

,ȷ9+90860¤Dị/⁼Ṛ  Main link. Argument: n (integer)

         ¤       Evaluate the three links to the left as a niladic chain:
 ȷ9              Yield 1000000000.
    90860        Yield 90860.
   +             Add to yield 1000090860.
,                Pair; yield [n, 1000090860].
          D      Convert both integers to base 10.
           ị/    Reduce by index, i.e., for each digit of n, retrieve the element
                 of [1, 0, 0, 0, 0, 9, 0, 8, 6, 0] at that index (1-based).
              Ṛ  Yield the digits of n in reversed order.
             ⁼   Test for equality.

이 답변은 15 바이트의 다른 답변과 관련이 있지만 다른 답변이 먼저 게시되었습니다. 1 바이트를 면도 할 수 있습니까?
mbomb007

나는 아주 열심히 노력했다. 나는 할 수 없다고 생각합니다. 그러나 우리의 기본 타이 브레이커첫 번째로 승리 점수를 얻습니다 . 그리고 나는 15에 먼저 도달했다고 생각합니다.
Dennis

2

레티 나, 57 49 바이트

@Martin Büttner 덕분에 8 바이트가 절약되었습니다 .

+`^(([018])(.*)\2|9(.*)6|6(.*)9)$
$3$4$5
^[018]?$
  • 다음과 같이 축소를 적용하십시오 1610880191.-> 61088019-> 108801-> 0880-> 88-> (비어 있음).
  • 반환 1하는 경우에만 0, 1, 8, 또는 (빈) 남아 있습니다.
  • 0그렇지 않으면 반환 합니다.

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


2

sh, 40 33 바이트

[ `rev<<<$1|tr 6923457 96` = $1 ]

명령 행 인수를 통한 입력, 종료 코드를 통한 출력 모든 테스트 케이스를 생성하십시오.

for i in `seq 0 10000`
do
  if [ `rev<<<$i|tr 6923457 96` = $i ]
  then
    echo $i
  fi
done

2

TSQL, 122 바이트

나는 골프를 처음 코딩하기 때문에 문자 수를 세는 방법을 잘 모릅니다. 이 경우 사용 된 숫자가 8이므로 여기에서 1로 계산

반전 된 값이 일치하면 1을 반환하고 일치하지 않으면 아무것도 반환하지 않습니다.

SELECT 1FROM(values(8))x(x)WHERE(x)NOT like'%[23457]%'and REPLACE(REPLACE(x,6,4),9,6)=REVERSE(REPLACE(REPLACE(x,9,4),9,6))

인간이 읽을 수있는 내용 :

SELECT 1
FROM
  (values(808))x(x)
WHERE(x)
  NOT like'%[23457]%'
  and REPLACE(REPLACE(x,6,4),9,6)=REVERSE(REPLACE(REPLACE(x,9,4),9,6))

2

망막 , 40 38 33 바이트

$
;$_
T`92-7`69`;.+
+`(.);\1
;
^;

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

설명

이것은 다른 Retina 답변과 완전히 다른 접근법을 사용합니다. 모든 대칭 부분을 제거하는 대신 단순히 문자열 반전과 스와핑 69s 변환을 수행 한 다음 동등성을 비교합니다. 비대칭 숫자가 나타나지 않도록하기 위해 9반 으로 s로 바꿉니다.

$
;$_

우리는 문자열의 끝을 일치 ;시키고 전체 입력을 삽입하여 입력을 복제합니다 .

T`92-7`69`;.+

이 문자는와 일치하여 후반에만 문자 음역을 수행합니다 ;.+. 두 음역 세트는 다음과 같이 확장됩니다.

9234567
6999999

왜냐하면 2-7범위와 목표 세트이고 상기 마지막 문자로 채워진다 소스 세트의 길이와 일치한다. 따라서, 무대 스왑 69및 모든의 회전 234579의.

+`(.);\1
;

에서 +주위에 동일한 문자 쌍을 반복적으로 제거합니다 ( ) ;. 이 ;문자 만 남거나 두 문자 ;가 더 이상 동일하지 않을 때까지 계속됩니다. 이는 문자열이 서로 반대가 아님을 의미합니다.

^;

첫 번째 문자가 ;인쇄되어 있는지 0또는 1적절하게 확인하십시오 .


레버, 매우 레버.
CalculatorFeline


1

Pyth, 17 바이트

!-FmC_B`d,QC\􄽥

Pyth Compiler 에서 테스트하십시오 .

작동 원리

!-FmC_B`d,QC\􄽥  (implicit) Store the input in Q.

            \􄽥  Yield the Unicode character with code point 1068901.
           C    Compute its code point.
         ,Q     Pair the input and 1068901.
   m            Map; for each d in [Q, 1068901]:
       `d         Yield the string representation of d.
     _B           Yield the pair of `d` and `d` reversed.
    C             Zip. For the second string, this gives
                  ['11', '00', '69', '88', '96', '00', '11'].
 -F             Fold by difference, i.e., removes all pairs in the second list
                from the first list.
!               Logically negate the result, returning True iff the list is empty.

1

애플리케이션, 비주얼 베이직 150 111 바이트

콘솔 또는 UDF로 사용할 수 있습니다.

Function c(b)
c=(Not b Like"*[!01869]*")And b=Replace(Replace(Replace(StrReverse(b),9,7),6,9),7,6)
End Function

암시 적 유형 변환을 활용하고 방정식의 각 측면에서 2 단계 대신 3 단계 스왑을 수행하여 향상 포함 FunctionEnd Function진술을 포함 합니다.


1

GNU sed, 84 바이트

( -r플래그에 +1 포함 )

:
s/^6(.*)9$/\1/
s/^9(.*)6$/\1/
s/^([081])(.*)\1$/\2/
t
s/^[081]$//
s/.+/0/
s/^$/1/

선이 시작 문자의 회전으로 끝나는 경우 양쪽 끝을 하나씩 자릅니다. 일치하지 않을 때까지 반복하십시오. 단일 대칭 문자를 고려한 다음 남아있는 것이 있으면 입력이 대칭이 아니고 false를 반환합니다. 그렇지 않으면 true를 반환합니다.


1

C, 82 바이트

char*s="0100009086";f(x){int y=0,z=x;for(;x;x/=10)y=y*10+s[x%10]-'0';return z==y;}

넓히는

char *s = "0100009086";
int f(int x)
{
    int y=0, z=x;
    for(; x; x/=10)
        y = y*10 + s[x%10]-'0';
    return z==y;
}

설명

우리는 숫자를 뒤집습니다 x 모듈로 -10 산술 사용 6과 9를 반사로 대체합니다. 회전 비대칭 자릿수를 0으로 바꿉니다 (대체 테이블 교체만으로 대칭 5 및 / 또는 2를 처리 할 수 ​​있습니다 s). 새 숫자가 원래 숫자와 같으면 ( 'z'로 저장) 회전 대칭입니다.

테스트 프로그램

#include <stdio.h>
int main()
{
    int i;
    for(i=0;  i <= 16091; ++i)
        if (f(i))
            printf("%d\n", i);
}

질문에 주어진 대칭 숫자 목록을 인쇄합니다.


0

MATL, 25 21 22 바이트

j69801VmAGtP69VtPXE=vA

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

설명

j       % Explicitly grab input as string
69801   % Number literal
V       % Convert to a string
mA      % Check if all input chars are members of this list
G       % Explicitly grab the input
tP      % Duplicate and flip it
69      % Number literal
V       % Convert to string ('69')
tP      % Duplicate and flip it ('96')
XE      % Replace all '6' with '9', and '9' with '6'
=       % Check that this substituted string is equal to the original
v       % Vertically concatenate all items on the stack
A       % Ensure everything is true
        % Implicitly print boolean result

0

진심으로, 23 바이트

,$;`"01xxxx9x86"í`MRεj=

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

이것은 본질적으로 xnor의 Python 2 솔루션 포트입니다 .

설명:

,$;`"01xxxx9x86"í`MRεj=
,$;                      push two copies of str(input)
   `"01xxxx9x86"í`M      map: get each digit's rotated digit (or x if not rotatable)
                   Rεj   reverse and join on empty string to make a string
                      =  compare equality with original input

0

코 틀린, 69 바이트

숫자를 가져 와서 문자열로 변환 한 다음 회전 한 다음 동일한 문자열로 원본과 비교합니다. 회전 불가능한 숫자는 간단히0

{i->"$i".map{"0100009086"[it-'0']}.joinToString("").reversed()=="$i"}

여기에서 테스트하십시오!

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