Các số có đối xứng quay


27

Đưa ra một số nguyên, sản lượng một truthy giá trị nếu nó là như nhau lộn ngược (xoay 180 °) hoặc một falsy giá trị khác.

0, 18có đối xứng quay. 6trở thành 9và ngược lại.

Chuỗi số tạo ra kết quả trung thực: 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, ...

Câu hỏi này được lấy cảm hứng từ danh tiếng của riêng tôi tại thời điểm đăng : 6009.


Điều này trông giống như một bản sao của các số an toàn xoay vòng In .
xnor

2
@xnor Chúng không giống nhau chút nào. Câu hỏi đó liên quan đến việc liệu số đó có trở thành một số hợp lệ khác khi quay hay không (và nối thêm một khoảng thời gian để giữ cho số đó khác biệt), chứ không phải nó có phải là cùng một số không. Tôi đã xem xét câu hỏi đó trước khi đăng bài của tôi.
mbomb007

@ mbomb007 Sai lầm của tôi. Tôi mở lại.
xnor

Chúng ta có thể lấy đầu vào là một chuỗi?
xnor

@xnor Nếu ngôn ngữ có các loại số, ví dụ, nó nên sử dụng chúng cho các tham số chức năng. Nhưng nếu, trong Python chẳng hạn, bạn lấy raw_input, người dùng đã nhập một số nguyên, sẽ trở thành một chuỗi phía sau hậu trường. Đó là tốt.
mbomb007

Câu trả lời:


6

05AB1E , 22 16 15 14 byte

Mã số:

Â23457ð«-69‡Q

Hãy thử trực tuyến!


Mã trước:

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

Để tìm ra nếu chuỗi là đối xứng quay, chúng ta chỉ cần phiên âm 69với 96, đảo ngược chuỗi và kiểm tra xem chúng có bằng nhau không. Một điều khác chúng ta cần phải biết là nếu số chỉ chứa các chữ số 0, 1, 8, 69. Vì vậy, đó chính xác là những gì chúng ta sẽ làm:

                     # 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.

Phần „vd•thực sự chuyển đổi chuỗi vdtừ cơ sở 190 sang cơ sở 10 . Bạn có thể thử điều này ở đây .

            Ã        # 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.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


9

Python 2, 50 byte

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

Phương thức '01xxxx9x86'.findnày đưa một ký tự chữ số thành số lộn ngược, với bất kỳ chữ số không thể bỏ qua nào -1. Hàm này được ánh xạ tới chuỗi số đảo ngược, tạo ra một danh sách các chữ số.

Điều này được chuyển đổi thành một chuỗi với [1::3]thủ thuật , ngoại trừ thay vào đó là đảo ngược bằng cách thực hiện [-2::-3](nhờ Dennis cho việc này, tiết kiệm 4 byte) và so với chuỗi số ban đầu. Bất kỳ -1từ các chữ số không thể bỏ qua sẽ điều chỉnh sai chuyển đổi, làm cho nó thất bại.


56 byte:

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

Kiểm tra xem chuỗi số có bị đảo ngược giống như chuỗi thay thế lộn ngược không. Các chữ số không thể lật được thay thế bằng 'x'để luôn trả lời sai.

Việc thay thế được thực hiện với translatechuỗi 256 ký tự, thay thế các giá trị ASCII tương ứng. Chỉ có 10 giá trị 48quan 57trọng, nhưng tôi đã đệm đến độ dài 16 để làm cho tổng chiều dài là 256. Tôi tự hỏi liệu có cách nào ngắn hơn không.

Một số cách tiếp cận khác (độ dài 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]))

Có lẽ điều này sẽ giúp: codegolf.stackexchange.com/a/48994/34718
mbomb007

6

Ruby, 54 46 byte

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

Tôi không biết, chức năng ẩn danh có được phép hay không

Về cơ bản ý tưởng tương tự như câu trả lời của Python2. Nếu đầu vào không phải là số nguyên, hành động xấu (tức là abacho true)


1
Chào mừng bạn đến với Câu đố lập trình và Code Golf! Câu trả lời đầu tiên hay: D Các chức năng ẩn danh được phép trong mọi ngữ cảnh nơi các chức năng có tên bình thường được cho phép.
mèo


4

JavaScript (ES6), 56 byte

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

Cái ... trong mảng làm gì?
ericw31415

@ ericw31415 Trong trường hợp này, nó biến chuỗi thành một mảng các ký tự. Tổng quát hơn, bạn có thể cung cấp bất cứ thứ gì có thể lặp lại và nó sẽ lặp lại nó và bao gồm các phần tử trong mảng.
Neil

Vậy [... '' + n] về cơ bản là giống với n.split ("")? Tôi có thể đọc thêm về điều này ở đâu?
ericw31415

@ ericw31415 Vâng, trong trường hợp này tôi sử dụng nó như một cách viết tắt cho split``. Xem một mảng mạnh mẽ hơn theo nghĩa đen
Neil

2

Perl, 29 26 byte

Bao gồm +1 cho -p

Chạy với đầu vào trên STDIN:

rotation.pl <<< 69

rotation.pl:

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

2

Thạch, 16 15 byte

,ȷ9+90860¤Dị/⁼Ṛ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

,ȷ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.

Câu trả lời này được gắn với một câu khác ở 15 byte, nhưng câu trả lời khác đã được đăng đầu tiên. Bạn có thể cạo đi 1 byte không?
mbomb007

Tôi đã cố gắng khá nhiều; Tôi không nghĩ rằng tôi có thể. Tuy nhiên, bộ ngắt kết nối mặc định của chúng tôicâu trả lời đầu tiên để đạt được số điểm chiến thắng và tôi nghĩ rằng tôi đã đạt được 15 điểm đầu tiên.
Dennis

2

Võng mạc, 57 49 byte

8 byte được lưu nhờ @Martin Büttner .

+`^(([018])(.*)\2|9(.*)6|6(.*)9)$
$3$4$5
^[018]?$
  • Áp dụng giảm như vậy: 1610880191-> 61088019-> 108801-> 0880-> 88-> (trống).
  • Lợi nhuận 1nếu chỉ 0, 1, 8, hoặc (trống) còn lại.
  • Trả về 0nếu không.

Hãy thử trực tuyến!


2

sh, 40 33 byte

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

Nhập thông qua đối số dòng lệnh, đầu ra thông qua mã thoát. Tạo tất cả các testcase:

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

2

TSQL, 122 byte

Tôi chưa quen với môn đánh gôn, nên không biết cách đếm các ký tự. Đếm nó là 1 ở đây vì số được sử dụng trong trường hợp này là 8

Điều này sẽ trả về 1 khi giá trị đảo ngược khớp và không có gì khi nó không khớp:

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))

Con người có thể đọc được:

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

Võng mạc , 40 38 33 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này sử dụng một cách tiếp cận hoàn toàn khác với câu trả lời Retina khác. Thay vì loại bỏ tất cả các phần đối xứng, chúng ta chỉ cần thực hiện chuyển đổi đảo ngược chuỗi và hoán đổi 69s và sau đó so sánh cho bằng. Để đảm bảo rằng không có chữ số không đối xứng xuất hiện, chúng tôi cũng biến chúng thành 9s trong một nửa.

$
;$_

Chúng tôi nhân đôi đầu vào bằng cách khớp đầu cuối của chuỗi và chèn ;theo sau là toàn bộ đầu vào.

T`92-7`69`;.+

Điều này thực hiện phiên âm ký tự chỉ ở nửa sau bằng cách kết hợp nó với ;.+. Hai bộ chuyển ngữ mở rộng thành:

9234567
6999999

Bởi vì 2-7biểu thị một phạm vi và bộ mục tiêu được đệm với ký tự cuối cùng để khớp với độ dài của bộ nguồn. Do đó, các giao dịch hoán đổi sân khấu 69cũng biến tất cả 23457thành 9s.

+`(.);\1
;

Lặp đi lặp lại ( +) loại bỏ một cặp ký tự giống hệt nhau xung quanh ;. Điều này sẽ tiếp tục cho đến khi chỉ ;còn lại hoặc cho đến khi hai ký tự xung quanh ;không còn giống nhau, điều đó có nghĩa là các chuỗi không đảo ngược nhau.

^;

Kiểm tra xem ký tự đầu tiên là ;và in 0hoặc 1phù hợp.


Đòn bẩy, rất đòn bẩy.
Máy


1

Bình thường, 17 byte

!-FmC_B`d,QC\􄽥

Kiểm tra nó trong Trình biên dịch Pyth .

Làm thế nào nó hoạt động

!-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

Visual Basic cho Ứng dụng, 150 111 byte

Có thể sử dụng trong bảng điều khiển hoặc dưới dạng UDF.

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

Cải thiện bằng cách tận dụng các chuyển đổi loại ngầm định và bằng cách thực hiện ba bước hoán đổi thay vì hai bước ở mỗi bên của phương trình. Đếm bao gồm FunctionEnd Functionbáo cáo.


1

GNU sed, 84 byte

(bao gồm +1 cho -rcờ)

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

Nếu dòng kết thúc bằng một vòng quay của ký tự bắt đầu, hãy cắt cả hai đầu bằng một. Lặp lại cho đến khi không có trận đấu. Tài khoản cho một ký tự đối xứng duy nhất, sau đó nếu có bất cứ điều gì còn lại, đầu vào không đối xứng và chúng tôi trả về sai; Nếu không thì trả lại đúng.


1

C, 82 byte

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

Mở rộng

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;
}

Giải trình

Chúng tôi đảo ngược các chữ số của xviệc sử dụng số học modulo-10, thay thế 6 và 9 bằng các phản xạ của chúng khi chúng tôi đi. Chúng tôi thay thế các chữ số không đối xứng xoay bằng số không (lưu ý rằng chúng tôi có thể xử lý các số đối xứng và / hoặc twos bằng cách thay đổi bảng thay thế s). Nếu số mới bằng với số gốc (được lưu trong 'z'), thì nó là đối xứng xoay.

Chương trình kiểm tra

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

Điều này in danh sách các số đối xứng được đưa ra trong câu hỏi.


0

MATL, 25 21 22 byte

j69801VmAGtP69VtPXE=vA

Hãy thử trực tuyến!

Giải trình

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

Nghiêm túc, 23 byte

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

Hãy thử trực tuyến!

Đây thực chất là một cổng của giải pháp Python 2 của xnor .

Giải trình:

,$;`"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

Kotlin, 69 byte

Cái này lấy số, chuyển đổi nó thành một chuỗi, xoay nó và sau đó so sánh nó với bản gốc như một chuỗi cho sự bình đẳng. Các chữ số không thể xoay được chuyển đổi đơn giản thành0

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

Kiểm tra nó ở đây!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.