Bilangan dengan Rotational Symmetry


27

Diberikan bilangan bulat, mengeluarkan nilai kebenaran jika itu terbalik terbalik (diputar 180 °) atau nilai palsu sebaliknya.

0,, 1dan 8memiliki simetri rotasi. 6menjadi 9dan sebaliknya.

Urutan angka yang menghasilkan hasil yang benar: 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, ...

Pertanyaan ini terinspirasi oleh reputasi saya sendiri pada saat posting: 6009.


Ini terlihat seperti duplikat angka-angka aman rotasi-Cetak .
xnor

2
@ xnor Mereka tidak sama sekali. Pertanyaan itu melibatkan apakah nomor itu akan menjadi nomor lain yang valid pada rotasi (dan menambahkan periode untuk membuatnya berbeda), bukan apakah itu nomor yang sama. Saya melihat pertanyaan itu sebelum memposting pertanyaan saya.
mbomb007

@ mbomb007 Kesalahan saya. Saya membuka kembali.
xnor

Bisakah kita mengambil input sebagai string?
xnor

@ xnor Jika bahasa tersebut memiliki tipe numerik, ia harus menggunakannya, untuk parameter fungsi, misalnya. Tetapi jika, dalam Python misalnya, Anda ambil raw_input, pengguna memasukkan bilangan bulat, yang akan menjadi string di belakang layar. Tidak apa-apa.
mbomb007

Jawaban:


6

05AB1E , 22 16 15 14 byte

Kode:

Â23457ð«-69‡Q

Cobalah online!


Kode sebelumnya:

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

Untuk mencari tahu apakah string adalah simetris rotasi, kita hanya perlu transliterasi 69dengan 96, membalikkan string dan memeriksa apakah mereka adalah sama. Hal lain yang perlu kita tahu adalah jika nomor hanya berisi angka 0, 1, 8, 6dan 9. Jadi itulah yang akan kita lakukan:

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

Bagian ini „vd•benar-benar mengubah string vddari basis 190 ke basis 10 . Anda dapat mencobanya di sini .

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

Menggunakan pengodean CP-1252 . Cobalah online!


10

Python 2, 50 byte

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

Metode ini '01xxxx9x86'.findmengambil karakter digit ke angka terbalik itu, dengan pemberian digit yang tidak dapat dibatalkan -1. Fungsi ini dipetakan ke string angka terbalik, menghasilkan daftar digit.

Ini dikonversikan ke string dengan [1::3]triknya , kecuali sebaliknya, sebaliknya dengan melakukan [-2::-3](terima kasih kepada Dennis untuk ini, menghemat 4 byte), dan dibandingkan dengan string angka asli. Siapa pun -1dari angka yang tidak dapat dibalik akan menyelaraskan konversi, membuatnya gagal.


56 byte:

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

Memeriksa apakah string nomor terbalik sama dengan penggantian terbalik. Digit yang tidak bisa dibalik diganti dengan 'x'untuk selalu memberikan jawaban yang salah.

Penggantian dilakukan dengan translatestring 256 karakter, menggantikan nilai ASCII yang sesuai. Hanya 10 nilai 48untuk57 peduli, tapi aku melangkah untuk panjang 16 untuk membuat total panjang menjadi 256. Saya heran jika ada cara yang lebih pendek.

Beberapa pendekatan lain (panjang 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]))


6

Ruby, 54 46 byte

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

Saya tidak tahu, apakah fungsi anonim seperti itu diizinkan atau tidak

Ide dasarnya sama dengan jawaban Python2. Jika input bukan bilangan bulat, bertingkahlah buruk (mis. abaMemberi true)


1
Selamat Datang di Programming Puzzles dan Code Golf! Bagus pertama jawaban: fungsi D Anonymous yang diperbolehkan dalam konteks di mana fungsi bernama normal diperbolehkan.
kucing


4

JavaScript (ES6), 56 byte

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

Apa yang dilakukan ... dalam array?
ericw31415

@ ericw31415 Dalam hal ini mengubah string menjadi array karakter. Secara umum, Anda bisa memberikan apa saja yang dapat diubah dan akan mengulanginya serta menyertakan elemen dalam array.
Neil

Jadi [... '' + n] pada dasarnya sama dengan n.split ("")? Di mana saya bisa membaca lebih lanjut tentang ini?
ericw31415

@ ericw31415 Ya, dalam hal ini saya menggunakannya sebagai singkatan split``. Lihat array literal yang lebih kuat
Neil

2

Perl, 29 26 byte

Termasuk +1 untuk -p

Jalankan dengan input pada STDIN:

rotation.pl <<< 69

rotation.pl:

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

2

Jelly, 16 15 byte

,ȷ9+90860¤Dị/⁼Ṛ

Cobalah online!

Bagaimana itu bekerja

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

Jawaban ini diikat dengan yang lain pada 15 byte, tetapi jawaban lainnya diposting pertama kali. Bisakah Anda mencukur 1 byte?
mbomb007

Saya sudah berusaha cukup keras; Saya pikir saya tidak bisa. Namun, tie breaker default kami adalah jawaban pertama untuk mencapai skor kemenangan , dan saya pikir saya harus 15 terlebih dahulu.
Dennis

2

Retina, 57 49 byte

8 byte disimpan berkat @Martin Büttner .

+`^(([018])(.*)\2|9(.*)6|6(.*)9)$
$3$4$5
^[018]?$
  • Terapkan reduksi seperti itu: 1610880191-> 61088019->108801 -> 0880-> 88-> (kosong).
  • Kembali 1jika saja0 ,1 ,8 , atau (kosong) yang tersisa.
  • Kembali 0 sebaliknya.

Cobalah online!


2

sh, 40 33 byte

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

Input melalui argumen baris perintah, output melalui kode keluar. Hasilkan semua testcases:

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

2

TSQL, 122 byte

Saya baru mengenal kode golf, jadi tidak yakin bagaimana cara menghitung karakter. Menghitung sebagai 1 di sini karena jumlah yang digunakan dalam kasus ini adalah 8

Ini akan mengembalikan 1 ketika nilai yang dibalik cocok dan tidak ada yang tidak cocok:

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

Dapat dibaca manusia:

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

Retina , 40 38 33 byte

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

Cobalah online!

Penjelasan

Ini menggunakan pendekatan yang sama sekali berbeda dari jawaban Retina lainnya. Alih-alih menghapus semua bagian simetris, kita hanya melakukan transformasi membalikkan string dan swapping 6dan 9s dan kemudian membandingkan untuk kesetaraan. Untuk memastikan bahwa tidak ada angka non-simetris yang muncul, kami juga mengubahnya menjadi 9dalam setengah.

$
;$_

Kami menduplikasi input dengan mencocokkan ujung string dan memasukkan ;diikuti oleh seluruh input.

T`92-7`69`;.+

Ini melakukan transliterasi karakter hanya pada babak kedua dengan mencocokkannya ;.+. Dua set transliterasi meluas ke:

9234567
6999999

Karena 2-7menunjukkan rentang dan set target diisi dengan karakter terakhir yang cocok dengan panjang set sumber. Karenanya, panggung bertukar 6dan 9dan juga mengubah semuanya 23457menjadi 9s.

+`(.);\1
;

Berulang-ulang ( +) menghapus sepasang karakter identik di sekitar ;. Ini akan berlanjut sampai hanya yang ;tersisa atau sampai dua karakter di sekitar ;tidak lagi identik, yang berarti bahwa string bukan kebalikan satu sama lain.

^;

Periksa apakah karakter pertama adalah ;dan cetak 0atau 1sesuai.


Lever, sangat lever.
CalculatorFeline


1

Pyth, 17 byte

!-FmC_B`d,QC\􄽥

Uji di Kompiler Pyth .

Bagaimana itu bekerja

!-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 for Applications, 150 111 byte

Dapat digunakan di konsol atau sebagai UDF.

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

Ditingkatkan dengan memanfaatkan konversi tipe implisit dan dengan melakukan tiga langkah bertukar alih-alih dua langkah di setiap sisi persamaan. Hitungan termasuk Functiondan End Functionpernyataan.


1

GNU sed, 84 byte

(termasuk +1 untuk -rbendera)

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

Jika garis berakhir dengan rotasi karakter awal, pangkas kedua ujungnya dengan satu. Ulangi sampai tidak ada kecocokan. Akun untuk karakter simetris tunggal, maka jika ada yang tersisa, inputnya tidak simetris, dan kami mengembalikan false; jika tidak, kembalikan benar.


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

Diperluas

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

Penjelasan

Kami membalikkan angka xmenggunakan modulo-10 aritmatika, mengganti 6 dan 9 dengan refleksi mereka saat kami melangkah. Kami mengganti angka rotasi-asimetris dengan nol (perhatikan bahwa kami dapat menangani balita simetris dan / atau dua-dua dengan hanya mengubah tabel penggantians ). Jika nomor baru sama dengan yang asli (disimpan dalam 'z'), maka itu simetris secara rotasi.

Program uji

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

Ini mencetak daftar nomor simetris yang diberikan dalam pertanyaan.


0

MATL, 25 21 22 byte

j69801VmAGtP69VtPXE=vA

Cobalah secara Online!

Penjelasan

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

Serius, 23 byte

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

Cobalah online!

Ini pada dasarnya adalah pelabuhan solusi Python 2 xnor .

Penjelasan:

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

Ini mengambil nomor, mengubahnya menjadi string, memutarnya, dan kemudian membandingkannya dengan yang asli sebagai string untuk kesetaraan. Digit yang tidak dapat diputar hanya dikonversi ke0

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

Uji di Sini!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.