Dönme Simetrisine Sahip Sayılar


27

Bir tamsayıdır göz önüne alındığında, çıkış truthy aynı ters ise değer ya da bir (180 ° döndürülmüş) falsy aksi değeri.

0, 1ve 8dönme simetrisine sahiptir. 6olur 9ve tam tersi.

Gerçek sonuç üreten sayıların sırası: 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, ...

Bu soru nakil sırasında kendi itibar esinlenmiştir: 6009.



2
@xnor Onlar hiç aynı değil. Bu soru, sayının aynı sayı olup olmadığını değil, dönüşte geçerli bir sayı olup olmayacağını (ve farklı olmasını sağlamak için bir süre ekleyin) olup olmadığını içerir. Madeni göndermeden önce bu soruya baktım.
mbomb007

@ mbomb007 Benim hatam. Yeniden açtım.
xnor

Girdiyi dizge olarak alabilir miyiz?
xnor

@xnor Dilin sayısal türleri varsa, örneğin işlev parametreleri için bunları kullanması gerekir. Ancak, örneğin Python'da alırsanız raw_input, kullanıcı bir tamsayıya girdi; Bu iyi.
mbomb007

Yanıtlar:


6

05AB1E , 22 16 15 14 bayt

Kod:

Â23457ð«-69‡Q

Çevrimiçi deneyin!


Önceki kod:

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

Dize dönme simetrik olup olmadığını anlamak için, sadece transliterasyon gerek 69ile 96dize ters ve eşit olup olmadığını kontrol. Numara eğer bilmesi gereken diğer şey sadece rakam içeren 0, 1, 8, 6ve 9. Demek tam olarak ne yapacağız:

                     # 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•Bölüm aslında dize dönüştürür vdgelen tabana 190 kadar baz 10 . Bunu burada deneyebilirsiniz .

            Ã        # 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 kodlamasını kullanır . Çevrimiçi deneyin!


9

Python 2,50 bayt

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

Metot '01xxxx9x86'.find, sayılamayan herhangi bir rakam vermesi ile baş aşağı bir rakam alır -1. Bu işlev, basamaklı bir liste oluşturarak ters sayı dizgisine eşlenir.

Bu, [1::3]hile ile bir dizgeye dönüştürülür , ancak bunun yerine tersine çevrilir (bunun [-2::-3]için Dennis'e teşekkürler, 4 byte tasarruf eder) ve orijinal sayı dizgisine kıyasla. Herhangi bir -1unflippable basamağı gelen sitesindeki başarısız hale dönüştürme yanlış hizalanır.


56 bayt:

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

Tersine çevrilen sayı dizesinin ters değiştirmelerle aynı olup olmadığını kontrol eder. 'x'Yanlış çevrilemeyen rakamlar , daima yanlış cevap vermek için ile değiştirilir .

translateDeğiştirme, karşılık gelen ASCII değerlerinin yerine, 256 karakterlik bir diziyle yapılır . Sadece 10 değerlerinin 48için 57önemli ama kısa yol varsa toplam uzunluğu 256 Ben merak olmak yapmak uzunluğu 16 yastıklı.

Diğer bazı yaklaşımlar (uzunluk 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]))

Belki bu yardımcı olacaktır: codegolf.stackexchange.com/a/48994/34718
mbomb007

6

Ruby, 54 46 bayt

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

Bilmiyorum, bunun gibi isimsiz bir işlevdir, izin verilir veya verilmez

Temelde Python2 cevap olarak aynı fikir. Girdi tamsayı değilse, kötü davranın (yani abaverir true)


1
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz! Güzel ilk cevap: D Anonim işlevler vardır , normal adlandırılmış fonksiyonlar izin verilen herhangi bir bağlamda izin verdi.
kedi,


4

JavaScript (ES6), 56 bayt

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

Dizideki ... ne yapar?
ericw31415 20

@ ericw31415 Bu durumda dizgiyi bir karakter dizisine dönüştürür. Daha genel olarak, yinelenebilir bir şey sağlayabilir ve onu yineleyecek ve dizideki öğeleri dahil edecektir.
Neil

Yani [... '' + n] aslında n.split ("") ile aynı şey midir? Bununla ilgili daha fazla bilgiyi nerede bulabilirim?
ericw31415

@ ericw31415 Evet, bu durumda onu bir steno olarak kullanıyorum split``. Bkz Daha güçlü bir dizi değişmezi
Neil

2

Perl, 29 26 bayt

İçin +1 içerir -p

STDIN'deki giriş ile çalıştırın:

rotation.pl <<< 69

rotation.pl:

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

2

Jöle, 16 15 bayt

,ȷ9+90860¤Dị/⁼Ṛ

Çevrimiçi deneyin!

Nasıl çalışır

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

Bu cevap 15 baytta bir başkasıyla ilişkilendirildi, ancak diğer cevap önce gönderildi. 1 bayt'ı tıraş eder misiniz?
mbomb007

Çok çalıştım; Yapabileceğimi sanmıyorum. Ancak, bizim varsayılan kravat kırıcımız , kazanan skoru elde etmek için ilk cevaptı ve sanırım ilk 15'e ulaştığımı düşünüyorum.
Dennis,

2

Retina, 57 49 bayt

@Martin Büttner sayesinde 8 bayt kurtarıldı .

+`^(([018])(.*)\2|9(.*)6|6(.*)9)$
$3$4$5
^[018]?$
  • Küçültmeyi şu şekilde yapın: 1610880191-> 61088019-> 108801-> 0880-> 88-> (boş).
  • İade 1durumunda 0, 1, 8, ya da (boş) bırakılır.
  • İade 0aksi.

Çevrimiçi deneyin!


2

sh, 40 33 bayt

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

Komut satırı argümanı ile giriş, çıkış kodu ile çıkış. Tüm test senaryolarını oluşturun:

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

2

TSQL, 122 bayt

Ben golf kodunu yeniyim, bu yüzden karakterlerin nasıl sayılacağından emin değilim. Bu durumda kullanılan sayı 8 olduğu için burada 1 olarak sayın.

Bu, ters değer eşleştiğinde 1, eşleşmediğinde hiçbir şey döndürmez:

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

İnsan okunabilir:

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 bayt

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

Çevrimiçi deneyin!

açıklama

Bu, diğer Retina cevabından tamamen farklı bir yaklaşım kullanır. Bunun yerine tüm simetrik parçaları kaldırma, biz sadece dize ters ve takas dönüşümünü gerçekleştirmek 6ve 9ler ve sonra eşitlik karşılaştırın. Simetrik olmayan rakamların görünmediğinden emin olmak için, onları 9yarıya dönüştürüyoruz.

$
;$_

Dizenin sonunu eşleştirerek ve ;ardından girişin tamamını girerek girişi kopyalarız .

T`92-7`69`;.+

Bu, ancak ikinci yarısında eşleştirerek bir karakter çevirisi gerçekleştirir ;.+. İki harf çevirisi kümesi aşağıdakilere genişler:

9234567
6999999

Çünkü 2-7bir aralığı belirtir ve hedef set kaynak setinin uzunluğuyla eşleşecek şekilde son karakterle doldurulur. Bu nedenle, sahne değiş tokuş eder 6ve 9aynı zamanda hepsini s'ye 23457dönüştürür 9.

+`(.);\1
;

Tekrarlayan ( +) etrafında bir çift aynı karakterleri kaldırır ;. Bu, sadece kalana kadar ;veya etrafındaki iki karakter ;artık aynı olmadıkça devam eder, bu, dizelerin birbirinin tersi olmadığı anlamına gelir.

^;

İlk karakterin olup olmadığını kontrol edin ;ve yazdırın 0veya 1buna göre.


Kolu, çok kolu.
Hesap MakinesiFeline


1

Pyth, 17 bayt

!-FmC_B`d,QC\􄽥

Pyth Compiler'da test edin .

Nasıl çalışır

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

Uygulamalar için Visual Basic, 150 111 bayt

Konsolda veya UDF olarak kullanılabilir.

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

Kapalı tip dönüşümlerden yararlanarak ve denklemin her iki tarafında iki adım yerine üç adımda değiştirerek geliştirildi. Sayım içerir Functionve End Functionifadeler.


1

GNU sed, 84 bayt

( -rbayrak için +1 dahil )

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

Çizgi, başlangıç ​​karakterinin dönüşüyle ​​bitiyorsa, her iki ucu da birer birer kırpın. Eşleşme yok kadar tekrarlayın. Tek bir simetrik karakter hesaba katarsa, eğer bir şey kalırsa, giriş simetrik değildi ve yanlış döndürür; aksi takdirde doğru dön.


1

C, 82 bayt

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

Expanded

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

açıklama

xModulo-10 aritmetiği kullanmanın rakamlarını tersine çeviririz, 6 ve 9'un yerine geçen düşünceleri değiştiririz. Dönel asimetrik rakamları sıfırlarla değiştiririz (sadece yedek tabloyu değiştirerek simetrik beşleri ve / veya iki düğmeyi kaldırabileceğimize dikkat edin s). Eğer yeni sayı aslına eşitse ('z' de kaydedilir), o zaman rotasyonel olarak simetriktir.

Test programı

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

Bu, soruda verilen simetrik sayıların listesini yazdırır.


0

MATL, 25 21 22 bayt

j69801VmAGtP69VtPXE=vA

Çevrimiçi Deneyin!

açıklama

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

Cidden, 23 bayt

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

Çevrimiçi deneyin!

Bu aslında xnor'ın Python 2 çözümünün bir limanıdır .

Açıklama:

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

Bu sayıyı alır, dizgeye dönüştürür, döndürür ve sonra eşitlik için dize olarak orijinalle karşılaştırır. Dönmeyen rakamlar basitçe dönüştürülür0

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

Burada test edin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.