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.



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!


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


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)


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

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

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.

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!


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

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

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.


Dźwignia, bardzo dźwignia.
CalculatorFeline


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.

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.


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.


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.


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

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

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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.