Квадрат число мой путь


32

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

123
123
123

Затем вы берете все строки и столбцы из квадрата и складываете их вместе:

123+123+123+111+222+333

Что дает нам результат 1035.

Для отрицательных чисел вы обычно складываете (помните, что вы учитываете только количество цифр , поэтому отрицательный знак не включается в длину), а затем считываете горизонтальные числа в обычном порядке (с отрицательными знаками), а затем игнорируете отрицательные знаки для вертикальные числа. Итак, за число -144получаем квадрат:

-144
-144
-144

Что дает нам -144-144-144+111+444+444, что равно567

Для чисел, состоящих только из одной цифры, квадрат всегда равен удвоенному числу (читается один раз по горизонтали и один раз по вертикали). Так 4дает нам

4

Что дает нам 4+4, что равно 8.

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

244.2
244.2
244.2
244.2

Что дает нам 244.2+244.2+244.2+244.2+2222+4444+4444+2222, что равно 14308.8.

Дробные или комплексные числа не могут быть возведены в квадрат.

Твое задание:

Я устал от квадратов чисел, поэтому решил автоматизировать процесс. Напишите мне программу или функцию, которая принимает плавающее число или строку, в зависимости от того, что вы предпочитаете, в качестве входных данных и возвращает результат ее возведения в квадрат.

Примеры:

123    -> 1035
388    -> 3273
9999   -> 79992
0      -> 0
8      -> 16
-6     -> 0
-25    -> 27
-144   -> 567
123.45 -> 167282.25
244.2  -> 14308.8
2      -> 4
-0.45  -> 997.65
0.45   -> 1000.35

Подсчет очков:

Мои руки становятся тесными от записи всех этих квадратов, и мой компьютер не поддерживает копирование / вставку, поэтому запись с наименьшим количеством кода, который я могу напечатать (измеряется в байтах по какой-то причине?), Выигрывает!


1
«123.45» и «244.2» не являются действительными числами с плавающей точкой сами по себе, потому что компьютер хранит число в двоичном виде. Обычно это не проблема, пока проблема не зависит от десятичного представления.
Утренняя монахиня

@ LeakyNun, я не знаю, что ты имеешь в виду под этим. Проблема не является неразрешимой (по крайней мере, в Python), я уверен, что смог бы сделать это довольно легко, хотя и с большим количеством байтов. Однако это потребует некоторых манипуляций со строками.
Грифон - Восстановить Монику

@Gryphon Итак, мы должны принять ввод как строку?
Дрянная Монахиня

3
@Gryphon Вот где это терпит неудачу. 244.2это не число с плавающей точкой. Он не может быть преобразован в строку "244.2".
Дрянная Монахиня

3
@Gryphon Но поведение , как это делает его очень неудобно.
Утренняя монахиня

Ответы:


8

05AB1E , 7 байтов

þSDg×+O

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

объяснение

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum

3
Ооо объяснение, когда вы можете, пожалуйста
Джонатан Аллан

1
Также я хотел бы отметить, что одиночный начальный ноль является требованием на входе для -1 <input <1 (то есть 0,45 и .45 - это разные входы, но одинаковое число, допустимо только первое)
Джонатан Аллан

@JonathanAllan Последнее все равно не обрабатывается.
Эрик Outgolfer

@JonathanAllan Готово.
Эрик Аутгольфер

7

Желе ,  13  12 байт

fØDẋ€L$ŒV+VS

Монадическая ссылка, принимающая список символов (правильно сформированное десятичное число, одиночный начальный ноль является требованием для -1 <n <1 ) и возвращающий число.

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

14 байт , чтобы принимать и возвращает число (вход ограничен +/- 10 -5 с ŒṘ): ŒṘfØDẋ€L$ŒV+⁸S.

Как?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65

Гм, вы можете заменить +€с +в 15-разрядной версии для -1.
Эрик Outgolfer

Уже сделал, спасибо, хотя!
Джонатан Аллан

Умм, не в 15-байтовой версии. РЕДАКТИРОВАТЬ: 3 секунды слишком рано, я полагаю ...
Эрик Outgolfer

Да, только что заметил, что вы сказали 15-байтовую версию - еще раз спасибо!
Джонатан Аллан

6

Haskell, 59 56 байт

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l])

Ввод принимается как строка.

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

Как это работает

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l   

5

Japt v2 , 16 байт

o\d
l
¬xpV +V*Ng

Проверьте это онлайн!

объяснение

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result.

4

C # (.NET Core), 150 141 133 байта

Сохранено 9 байтов благодаря @TheLethalCoder
Сохранено еще 8 байтов благодаря @TheLethalCoder

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}

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

Принимает строку в качестве входных данных и выводит квадратное число в виде числа с плавающей запятой.


Этот код следует следующему алгоритму:

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

  2. Рассчитайте время ввода длины строки, которую мы создали в точке 1.

  3. Для каждого столбца в нашем «квадрате» создайте новую строку с номером столбца и длиной строки и добавьте ее в наш результат.

Пример:

Входные данные: -135.5

  1. Если мы заменим десятичные точки и символы, мы получим строку 1355длиной 4.
  2. Входной раз 4: -135.5 * 4 = -542.
  3. Теперь мы создаем новые строки для каждого столбца, разобрать их и добавить их в наш результат:
    1111, 3333, 5555, 5555.

Если мы суммируем эти числа, мы получим 15012, что именно то, что выведет наша программа.


1
Добро пожаловать на сайт и приятного первого ответа (объяснения, в частности, приветствуются!)!
Дада

@ Дада Спасибо! Даже несмотря на то, что я довольно недоволен байтами, которые я получил от подобных вещей string.Replace(), но я думаю, это единственный способ, которым это работает!
Ян Х.

Может быть в состоянии сохранить некоторые байты, установив iи lплавая.
TheLethalCoder

@TheLethalCoder Мысль об этом, к сожалению, индексация не работает с плавающей точкой и .Lengthне может быть неявно преобразована в плавающую.
Ян Х.

1
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}141 байт. Может быть в состоянии сохранить, принимая входные данные как floatи приведение к строке, n+""но я не проверял.
TheLethalCoder

3

Брахилог , 23 байта

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+

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

Brachylog плохо сочетается с поплавками ...

Объяснение:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements)

3

Шелуха , 15 байт

§+ȯṁrfΛ±TṁrSR#±

Принимает строку и возвращает число. Попробуйте онлайн!

объяснение

Немного раздражает, что встроенная функция rсинтаксического анализа выдает ошибки синтаксического анализа недопустимых входных данных, а не возвращает значение по умолчанию, что означает, что я должен явно отфильтровывать столбцы, состоящие из нецифровых чисел. Если он вернул 0 на некорректных входах, я мог бы сбросить fΛ±и сохранить 3 байта.

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9


3

Python 2 , 81 74 байта

-7 байт благодаря @Mr. Xcoder :'/'<i

  • Берет целое число или число с плавающей запятой, возвращает число с плавающей запятой.
lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/"<i]]for i in[x]+z)

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

Объяснение:

Скажем 123.45, дан как вход. [i for i in`x`if"/"<x]дает список строковых целых чисел ['1','2','3','4','5'](что также z). Теперь мы перебираем [x]+zто есть [123.45,'1','2','3','4','5'], умножая каждый элемент на len(z), здесь 5и конвертируя каждый элемент в число с плавающей точкой (чтобы строки также конвертировались соответствующим образом), получая результат [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Наконец мы вычисляем sum(...)и получаем 167282.25.


78 байтов . Заменить i.isdigit()на"/"<i<":"
Mr. Xcoder

1
74 байта . Вы можете заменить i.isdigit()с "/"<i, на самом деле, потому что как .и -имеют более низкие коды ASCII , чем цифры, ADN /находится между ними
г Xcoder

Пожалуйста. Я перенес его на Python 3 в качестве альтернативы моему ответу
Mr. Xcoder

3

JavaScript, 75 62 байта

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a

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

-2 байта благодаря Арнаулду
-5 байтов благодаря Шегги (хотя функция должна получать число, но теперь я вижу, что многие другие ответы тоже получают строку)


3

Perl 5 , 37 33 + 1 (-p) = 38 34 байта

$_*=@n=/\d/g;for$\(@n){$_+=$\x@n}

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

Использовал некоторые трюки из кода Dom, чтобы побрить 4 байта

Разъяснение:

@n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point

Придумал очень похожий подход, но сумел получить пару байтов, используя $ \ и выход из цикла: попробуйте онлайн!
Дом Гастингс

Использовал немного твоего вдохновения, чтобы сбрить мою. Что такое конструкция "} {" в конце вашей? Я не знаком с этим.
Xcali

Это один из тех, что я узнал на этом сайте, в основном -nи -pбуквально обернул while(){...}вокруг кода, так что }{вырывается из этого. Это сбрасывает, $_но если вы используете в $\ качестве переменной, она все равно будет напечатана, так $\ как добавляется к каждой печати. Значит, вы можете хранить номер или что-то в этом и игнорировать $_. Не уверен, что это было хорошим объяснением, но ознакомьтесь с советами по игре в гольф в Perl , я уверен, что это объяснит лучше! Рад, что помог ваш счет, хотя!
Дом Гастингс



2

Pyth , 21 20 байт

K@jkUTQ+smv*lKdK*lKv

Тестирование.

Использует совершенно иной подход, чем ответ @ EriktheOutgolfer , который помог мне сыграть 1 байт в чате с 22 до 21.


объяснение

K@jkUTQ+s.ev*lKbK*lKv

K @ jkUTQ - фильтрует цифры и присваивает их переменной K.
         м - карта. Итерация по цифрам с переменной d
           v - Оценить (конвертировать в плавающее).
            * lKd - Умножает каждую строковую цифру на длину K.
        с - сумма
       + - Сумма
                 * lKvQ - умножает число на длину строки цифр

2

Октава , 100 82 байта

Большое спасибо @TomCarpenter за то, что научили меня, что присваивания имеют возвращаемое значение, и сэкономили мне 18байты!

@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))

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

Ungolfed / Пояснение

function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end

Это работает так, что нам нужно добавить само число nраз, а затем добавить сумму столбцов. Суммирование s' * logspace(0,n-1,n)достигает суммы столбцов, например, если v=-123.4эта матрица будет:

[ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ]

Так что нам просто нужно sumэто сделать, и мы закончили.


1
Вы можете сохранить 18 байтов, превратив все это в анонимную функцию @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). Попробуйте онлайн!
Том Карпентер

1

Swift 4 , 139 134 байта

func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))}

Тестирование.


объяснение

  • func f(s:String)- Определяет функцию fс явным параметром String s.

  • let k=s.filter{"/"<$0}- Фильтрует цифры: я заметил, что оба -и .имеют меньшие значения ASCII, чем все цифры, и /между ними ., -и 0. Следовательно, я только что проверил, "/"меньше ли текущий символ, как я сделал в своем ответе на Python.

  • print(...) - печатает результат.

  • Float(s)!*Float(k.count)- Преобразует и строку, и количество цифр в число с плавающей запятой и умножает их (Swift не допускает умножения чисел с плавающей запятой и Int :()) Таким образом, он добавляет количество xраз, где xэто количество цифр, которые он содержит.

  • k.map{Int(String(repeating:$0,count:k.count))!- k.map{}карты kс текущим значением $0. String(repeating:$0,count:k.count)берет каждую цифру, создает строку xидентичных цифр и Float(...)!преобразует ее в число с плавающей точкой.

  • .reduce(0,+) - Получает сумму из списка выше.

  • И, наконец, +подводит итоги двух результатов.


Давайте возьмем пример!

Скажем , наша Строка "0.45". Во-первых, мы фильтруем цифры, поэтому мы остаемся с 0, 4, 5. Мы превращаем "0.45"в Float и умножить на количество цифр: 0.45 * 3 = 1.35. Затем мы берем каждую цифру и превратить его в строку повторяя эту цифру , пока не заполнит ширину квадрата (сколько цифр есть): 0, 4, 5 -> 000, 444, 555. Мы суммируем это 000 + 444 + 555 = 999. Тогда мы просто сложим результаты вместе 1.35 + 999 = 1000.35.


1

C #, 139 137 байт

using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);}

Сохранено 2 байта благодаря @Ian H.

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

Полная / Отформатированная версия:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<double, double> f = n =>
            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
}

Вы можете сохранить 2 байта в начале, используя var d=(n+ ...вместо var d = (n ....
Ян Х.

@IanH. Забыл удалить все пробелы -_- Это то, что я получаю, отвечая на звонки в службу поддержки.
TheLethalCoder

1

Mathematica, 107 байт

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])&

1

PHP, 78 88 +1 байт

for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e;

Беги как труба с -nR.

Может выдавать предупреждения в PHP 7.1. Repace $c,$eс , $c>0?$c:0,$eчтобы исправить.


0

Python 3 , 68 70 73 77 байт

lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_)

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

Перебирает каждый символ цифры и повторяет его по количеству символов в целом, превращает его в целое число и добавляет к нему n. Таким образом, nдобавляются dвремена, горизонтальная часть суммы, а также повторение цифры, которая является вертикальной частью. Изначально использовался, str.isdigitно >"/", благодаря другим в этой теме, сэкономил много байтов. Сохраняет два байта, принимая nв качестве строки, но результат получается более сложным.

lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_)

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

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