Візьміть квадратний корінь рядок


14

Мотивація

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

Як це працює?

З огляду на рядок (наприклад pub), перше, що вам потрібно зробити, - це визначити код ASCII для кожного символу:

"pub" -> [112, 117, 98]

Далі ви зіставляєте ці коди в діапазон [0..94], віднімаючи 32кожне значення:

[112, 117, 98] -> [80, 85, 66]

Тепер потрібно знайти для кожного значення його кореневу модуль 95(наприклад 40*40 % 95 = 80, ви також можете вибрати 55):

[80, 85, 66] -> [40, 35, 16]

І, нарешті, ви повернете його до діапазону [32..126]і перетворите його в рядок:

[40, 35, 16] -> [72, 67, 48] -> "HC0"

Дійсно, "HC0" ⊗ "HC0" = "pub"як ви можете підтвердити рішення з іншого виклику тут .


Знайомі з модульною арифметикою, ймовірно, помітили, що модуль квадратного кореня 95існує не завжди, наприклад, для нього немає кореня 2. У такому випадку квадратний корінь рядка не визначений, і ваша програма / функція може вийти з ладу, циклічити нескінченно тощо.

Для вашої зручності ось список символів, що мають квадратний корінь (перша - пробіл):

 !$%&)+03489:>CDGLMQVW]`bjlpqu

Правила

  • Ви напишете програму / функцію, яка бере аргумент (або список знаків) і повертає будь-який квадратний корінь, якщо він існує
  • Ви можете припустити, що вхід завжди має квадратний корінь
  • Вхід може складатися з порожнього рядка
  • Вхід буде в діапазоні для друку ( [32..126])
  • Вихід або надрукується на консолі, або ви повернете рядок, якщо квадратний корінь існує
  • Якщо квадратного кореня не існує, поведінка вашої програми / функції залишається невизначеною
  • Якщо ви вирішили надрукувати корінь на консолі, то виходять нові рядки чи пробіли

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

Зауважте, що це не обов'язково єдині рішення:

''              -> ''
'pub'           -> 'HC0'
'pull!'         -> 'HC33!'
'M>>M'          -> '>MM>'
'49'            -> '4%'
'64'            -> undefined
'Hello, World!' -> undefined

Примусовий стан помилок на цих символах без квадратного кореня здається непотрібним, я б рекомендував просто не визначене поведінку.
Атако

@ATaco Я оновив виклик.
ბიმო

Що робити, якщо даний рядок - це квадрат з декількох рядків?
tsh

@tsh Поверніть будь-який, я оновлю виклик.
ბიმო

1
@curiousdannii Насправді це має бути діапазон 0-94(це діапазон для друку), це друкарська помилка - вибачте за це.
ბიმო

Відповіді:


10

sh + coreutils, 58 байт

tr '$%&)+0389:>CDGLMQVW]`bjpqu' 1u.#:BFO%+M/L2Aa,795d0@H=C

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

Модульний квадратний корінь, як правило, не є унікальним; у нас є 2 або 4 варіанти для кожного символу, крім . Нам не потрібно переводити , !, 4, lтак як кожен з них вже квадратний корінь з себе. Для інших символів, ми вибираємо зображення , які не повинні бути екрановані від оболонки або tr.


6

Python 3, 57 56 байт

lambda s:s.translate({k*k%95+32:k+32for k in range(95)})

translateвикористовує відображення від "порядкових порядків Unicode до порядків Unicode". Таким чином, нам не потрібні chr/ ordконверсії. Примітка: вона не виходить з ладу, коли у char немає кореня.

Збережено 1 байт завдяки @ jonathan-allan

Значення відображення є найбільшим коренем у діапазоні 0..94 ключа. Щоб мати найменший корінь (як у прикладах), використовуйте:

lambda s:s.translate({k*k%95+32:k+32for k in range(95,0,-1)})

(61 байт)

>>> [s.translate({k*k%95+32:k+32for k in range(95,0,-1)}) for s in ['','pub','pull!','M>>M','49','64','Hello, World!']]
['', 'HC0', 'HC33!', '>MM>', '4%', '64', 'He33o,\x7f9or3d!']

Ласкаво просимо! Гарний перший пост. Ви можете видалити пробіл між 32і for.
Джонатан Аллан

... також, ось посилання на тестовий набір онлайн-перекладача.
Джонатан Аллан


3

Japt , 16 15 байт

c@H+LDz%95+HÃbX

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

Збережено байт, переглянувши відповідь 05AB1E (використовуючи L= 100 замість 95). Зараз Japt - найкоротший, досить рідкісний випадок :-D

Пояснення

 c@ H+LÇ   ²  %95+HÃ bX
UcX{H+LoZ{Zp2 %95+H} bX}   Ungolfed
                           Implicit: U = input string, H = 32, L = 100
UcX{                   }   Map each charcode X in the input to the following:
      Lo                     Create the array [0, 1, ..., 98, 99]
        Z{         }         and map each item Z to
          Zp2                  Z ** 2
              %95              mod 95
                 +H            plus 32.
                     bX      Find the first index of X in this array. This gives the
                             smallest square root (mod 95) of (X - 32).
    H+                       Add 32 to map this back into the printable range.
                           Implicit: output result of last expression


2

Желе , 18 17 16 байт

95Ḷ²%95+32żØṖFyO

Спробуйте в Інтернеті! (поставляється з колонтитулом тестового набору)

Збережено 2 байти, виконавши повне перезапис. Також вперше я знайшов для себе використання }.

Пояснення

Код спочатку обчислює всі квадратні символи, а потім відображає їх у відповідні квадратні корені.

95Ḷ²%95+32żØṖFyO    Main link. Argument: S (string)
95                    Take 95.
  Ḷ                   Get the array [0, 1, ..., 94].
   ²                  Square each to get [0, 1, ..., 8836].
    %95               Get each square modulo 95 to get [0, 1, ..., 1].
       +32            Add 32 to get [32, 33, ..., 33].
           ØṖ         Get the list of printables [" ", "!", ..., "~"].
          ż           Interleave with printables to get [[32, " "], ..., [33, "~"]].
             F        Flatten the mapping to [32, " ", ..., 33, "~"].
               O      Get the code point of each character in input.
              y       Map the code points to the correct output characters using the map.

95Ḷ²%95+32iЀO+31Ọв основному те, що робить моя відповідь Japt, хоча ваше рішення на два байти коротше ...
ETHproductions

2

JavaScript, 82 байти

Співпраця з @ETHproductions

s=>s.map(x=>(g=z=>z*z%95==x.charCodeAt(0)-32?String.fromCharCode(z+32):g(z+1))(0))

Введення та вихід у вигляді масиву знаків.

Фрагмент тесту


2

05AB1E , 17 байт

vтLn95%žQykk33+ç?

Алгоритм дуже схожий на відповідь Jelly and Japt (раніше було щось інше, але це дістало мені лише 19 байт)

Пояснення

vтLn95%žQykk33+ç?
v                 # For each character of the input...
 тL                # Push [1..100]
   n               # Square every element of the list
    95%            # And take it modulo 95
       žQyk        # Push the index of the current character in the printable ascii range
           k       # Push the index of that in the list created earlier
            33+    # Add 33 to the result
               ç   # And convert it back to a character
                ?  # Print the character

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


1

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

FromCharacterCode[PowerMod[ToCharacterCode@#-32,1/2,95]+32]&

Анонімна функція. Приймає рядок як вхідний і повертає рядок як вихідний. Помилки при неправильному введенні.



1

Математика 82 байт

FromCharacterCode[Solve[x^2==#,Modulus->95][[1,1,2]]+32&/@(ToCharacterCode@#-32)]&

Використання здатності Solve робити модульну арифметику.

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