Liczby z symetrią rotacyjną

27

Biorąc pod uwagę liczbę całkowitą, wypisz prawdziwą wartość, jeśli w przeciwnym razie jest ona taka sama do góry nogami (obrócona o 180 °) lub wartość fałszowania .

0, 1i 8mają symetrię obrotową. 6staje się 9i vice versa.

Sekwencja liczb dająca prawdziwe wyniki: 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, ...

To pytanie jest inspirowane przez moją własną reputację w czasie delegowania: 6009.

mbomb007
źródło
Wygląda to na duplikat liczb zabezpieczonych przed rotacją wydruku .
xnor
2
@xnor Wcale nie są takie same. Pytanie to dotyczy tego, czy liczba zmieni się w kolejną prawidłową liczbę po rotacji (i dopisuje kropkę, aby odróżnić ją), a nie czy jest to ta sama liczba. Sprawdziłem to pytanie, zanim opublikowałem moje.
mbomb007
@ mbomb007 Mój błąd. Otworzyłem ponownie.
xnor
Czy możemy wziąć dane wejściowe jako ciąg?
xnor
@ xnor Jeśli język ma typy numeryczne, powinien ich użyć, na przykład dla parametrów funkcji. Ale jeśli, na przykład, w Pythonie raw_input, użytkownik wprowadzi liczbę całkowitą, która stanie się ciągiem za kulisami. W porządku.
mbomb007

Odpowiedzi:

6

05AB1E , 22 16 15 14 bajtów

Kod:

Â23457ð«-69‡Q

Wypróbuj online!


Poprzedni kod:

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

Aby dowiedzieć się, czy łańcuch jest obrotowo-symetryczny, wystarczy transliterować za 69pomocą 96, odwrócić łańcuch i sprawdzić, czy są one równe. Drugą rzeczą, którą musisz wiedzieć, jeśli liczba tylko zawiera cyfry 0, 1, 8, 6i 9. Właśnie to zamierzamy zrobić:

                     # 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•Część rzeczywiście przekształca ciąg vdod podstawy 190 do podstawy 10 . Możesz to wypróbować tutaj .

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
10

Python 2, 50 bajtów

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

Metoda '01xxxx9x86'.findprzenosi znak cyfry do jego odwróconej liczby, podając dowolną nieprzekraczalną cyfrę -1. Ta funkcja jest odwzorowana na ciąg odwróconego numeru, tworząc listę cyfr.

Jest to konwertowane na ciąg za pomocą [1::3]lewy , z tym że jest odwracane przez wykonanie [-2::-3](dzięki Dennisowi za to, oszczędzając 4 bajty) i porównywane z pierwotnym ciągiem liczbowym. Wszelkie -1znaki z nieprzekraczalnych cyfr źle wyrównają konwersję, co spowoduje jej niepowodzenie.


56 bajtów:

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

Sprawdza, czy odwrócony ciąg liczb jest taki sam jak w przypadku zamienników odwróconych. Cyfry, których nie można odwrócić, są zastępowane przez, 'x'aby zawsze podawać złą odpowiedź.

Zastąpienie odbywa się translateza pomocą ciągu 256 znaków, zastępując odpowiednie wartości ASCII. Tylko wartości 10 48do 57znaczenia, ale napawa do długości 16, aby łączna długość być 256. Zastanawiam się, czy istnieje krótsza droga.

Niektóre inne podejścia (długości 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]))
xnor
źródło
Może to pomoże: codegolf.stackexchange.com/a/48994/34718
mbomb007 15.04.16
6

Rubin, 54 46 bajtów

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

Nie wiem, czy anonimowe funkcje są dozwolone, czy nie

Zasadniczo taki sam pomysł jak odpowiedź na Python2. Jeśli wejście nie jest liczbą całkowitą, działaj źle (tzn. abaDaje true)

m0003r
źródło
1
Witamy w Programowaniu zagadek i Code Golf! Dobra pierwsza odpowiedź: D Funkcje anonimowe dozwolone w każdym kontekście, w którym dozwolone są funkcje o normalnych nazwach.
kot
4

JavaScript (ES6), 56 bajtów

n=>n==[...''+n].reverse().map(c=>'0100009086'[c]).join``
Neil
źródło
Co robi ... w tablicy?
ericw31415 21.04.16
@ ericw31415 W tym przypadku zamienia ciąg w tablicę znaków. Mówiąc bardziej ogólnie, możesz podać wszystko, co może być iterowalne, a iteruje je i uwzględni elementy w tablicy.
Neil
Więc [... '' + n] to w zasadzie to samo co n.split („”)? Gdzie mogę o tym przeczytać więcej?
ericw31415
@ ericw31415 Tak, w tym przypadku używam go jako skrótu split``. Zobacz mocniejszy dosłowny układ
Neil
2

Perl, 29 26 bajtów

Obejmuje +1 dla -p

Uruchom z wejściem na STDIN:

rotation.pl <<< 69

rotation.pl:

#!/usr/bin/perl -p
$_=reverse==y/962-7/69a/r
Ton Hospel
źródło
2

Galaretka, 16 15 bajtów

,ȷ9+90860¤Dị/⁼Ṛ

Wypróbuj online!

Jak to działa

,ȷ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.
Dennis
źródło
Ta odpowiedź jest powiązana z inną przy 15 bajtach, ale druga odpowiedź została opublikowana jako pierwsza. Czy możesz ogolić 1 bajt?
mbomb007 18.04.16
Bardzo się starałem; Nie sądzę, żebym mógł. Jednak nasz domyślny remis jest pierwszą odpowiedzią na osiągnięcie zwycięskiego wyniku i myślę, że najpierw dostałem 15.
Dennis
2

Retina, 57 49 bajtów

8 bajtów zapisanych dzięki @Martin Büttner .

+`^(([018])(.*)\2|9(.*)6|6(.*)9)$
$3$4$5
^[018]?$
  • Zastosuj redukcję jako taką: 1610880191-> 61088019-> 108801-> 0880-> 88-> (pusty).
  • Zwraca 1jeśli tylko 0, 1, 8, lub (pusty) zostaje.
  • Zwraca 0inaczej.

Wypróbuj online!

Leaky Nun
źródło
2

sh, 40 33 bajtów

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

Wejście za pomocą argumentu wiersza poleceń, wyjście za pomocą kodu wyjścia. Wygeneruj wszystkie przypadki testowe:

for i in `seq 0 10000`
do
  if [ `rev<<<$i|tr 6923457 96` = $i ]
  then
    echo $i
  fi
done
Rainer P.
źródło
2

TSQL, 122 bajty

Jestem nowym golfistą, więc nie jestem pewien, jak liczyć postacie. Licząc tutaj jako 1, ponieważ liczba użyta w tym przypadku to 8

Zwróci 1, gdy odwrócona wartość się zgadza, i nic, gdy się nie zgadza:

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

Czytelny dla człowieka:

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))
t-clausen.dk
źródło
2

Siatkówka , 40 38 33 bajtów

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

Wypróbuj online!

Wyjaśnienie

Wykorzystuje to zupełnie inne podejście niż w przypadku drugiej odpowiedzi Retina. Zamiast usuwając wszystkie części symetrycznych, po prostu wykonać transformację odwrócenie ciąg i zamiana 6i 9s, a następnie porównać dla równości. Aby mieć pewność, że nie pojawią się żadne niesymetryczne cyfry, zamieniamy je również na 9s na pół.

$
;$_

Duplikujemy dane wejściowe, dopasowując koniec łańcucha i wstawiając, ;a następnie całe dane wejściowe.

T`92-7`69`;.+

Wykonuje transliterację znaków tylko w drugiej połowie, dopasowując ją do ;.+. Dwa zestawy transliteracji rozwijają się do:

9234567
6999999

Ponieważ 2-7oznacza zakres, a zestaw docelowy jest dopełniany ostatnim znakiem, który odpowiada długości zestawu źródłowego. Stąd, swapy scenicznych 6oraz 9i włącza również wszystkich 23457do 9s.

+`(.);\1
;

Wielokrotnie ( +) usuń parę identycznych znaków wokół ;. To będzie trwać, dopóki nie pozostaną tylko ;znaki, lub dopóki dwa znaki wokół ;nie będą już identyczne, co oznacza, że ​​ciągi znaków nie są odwrotnością.

^;

Sprawdź, czy pierwszym znakiem jest ;i wydrukuj 0lub 1odpowiednio.

Martin Ender
źródło
Dźwignia, bardzo dźwignia.
CalculatorFeline
1

Pyth - 21 bajtów

&!-z+`180K`69qzX_z_KK

Pakiet testowy .

Maltysen
źródło
X_zKwykonuje tę samą pracę, co X_z_KK. Trzeci parametr jest opcjonalny.
Jakube
1

Pyth, 17 bajtów

!-FmC_B`d,QC\􄽥

Przetestuj w kompilatorze Pyth .

Jak to działa

!-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.
Dennis
źródło
1

Visual Basic for Applications, 150 111 bajtów

Można używać w konsoli lub jako UDF.

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

Ulepszono, wykorzystując konwersje typu niejawnego i wykonując trzy kroki zamiany zamiast dwóch kroków po każdej stronie równania. Policz obejmuje Functioni End Functionoświadczenia.

dnep
źródło
1

GNU sed, 84 bajtów

(w tym +1 za -rflagę)

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

Jeśli linia kończy się obrotem początkowego znaku, przytnij oba końce o jeden. Powtarzaj, aż nie będzie dopasowania. Uwzględnij pojedynczy znak symetryczny, a jeśli coś pozostanie, dane wejściowe nie będą symetryczne, a my zwrócimy wartość false; w przeciwnym razie zwróci wartość true.

Toby Speight
źródło
1

C, 82 bajty

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

Rozszerzony

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

Wyjaśnienie

Odwracamy cyfry xużywania arytmetyki modulo-10, zastępując w miarę upływu 6 i 9 ich odbiciami. Zastępujemy rotacyjnie asymetryczne cyfry zerami (pamiętaj, że możemy obsłużyć symetryczne piątki i / lub dwójki, po prostu zmieniając tabelę zastępczą s). Jeśli nowy numer jest równy oryginałowi (zapisany w „z”), to jest obrotowo symetryczny.

Program testowy

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

Spowoduje to wydrukowanie listy liczb symetrycznych podanych w pytaniu.

Toby Speight
źródło
0

MATL, 25 21 22 bajtów

j69801VmAGtP69VtPXE=vA

Wypróbuj online!

Wyjaśnienie

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
Suever
źródło
0

Poważnie, 23 bajty

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

Wypróbuj online!

Jest to zasadniczo port rozwiązania xnor w języku Python 2 .

Wyjaśnienie:

,$;`"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
Mego
źródło
0

Kotlin, 69 bajtów

Pobiera liczbę, konwertuje ją na ciąg, obraca, a następnie porównuje z oryginałem jako ciąg dla równości. Nieobrotowe cyfry są po prostu konwertowane na0

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

Sprawdź to tutaj!

Numer jeden
źródło