Паліндромні числа з двійковим поворотом


29

Попередження: це НЕ "ей, давайте намалюємо торт в ASCII-арт" виклик! Будь ласка, читайте;)

Деякий час тому це був мій день народження, мені зараз 33 роки.

Отож, існує ця незручна соціальна традиція, яка полягає у запрошенні родини та друзів, ставити на торт свічки, схожі на номер, співати пісні та відкривати подарунки.

   33   
--------

Замість цифр я можу використовувати двійкову систему, щоб поставити стандартні свічки: я кладу їх 6 на торт і запалюю дві.

 100001
--------

Я бачу, що і десяткові, і двійкові числа мого віку є паліндромними!

Виклик

Хочу знати, чи можна будь-яке інше число поставити на торт зі свічками і бути паліндромним, десятковим та двійковим.

Напишіть програму / функцію, щоб перевірити, чи є число паліндромним як у десяткових, так і у двійкових. Але зачекайте, є ще: у двійкових, провідні нулі рахуються для тесту!

Вхідні дані

Десяткове число х , що я хочу перевірити , якщо це день народження паліндроміческій з 0 <х <2 32 -1 (так, люди в моєму вимірі живуть дуже довго)

Вихід

Truthy, якщо він відповідає саме цим двом умовам, Falsey інше:

  • Десяткове представлення числа - це стандартний паліндром
  • Двійкове представлення числа є стандартним паліндром, і додавання провідних нулів може допомогти у цьому

Тестові справи

1 > 1 => Truthy
6 > 110 (0110) => Truthy
9 > 1001 => Truthy
10 > 1010 (01010) => Falsey, 10 is not palindromic
12 => 1100 (001100) => Falsey, 12 is not palindromic
13 => 1101 (...01101) => Falsey, neither 13 nor 1101 are palindromic
14 => 1110 (01110) => Falsey, 14 is not palindromic
33 > 100001 => Truthy
44 > 101100 (..0101100) => Falsey, 101100 is not palindromic
1342177280 > 1010000000000000000000000000000 (00000000000000000000000000001010000000000000000000000000000) => Falsey, 1342177280 is not palindromic (but the binary representation is)
297515792 > 10001101110111011101100010000 (000010001101110111011101100010000) => Truthy

Правила

Удачі та зрештою з днем ​​народження!



6
Можливо, хочете змінити назву, оскільки частина дня народження є непосильною.
NoOneIsHere

@NoOneIsHere виклик - це свічки на іменинному торті. Також є поворот на двійкове представлення, так що це не "загальні паліндромні числа". Якщо ваш коментар буде схвалено, я придумаю ще одну назву.
Гуфаліт

Отже, згідно з правилами, 0b01010000000000000000000000000000це не паліндромно, оскільки для цього потрібно було б додати більше нулів і, таким чином, перевищувати 2 ^ 32-1? У цьому випадку це допоможе додати щось на зразок 1342177280фальсийного тесту.
Крістіан Лупаску

1
@ w0lf Я не написав обмеження для додавання нулів, але я розумію, що проблема переповнення стека;) Крім того, 1342177280це не десятковий паліндромний, тому Falsey. Редагування
Goufalite

Відповіді:


17

05AB1E , 7 байт

b0Ü‚DíQ

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

b         # convert input to binary
 0Ü       # remove trailing zeroes
   ‚      # pair with input
    D     # duplicate
     í    # reverse each (in the copy)
      Q   # check for equality

Біфуркація не допомогла?
Чарівний восьминіг Урна

@MagicOctopusUrn: На жаль, ні, оскільки я хочу змінити кожне число у списку, а не сам список.
Емінья

11

Python 3 , 59 байт

lambda a:all(c==c[::-1]for c in[str(a),bin(a).strip('0b')])

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

-3 байти завдяки Род
-3 байти завдяки Коннору Джонстону



1
за допомогою смужки з рядками буде видалено окремі символи: [bin (a) [2:]. strip ('0') => bin (a) .strip ('0b')] ( tio.run/… "Python 3 - Спробуйте It Online ")
Коннер Джонстон

@ConnerJohnston o здорово, спасибі!
HyperNeutrino

8

JavaScript (ES6), 65 байт

Повертається 0або 1.

n=>(g=b=>[...s=n.toString(b)].reverse().join``==s)()&g(2,n/=n&-n)

Як?

Допоміжна функція g () приймає ціле число b як вхідне і перевіряє, чи n є паліндром в основі b . Якщо b не вказано, він просто перетворює n у рядок перед його тестуванням.

Ми позбавляємося нульових нулів у двійковому поданні n , виділяючи найменш значущий 1 з n&-nі ділимо n на отриману кількість.

Веселий факт: це правда, 0тому що (0/0).toString(2)дорівнює "NaN", що є паліндром. (Але 0це все одно не є дійсним.)

Тестові справи


5

Математика, 52 49 байт

i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&

Спробуйте це на Wolfram Sandbox

Використання

f = (i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&);

f[6]

True

f /@ {9, 14, 33, 44}

{True, False, True, False}

Пояснення

i=IntegerReverse;i@#==#&&!i[#,2,Range@#]~FreeQ~#&

i=IntegerReverse                                   (* Set i to the integer reversing function. *)
                 i@#==#                            (* Check whether the input reversed is equal to input. *)
                       &&                          (* Logical AND *)
                          i[#,2,Range@#]           (* Generate the binary-reversed versions of input, whose lengths *)
                                                   (* (in binary) are `{1..<input>}` *) 
                                                   (* trim or pad 0s to match length *)
                                        ~FreeQ~#   (* Check whether the result is free of the original input *)
                         !                         (* Logical NOT *)

Версія з вбудованим PalindromeQ

PalindromeQ@#&&!IntegerReverse[#,2,Range@#]~FreeQ~#&


3

Japt , 14 байт

s ꬩ¢w n2 ¤ê¬

Перевірте це в Інтернеті!

Пояснення

 s ê¬ © ¢   w n2 ¤  ê¬
Us êq &&Us2 w n2 s2 êq   Ungolfed
                         Implicit: U = input integer
Us êq                    Convert U to a string and check if it's a palindrome.
        Us2 w            Convert U to binary and reverse. 
              n2 s2      Convert to a number, then back to binary, to remove extra 0s.
                    êq   Check if this is a palindrome.
      &&                 Return whether both of these conditions were met.

Придумали пару подібних рішень на 13 байт: sêQ *(¢w)sêQіsêQ &¢w n sêQ
Shaggy

@Shaggy Спасибі, але, на жаль, обидва не вдається 297515792(зворотний бінарний перетворений на десятковий дуже великий для обробки JS) ...
ETHproductions


2

APL, 27 31 байт

∧/(⌽≡⊢)∘⍕¨{⍵,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢⍵}

Як це працює? Використання 6 в якості аргументу ...

      2⊥⍣¯1⊢6 ⍝ get the bit representation
1 1 0

      ⌽2⊥⍣¯1⊢6 ⍝ reverse it (if it's a palindrome, it doesn't matter)
0 1 1

      {⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ drop off the trailing (now leading 0's)
1 1

      6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ enclose and concatenate the bits to the original number
┌─┬───┐
│6│1 1│
└─┴───┘

      (⌽≡⊢)∘⍕ ⍝ is a composition of
      ⍕ ⍝ convert to string and 
      (⌽≡⊢) ⍝ palindrome test

      (⌽≡⊢)∘⍕¨6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6 ⍝ apply it to each of the original argument and the bit representation
  1 1

      ∧/(⌽≡⊢)∘⍕¨6,⊂{⍵/⍨∨\⍵}⌽2⊥⍣¯1⊢6  ⍝ ∧/ tests for all 1's (truth)
  1

Спробуйте це на TryAPL.org


Згідно з специфікаціями, 6 повинен бути хорошим вкладом, але наданий вираз повертає помилкове значення.
lstefano

Ах, щури! Ось що я отримую за те, що не читаю проблему в повному обсязі. Хороший улов. Дякую тобі! Я доповнив дещо довше, але, сподіваюся, більш правильне рішення.
Брайан Бекер

Ласкаво просимо до PPCG. Гарний перший пост! На жаль, ваше подання в його нинішньому вигляді не є ні програмою, ні функцією. Не хвилюйтесь, але ви можете перетворити його на функцію, але дозволяючи зовнішнім дужкам охоплювати весь код.
Адам

Збережіть три байти: {(⌽¨≡⊢)⍕¨⍵,⊂(⌽↓⍨~⊥~)2⊥⍣¯1⊢⍵}(хороша форма надати посилання для запуску всього тестового набору)
Адама



1

APL (Dyalog Classic) , 26 байт

{≡∘⌽⍨⍕⍵,⍵,⍨(<\⊂⊢)⌽2⊥⍣¯1⊢⍵}

Пояснення

                  2⊥⍣¯1⊢⍵  encode  as binary
                          reverse
           (<\⊂⊢)          partition from first 1
      ⍵,⍵,⍨                prepend and append 
                         turn into text string
≡∘⌽⍨                       match text with its reverse (fX is XfX, where f is a composed function that reverses its right argument and matches with left)

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


Ой, ви з гольфу BB!
Адам


1

Піт , 10 байт

Повертає [1], якщо є істинним, [0] - якщо помилковим

ĐɓƖ₫áĐ₫=ʁ∧

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

Пояснення:

              Implicit input
Đ             Duplicate input
ɓ             Get input in binary (as string)
Ɩ             Cast to integer
₫             Reverse the digits (this removes any trailing zeroes)
á             Push the stack into a list
Đ             Duplicate the list
₫             Reverse the digits of each element of the list
=             Are the two lists equal element-wise
ʁ∧            Reduce the list by bitwise AND

0

Сітківка , 72 байти

.+
$*_;$&
+`(_+)\1
$+0
0_
_
0+;
;
+`\b(\w)((\w*)\1)?\b
$3
(\B;\B)|.*
$.1

Спробуйте в Інтернеті! Посилання включає тестові випадки. Працює, створюючи одинарний дублікат оригінального числа, але використовуючи _s, щоб не плутати, наприклад, введенням 11. Одинарне число потім перетворюється на "двійкове" і позбавляється нулів. Потім паліндроми послідовно обрізаються, і останній етап перевіряє, чи залишилось щось.


0

Математика, 70 байт

(P=PalindromeQ)[PadRight[#~IntegerDigits~2,#~IntegerExponent~2]]&&P@#&


0

Гая , 10 байт

ṙṭ@ḍ2⁻Πbṭ∧

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

Пояснення

Замість того, щоб перевіряти провідні нулі у двійкових, я перевіряю без проміжних нулів.

ṙ           String representation of number
 ṭ          Is palindromic?
  @         Push input again
   ḍ        Prime factors
    2⁻      Remove all 2s
      Π     Product
       b    Convert to binary
        ṭ   Is palindromic?
         ∧  Logical and


0

C # (.NET Core) , 130 129 179 173 + 23 байти

декілька речей, дякую Еду Марті за те, що він вказав, що мені потрібно перевірити, чи не так багато 0 накладених спереду на паліндром. І мені потрібно переконатися, що я можу перевірити до x ^ 32 -1.

x=>{var a=Convert.ToString(x,2);var b=x+"";Func<string,bool>p=z=>z.SequenceEqual(z.Reverse());return new int[a.Length].Select((_,z)=>p(new string('0',z)+a)).Any(z=>z)&p(b);}

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


1
Ви можете видалити пробіл між returnі (на 129 байт
Містер Xcoder

Це працює лише при додаванні щонайбільше одного ведучого 0, але проблема задає кілька провідних нулів.
Ед Марті

@EdMarty, яка була оброблена, а також помилка переповнення стека.
Dennis.Verweij

ви пропускаєте using System;аusing System.Linq
LiefdeWen

або це +23 байти?
LiefdeWen


0

Pyth , 25 22 19 18 17 байт

- 3 6 7 8 байт шляхом подальшого вивчення мови

Ks_.Bsz&_IzqKs_`K

Пояснення:

Ks        Set K to the integer version of...
 _.BsJ    Reverse string of the binary input
&         And
 _Iz      Is the input equal to the reverse of itself?
 qKs_`K   Is K equal to int(the reverse of basically string(K))

Я впевнений, що це можна пограти в гольф, я над цим працюю.

Тестовий сюїт



0

Октава , 68 66 байт

@(x)all([d=num2str(x) b=deblank(['' dec2bin(x)-48])]==flip([b d]))

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

Початкові пропозиції від Octave.

В основному ми створюємо масив, що містить число у вигляді десяткового рядка, а число як двійковий рядок із вилученими кінцевими 0. Тоді ми створюємо масив з тим самим рядком, але з перевернутими двійковими та десятковими числами. Нарешті обидва масиви порівнюються, і результат є точним, якщо вони збігаються (обидва паліндроми), або помилковим, якщо вони не відповідають (один або обидва не паліндроми).


  • Збережіть 2 байти, використовуючи flipзамість fliplr.

0

APL2 (не Діалог), 36 байт

(N≡⌽N←⍕N)^∨/(((⌽B)⍳1)↓B)⍷B←(32⍴2)⊤N←

Спочатку нехай B - 32-бітове представлення N:

B←(32⍴2)⊤N

Потім дзеркало В і знайдіть положення 1-го 1:

(⌽B)⍳1

Потім скиньте стільки позицій з B. Це дозволить зберегти правильну кількість провідних 0.

Потім виконайте ЗНАЙТЕННЯ та АБО ЗАМОВЛЕННЯ, щоб побачити, чи є обрізаний B власним дзеркалом.

Тепер давайте розглянемо N, десятковий. Найбільш лівий скоплений вираз перетворює N у векторний символ і перевіряє, чи МАТЧє його власне дзеркало.

Нарешті, AND приєднується до двох чеків.


У APL2 я не можу створити акуратну лямбда, тому я написав однолінійку та включив стрілку призначення. Сподіваюся, це не обман.


1
Ласкаво просимо до PPCG!
Мартін Ендер

Ласкаво просимо до PPCG! Для менш обманної версії ви можете додати quad ( ), щоб зробити його замість повноцінною програмою? Крім того, чи можете ви скоротити (N≡⌽N←⍕N)^∨/(B↓⍨1⍳⍨⌽B)⍷B←(32⍴2)⊤N←⎕?
Ерік Аутгольфер

Еріку, дякую за перевірку! Я впевнений, що це можна покращити, але у мене немає I хитання в APL2.
mappo

0

Java 8, 105 104 байт

n->{String t=n+n.toString(n,2).replaceAll("0*$","")+n;return t.contains(new StringBuffer(t).reverse());}

Пояснення:

Спробуйте тут.

n->{                         // Method with Integer parameter and boolean return-type
  String t=n                 //  Create a String `t` starting with the input Integer
    +n.toString(n,2)         //  Append the binary representation of the input Integer,
      .replaceAll("0*$","")  //   with all trailing zeroes removed
    +n;                      //  Append the input Integer again
  return t.contains(new StringBuffer(t).reverse());
                             //  Return true if `t` is a palindrome
}                            // End of method
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.