Числа з обертальною симетрією


27

Враховуючи ціле число, виведіть значення " truthy", якщо воно таке ж догори дном (повернутий на 180 °) або хибним значенням в іншому випадку.

0, 1і 8мають обертальну симетрію. 6стає 9і навпаки.

Послідовність чисел, що дають тримати результати: 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, ...

Це питання натхненний моєї власної репутації на момент розміщення: 6009.


Це схоже на манеру номерів, захищених від обертання друку .
xnor

2
@xnor Вони зовсім не однакові. Це питання передбачає, чи отримає це число ще одне дійсне число при обертанні (і додайте проміжок часу, щоб воно не було відмінним), а не те, чи це одне й те саме число. Я розглядав це питання, перш ніж розміщувати своє.
mbomb007

@ mbomb007 Моя помилка. Я знову відкрився.
xnor

Чи можемо ми сприймати дані як рядок?
xnor

@xnor Якщо мова має числові типи, вона повинна використовувати їх, наприклад, для параметрів функції. Але якщо, наприклад, у Python, ви берете raw_input, користувач вводить ціле число, яке стане рядком за кадром. Це добре.
mbomb007

Відповіді:


6

05AB1E , 22 16 15 14 байт

Код:

Â23457ð«-69‡Q

Спробуйте в Інтернеті!


Попередній код:

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

Для того, щоб з'ясувати , є чи рядок обертальної симетрії, ми просто повинні транслітерації 69з 96, зворотної рядком і перевірити , якщо вони рівні. Інша річ , яку ми повинні знати, якщо номер тільки містить цифри 0, 1, 8, 6і 9. Отже, саме це ми і будемо робити:

                     # 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•Частина фактично перетворює рядок vdз бази 190 до основи 10 . Ви можете спробувати це тут .

            Ã        # 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 . Спробуйте в Інтернеті!


10

Python 2, 50 байт

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

Метод '01xxxx9x86'.findпереносить символи цифри до його перевернутого числа, з будь-яким нерозбірним числом -1. Ця функція відображається у зворотному рядку числа, створюючи список цифр.

Це перетворюється в рядок за допомогою [1::3]трюку , за винятком того, що це замінено, виконуючи [-2::-3](завдяки цьому Денніс, заощаджуючи 4 байти), і порівнюється з початковим рядком числа. Будь -1-які цифри, що не можна скористатися, неправильно вирівняють конверсію, роблячи її невдалою.


56 байт:

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

Перевіряє, чи перетворений рядок рядків такий самий, як і для замінених перевернутим ногами. Цифри, які неможливо перевернути, замінюються на те, 'x'щоб завжди давати неправильну відповідь.

Заміна виконується translateна рядку 256 символів, замінюючи відповідні значення ASCII. Тільки 10 значень 48до 57матерії, але я прокладений до довжини 16 , щоб загальна довжина буде 256. Я цікаво , якщо є більш короткий шлях.

Деякі інші підходи (довжини 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]))

Можливо, це допоможе: codegolf.stackexchange.com/a/48994/34718
mbomb007

6

Рубі, 54 46 байт

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

Я не знаю, дозволені чи ні анонімні функції, як це

В основному така ж ідея, як відповідь Python2. Якщо введення не ціле, дійте неправильно (тобто abaдає true)


1
Ласкаво просимо до головоломки програмування та коду для гольфу! Хороший перший відповідь: функції D Приховані будуть дозволені в будь-якому контексті , де нормальні названі функції допускаються.
кіт


4

JavaScript (ES6), 56 байт

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

Що робить ... у масиві?
ericw31415

@ ericw31415 У цьому випадку це перетворює рядок у масив символів. Більш загально, ви можете надати що-небудь ітерабельне, і це повторить і включить елементи в масив.
Ніл

Отже, [... '' + n] - це по суті те саме, що і n.split ("")? Де я можу прочитати більше про це?
ericw31415

@ ericw31415 Так, у цьому випадку я використовую це як скорочення split``. Дивіться більш потужний буквальний масив
Ніл

2

Perl, 29 26 байт

Включає +1 для -p

Запустити з введенням STDIN:

rotation.pl <<< 69

rotation.pl:

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

2

Желе, 16 15 байт

,ȷ9+90860¤Dị/⁼Ṛ

Спробуйте в Інтернеті!

Як це працює

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

Ця відповідь пов'язана з іншою в 15 байт, але інша відповідь була розміщена першою. Ви можете поголити 1 байт?
mbomb007

Я досить старався; Я не думаю, що можу. Тим не менш, наш розрив за замовчуванням - це перша відповідь, щоб досягти виграшного результату , і я думаю, що я першим дістався до 15.
Денніс

2

Сітківка, 57 49 байт

8 байт збережено завдяки @Martin Büttner .

+`^(([018])(.*)\2|9(.*)6|6(.*)9)$
$3$4$5
^[018]?$
  • Застосовуйте скорочення як таке: 1610880191-> 61088019-> 108801-> 0880-> 88-> (порожнє).
  • Повертає , 1якщо тільки 0, 1, 8або (порожній) залишилися.
  • Повертається 0інакше.

Спробуйте в Інтернеті!


2

ш, 40 33 байт

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

Введення через аргумент командного рядка, вихід через код виходу. Створіть усі тести:

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

2

TSQL, 122 байти

Я новачок в коді гольфу, тому не зовсім впевнений, як рахувати символів. Порахувавши це як 1 тут, оскільки число, що використовується в даному випадку, дорівнює 8

Це поверне 1, коли зворотна вартість збігається, і нічого, коли воно не збігається:

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

Людина, читана:

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

Сітківка , 40 38 33 байт

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

Спробуйте в Інтернеті!

Пояснення

Для цього використовується зовсім інший підхід, ніж інші відповіді Ретіна. Замість того, щоб видаляти всі симетричні частини, ми просто виконуємо перетворення зворотного рядка та заміни 6і 9s, а потім порівнюємо для рівності. Щоб переконатися у відсутності несиметричних цифр, ми також перетворимо їх на 9s в половину.

$
;$_

Дублюємо введення, зіставляючи кінець рядка та вставляючи ; а потім весь вхід.

T`92-7`69`;.+

Це виконує транслітерацію символів лише у другій половині, порівнюючи його з ;.+. Два набори транслітерації розширюються на:

9234567
6999999

Тому що 2-7позначає діапазон, а набір цілей переповнений останнім символом, щоб відповідати довжині набору джерел. Таким чином, етап свопи 6і , 9а також перетворює все 23457в 9с.

+`(.);\1
;

Неодноразово ( +) видаляйте пару однакових символів навколо ;. Це буде продовжуватися до тих пір, поки тільки ;ліворуч не залишиться або до тих пір, поки два символи навколо ;не стануть однаковими, це означатиме, що рядки не є зворотними один до одного.

^;

Перевірте, чи є перший символ ;і надрукуйте його 0чи 1відповідно.


Важіль, дуже важіль.
CalculatorFeline


1

Піт, 17 байт

!-FmC_B`d,QC\􄽥

Перевірте його в компіляторі Pyth .

Як це працює

!-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 для додатків, 150 111 байт

Використовується в консолі або як UDF.

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

Удосконалено, скориставшись неявними типами перетворень та виконавши три етапи заміни, а не два кроки з кожної сторони рівняння. Підрахунок включає Functionі End Functionзаяви.


1

GNU sed, 84 байт

(включаючи +1 для -rпрапора)

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

Якщо лінія закінчується обертанням її початкового символу, обріжте обидва кінці по одному. Повторюйте, поки не буде збігу. Враховуйте один симетричний символ, тоді, якщо щось залишиться, введення не було симетричним, і ми повертаємо помилкові; інакше повернути правду.


1

C, 82 байти

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

Розширено

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

Пояснення

Ми обертаємо цифри, xвикористовуючи арифметику модуля-10, замінюючи 6 і 9 їх відображеннями в міру того, як ми йдемо. Ротаційно-асиметричні цифри ми замінюємо нулями (зауважимо, що ми можемо обробляти симетричні п'ятики та / або двійки, просто змінюючи таблицю заміни s). Якщо нове число дорівнює оригіналу (збережено у 'z'), то воно обертально симетричне.

Тестова програма

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

Це друкує список симетричних чисел, наведених у питанні.


0

MATL, 25 21 22 байт

j69801VmAGtP69VtPXE=vA

Спробуйте в Інтернеті!

Пояснення

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

Котлін, 69 байт

Це приймає число, перетворює його в рядок, обертає його, а потім порівнює його з оригіналом як рядок для рівності. Не обертові цифри просто перетворюються в0

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

Перевірте тут!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.