Копы - квадратный квадратный корень


37

Примечание. Это ветка полицейских , в которой нужно разместить зашифрованный код. Вот ветка грабителей, где взломанный источник должен быть опубликован и связан с ответом полицейского.


Задача: Напишите самую короткую безопасную программу, которая умножает квадратный корень из целого числа n на квадрат n

Это , поэтому правила таковы:

  • В своем ответе опубликуйте зашифрованную версию вашего исходного кода (символы должны быть написаны в любом порядке). Зашифрованная версия не должна работать!
  • Вы можете принять ввод любым стандартным способом, то же самое относится и к выводу. Жесткое кодирование запрещено
  • После того, как код будет взломан грабителями (если это произойдет), вы должны упомянуть, что ваш код был взломан в вашем заголовке, и добавить спойлер в текст вашего ответа с вашим точным кодом.
  • То же самое относится и к безопасным ответам (упомяните, что это безопасно, и добавьте спойлер )
  • Код считается безопасным, если никто не взломал его через 5 дней после публикации, и вы можете указать это в заголовке.
  • Вы должны указать свой язык программирования
  • Вы должны указать количество байтов
  • Вы должны указать механизм округления в своем ответе (см. Ниже)

Можно предположить, что результат меньше 2 32, а n всегда положительно. Если результатом является целое число, вы должны вернуть точное значение с десятичной точкой или без нее; в противном случае минимальная десятичная точность будет равна 3 десятичным знакам с любым механизмом округления по вашему выбору, но может включать и больше. Вы должны указать механизм округления в своем ответе. Вы не можете вернуться в виде дробей (числитель, знаменатель пары - извините, Bash!)

Примеры:

In -> Out

4 -> 32.0 (or 32)
6 -> 88.18163074019441 (or 88.182 following the rules above)
9 -> 243.0
25 -> 3125.0

Самый короткий безопасный ответ к концу апреля будет считаться победителем.


2
Связанный. (Те же правила CnR, другая задача.)
Мартин Эндер,

2
@MartinEnder Если задача отличается только от задачи, то не дубликат?
Натан Меррилл

1
@NathanMerrill Я не знаю, я не думаю, что у нас есть какие-либо устоявшиеся дубликаты руководств для вызова полицейских и грабителей, но если я задам новый вызов code-golf , где «единственная» вещь, которая отличается от предыдущего кода code задача, как правило, не считается дубликатом. ;) (Тем не менее, я согласен, что CnR, вероятно, более интересны, если мы изменим CnR-часть задачи, а не основную задачу.)
Мартин Эндер

1
Удачи всем! Я очень рад, что вы решили снова открыть это. Ждем интересных ответов!
г-н Xcoder

2
Я написал свой код для работы с входом до 2 ^ 32 ... Вот почему я спросил об ошибках округления, в этот момент я был совершенно не в себе
fəˈnɛtɪk

Ответы:


2

05AB1E, 20 байтов - безопасно

Еще один совершенно другой подход из моих предыдущих ответов.

****++/133DDFPTs}¹¹Ð

Нет округления.

Пример работает

In   -> Out
0    -> 0
4    -> 32.0
6    -> 88.18163074019441
25   -> 3125.0
7131 -> 4294138928.896773

Я не сомневаюсь, что @Emigna взломает его в один миг, но нужно попробовать! :-D


Решение

D1TFÐ*D¹3*+s3*¹+/*}P

Это использует тот факт, что эта последовательность:

u_0 = 1, u_ {n + 1} = u_n * (u_n ^ 2 + 3 x) / (3 u_n ^ 2 + x)

сходится к sqrt (x) и кубически быстро при этом (извините, не нашел, как отформатировать математические уравнения в PCG).

Детальное объяснение

D1TFÐ*D¹3*+s3*¹+/*}P
D1                   # Duplicate the input, then push a 1: stack is now [x, x, 1] (where x is the input)
  TF                 # 10 times (enough because of the cubic convergence) do
    Ð                # triplicate u_n
     *               # compute u_n ^ 2
      D              # and duplicate it
       ¹3*+          # compute u_n ^ 2 + 3 x
           s         # switch that last term with the second copy of u_n ^ 2
            3*¹+     # compute 3 u_n ^ 2 + x
                /    # compute the ratio (u_n ^ 2 + 3 x) / (3 u_n ^ 2 + x)
                 *   # compute u_n * (u_n ^ 2 + 3 x) / (3 u_n ^ 2 + x), i.e. u_{n+1}, the next term of the sequence
                  }  # end of the loop
                   P # compute the product of the whole stack, which at that point contains u_10 (a sufficiently good approximation of sqrt(x)), and the 2 copies of the input from the initial D: we get x ^ 2 * sqrt(x)

Попробуйте онлайн!


17

Python 3 , 44 байта ( взломан )

'**:(((paraboloid / rabid,mad,immoral))):**'

Нет округления. Точность с плавающей точкой.


4
Да ладно, это заслуживает больше очков, это так креативно! Существует симметрия, и все слова являются реальными словами.
Эрик Outgolfer

Если бы я не делал глупые ошибки ... Трещины
KSab

11

MATL , 12 байт ( взломано @tehtmi )

'Un&0P'/^:+1

Нет округления; использует с плавающей точкой.

Предполагаемое решение (отличается от найденного @tehtmi):

:&+n10U'P'/^

объяснение

:&+ % Create a matrix of size n × n, where n is implicit input
n % Number of elements. Gives n^2
10U % 10 squared. Gives 100
'P' % 'P' (ASCII code 80)
/ % Divide. Gives 1.25
^ % Power. Implicit display



@tehtmi Действительно! Отлично сработано! Мое намеченное решение было другим; Я только отправил это
Луис Мендо

10

Röda , 28 байт ( взломано @tehtmi )

 (),.025^^cdfhnnnopprstuu{|}

Обратите внимание на пробел в начале. Нет округления, но он использует числа с плавающей запятой, поэтому точность ограничена.


Это анонимная функция или «полная» функция?
Kritixi Lithos

@KritixiLithos, если полицейский не хочет давать улики, он не должен этого делать
Mr. Xcoder


10

Perl, 42 байта (безопасный)

Есть 41 байт кода и -pфлага (других флагов нет).

/"/4~~r..rso4r<_$4va=eg1de|i/h0-&$c={}l+"

Результат не округляется (или, скорее, округляется до той же точки, которую Perl получит при округлении $_ = (sqrt $_) * ($_ ** 2)).

Решение:

$_=eval".i44<4}{|~"=~s/./chr-10+ord$\&/gre
(без спойлера \до &уценки, кажется, не нравится, $а затем &)
Попробуйте онлайн!

Объяснение:

.i44<4}{|~is, $_**2*sqrtно с каждым символом, замененным символом с его кодом ascii + 10. (ascii-код $is 36, поэтому он становится .чьим ascii-кодом 46и т. д.).
Цель этого s/./chr-10+ord$\&/greсостоит в том, чтобы отменить это преобразование: оно заменяет каждый символ на символ с кодом ASCII на 10 ниже. ( chr-10+ord$\&вероятно, яснее, chr(ord($\&)-10)когда chrвозвращает символ, соответствующий коду ascii, и ordвозвращает код, соответствующий символу ascii).
наконец, evalоценивает эту строку и таким образом вычисляет результат, который хранится в нем $_, который неявно печатается в конце благодаря -pфлажку.


Правда. Я пытался отредактировать быстро, потому что я видел 4 вновь открытых голоса и надеялся исправить вопрос до того, как 5-й будет подан. Если бы вопрос был оставлен в песочнице, пока он не был готов, это было бы лучше для всех участников.
Питер Тейлор

@PeterTaylor Конечно, нет проблем, и в любом случае, это было выделено жирным шрифтом, достаточно заметным (я никого не обвинял, а просто указывал на незначительный поток (который я исправил сразу (вводя опечатки в процесс))). И я не мог согласиться больше о части песочницы.
Dada

Вы можете объяснить это немного?
phuclv

@ LưuVĩnhPhúc Ты имеешь в виду, могу ли я тебе немного помочь, чтобы взломать его? ммх ... код начинается с $_=. И есть evalгде-то. (это не много, но я чувствую, что не могу дать вам больше, не предоставив вам слишком много информации)
Дада

8

Октава, 43 байта (Сейф)

$'()*+,-/23579:[]aelnouv'*,-23:[]lu',-23]',

Это скрипт, который требует ввода из командной строки (это не функция). Это точность с плавающей точкой (поэтому нет округления).

Решение:

eval(-[5,-2:3,-3:2]+['nlouu*$$',39,']2/7'])

Объяснение:

eval( <string> ) % Evaluated the string inside the brackets and executes it
Все внутри evalзвонка оценивается input('')^2.5

как?

-[5,-2:3,-3:2] % A vector: [-5, 2, 1, 0, -1, -2, -3, 3, 2, 1, 0, -1, -2]
['nlouu**$$',39,']2/7'] % This is a string: nlouu**$ concatenated with the number
. % 39 (ASCII ']'), and ']2/7'. Thus, combined: 'nlouu**$$']2/7'

Добавление первого вектора к этой строке преобразует его в целочисленный вектор:
[105, 110, 112, 117, 116, 40, 39, 39, 41, 94, 50, 46, 53]

evalнеявно преобразует это в строку, и эти числа просто так: input('')^2.5


1
Это было сложно. Отлично сработано!
Луис Мендо

7

C, 50 байтов ( взломано fergusq )

%(())   ,-12225;>\\aaabbdddeeefffllnoooprrttuuuuw{

Использует стандартное округление IEEE754. Как отмечено в ответе fergusq, может потребоваться в -lmзависимости от вашего компилятора.



@ Fergusq правильно, и почти точно, что я имел. Отлично сработано; Я думал, что оставил там достаточно красных селедок, чтобы люди были заняты намного дольше!
Дейв

@Dave Wow, сначала это выглядит как синтаксическая ошибка.
Эрик Outgolfer

6

Mathematica, 131 байт, не конкурирует ?, взломан

Это был взломан @ lanlock4 ! Тем не менее, у меня все еще есть интернет-очки, чтобы даровать кого-то, кто находит оригинальное решение, где все персонажи действительно необходимы ....

f[y_]:=With[{x=@@@@@@#####^^&&&(((()))){{}}111111,,+-/y},Print[#,".",IntegerString[Round@#2,10,3]]&@@QuotientRemainder[1000x,1000]]

Это задумано как головоломка. Хотя вы можете использовать вышеперечисленные символы так, как хотите, я, конечно, намерен, чтобы ответ следовал за формой

f[y_]:=With[{x=
    @@@@@@#####^^&&&(((()))){{}}111111,,+-/y
},Print[#,".",IntegerString[Round@#2,10,3]]&@@QuotientRemainder[1000x,1000]]

где первая и третья строки являются просто оберткой, чтобы сделать округление и отображение законным (каждый вывод записывается ровно в три десятичных знака, округлено), а вторая строка представляет собой зашифрованную версию кишок кода. Пример выходов:

6 -> 88.182
9 -> 243.000
9999 -> 9997500187.497

(Mathematica - это несвободное программное обеспечение, но есть песочница Wolfram, где можно тестировать скромные объемы кода. Например, вырезать и вставить код

f[y_]:=With[{x=
    y^2.5
},Print[#,".",IntegerString[Round@#2,10,3]]&@@QuotientRemainder[1000x,1000]]

определяет функцию, которую вы впоследствии можете вызвать как f@6или f[9], которая делает то же самое, что и расшифрованная версия кода выше. Так это действительно должно быть неконкурентным?)



6

Swift - 64 байта (безопасно)

prot Fdnufi;nooitamunc xetgru(->atl)Ior:n{tFn pg,F(ao.o25t)(w)l}

Нет округления и отображает .0даже если результат является целым числом.




4

C #, 172 байта ( взломано SLuck49 )

       (((((())))))***,,,,......1225;;;;;;<====>CFLMMMMMPPPRSSSSSWaaaaaaabbbbcccddddddeeeeeeeeeeegghiiiiiiiillllllmmnnnnnnnooooooooqqqqrrrssssssssstttttttttuuuuuuuvvwyy{{}}

Этот код является полной программой.

В начале есть семь пробелов.

Ввод читается из STDIN и распечатывается в STDOUT. Результат doubleне округлен.

Оригинальный код безголовый:

using System;
using S = System.Console;

class P
{
    static void Main()
    {
        var t = S.ReadLine();
        double q = int.Parse(t);
        Func<double, double, double> M = Math.Pow;
        S.Write(M(q, 2 * .25) * M(q * q, 1));
    }
}




3

Python 3.6, 59 байт

ba(,b5,d' (,a/([m:'-)oa)(bl*aadplma dba](r)d )l*d,:)*m:-mml

Нет округления. Точность с плавающей точкой.


Действительно, 3 лямбды?
г-н Xcoder

3

Haskell, 64 байта, ( взломано Laikoni )

$$$$$$(((((())))))**,...0<<<>>>[]cccccdddeffiiiiilloopppprrsstuu

Стандартные операции с плавающей точкой на Haskell.

Моя оригинальная версия:

продукт. ((($ Succ $ соз $ 0) (флип (**).) [идентификатор, Recip])). Флип (ID)



@Laikoni: молодец!
nimi

3

Фурье , 124 119 байт

((()))*******--011111<=>>>HHINNNN^^^eeehhhhkkkkmmmmmmmmmmmmmmmmossuuuuuuuuuuuuuuuuu{{{{{{{{{{}}}}}}}}}}~~~~~~~~~~~~~~~~

Здесь нет пробелов и символов новой строки.

Квадратный корень округляется до ближайшего целого числа, потому что Фурье, кажется, не обрабатывает ничего, кроме целых чисел (и, поскольку @ATaco получил разрешение, я надеюсь, что это нормально)

исправлена ​​ошибка редактирования, если вы уже взломали это, предыдущий был функционален

Понял, что я неправильно понял часть кода, и использовал больше символов, чем мне было нужно

Если я что-то пропустил, дайте мне знать




3

Октава, 30 байт (безопасно)

(((((())))))**++/:@eeeiiijmsu~

Немного проще, чем мой первый. Не должно быть слишком сложно, но, надеюсь, это веселая головоломка.


2
Нет ^? Хммм ...
Луис Мендо

1
Придумал это, @(e)(e**((i/(i+i))+~sum(e:j)))но это только n^1.5... это сложно.
Кайл Гуллион,

3

Ом, 11 байт

M ⁿ¡D¼½;+1I

Используйте с -cфлагом. Использует кодировку CP-437.


Извините, но вы уверены, что это правильно?
user4867444

Теперь, когда никто не взломал его в отведенное время, не могли бы вы поделиться своим решением, пожалуйста? Мне очень любопытно :)
user4867444

Пока это самый короткий ответ, который считается безопасным. Я приму это, но если вы не опубликуете свой оригинальный код в течение 5 дней, я сниму галочку с этого, поскольку не уверен, что это возможно. EAGER тоже видит ваше решение
мистер Xcoder

2
@ RomanGräf попробуй найти решение, пожалуйста. В противном случае я
сниму

1
@ RomanGräf: пинг? Все еще очень
хочу


2

Javascript, 123 байта, взломан notjagan

 """"""((((((((()))))))))********,--.....//2;;======>>Seeeeeeegggggggggggghhhhhhhhhhhilllllnnnnnnnnnnorrrsstttttttttttttu{}

Этот код является полной функцией

В самом начале списка символов есть один пробел

Округление этого ответа является точностью с плавающей запятой для Javascript, точность в пределах 10 ^ -6 для каждого ответа.

Стал короче, потому что точность не должна была поддерживаться настолько высокой, как я думал.

Я понял, что это будет намного легче решить, чем я первоначально сделал, но это уже было: P

Исходный код:

g=t=>t-(t*t-n)/("le".length*t);e=h=>{n=h*h*h*h*h,s=2**(n.toString("ng".length).length/"th".length);return g(g(g(g(g(s)))))}

Метод Ньютона, примененный 5 раз от ближайшей степени 2







2

Excel, 26 байт

=(())*//11122AAAIINPQRSST^

Нет округления.

Примечание: поскольку Excel является платным программным обеспечением, это также работает в бесплатном LibreOffice.


1
Есть ли способ запустить это, не покупая Excel? В настоящее время все согласны с тем, что несвободные языки нельзя использовать в полиции и грабителях.
Wheat Wizard

1
Должен работать в свободном Libreoffice, но я проверю и доберусь обратно.
pajonk

1
Работает просто отлично.
pajonk



2

RProgN 2 , 6 байт ( взломано @notjagan )

š2]^*\

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


2
Это действительно работает n²√n? Я могу легко заставить его рассчитать n² + √n, но я не могу на всю жизнь увидеть, как вы получили условия для умножения.
notjagan

@ notjagan меня тоже ... пытались в течение 2 часов, чтобы взломать его, и ничего не работает. ATaco вы уверены, что источник правильный?
мистер Xcoder

@ Mr.Xcoder А, ты прав. Извините за трату ваших коллективных раз! Пожалуйста, смотрите отредактированный источник.
ATaco

Теперь это имеет смысл!
г-н Xcoder

Немного поздно, потому что я был занят, но треснул .
notjagan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.