Квадратный номер мой путь

Gryphon 08/23/2017. 20 answers, 1.959 views
code-golf number

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

123
123
123 

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

123+123+123+111+222+333 

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

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

-144
-144
-144 

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

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

4 

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

Для чисел с десятичными частями стека обычно (помните, что только digits подсчитываются в количестве раз, когда вы складываете номер, и, следовательно, десятичная точка не учитывается) и игнорируют десятичные символы при чтении вертикальных чисел. Например, номер 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 

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

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

5 Comments
Gryphon 07/29/2017
Я понимаю, что это было не в песочнице очень долго (всего чуть больше дня), но у нее уже было 7 верхних позиций, поэтому я подумал, что, вероятно, готов к публикации.
1 Leaky Nun 07/29/2017
«123.45» и «244.2» не являются допустимыми поплавками сами по себе, потому что компьютер хранит число в двоичном формате. Обычно это не проблема, пока проблема не зависит от десятичного представления.
3 Leaky Nun 07/29/2017
@Gryphon Вот где он терпит неудачу. 244.2 не является числом с плавающей точкой. Он не может быть преобразован в строку "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Но поведение, подобное этому, делает его очень неудобным.
7 Gryphon 07/29/2017
Почему три близких голоса? Если 11 человек могут ответить на вопрос, я думаю, что это, наверное, довольно ясно!

20 Answers


Erik the Outgolfer 07/29/2017.

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 
4 comments
3 Jonathan Allan 07/29/2017
Объяснение Оуо, когда вы можете
1 Jonathan Allan 07/29/2017
Также я хотел бы отметить, что единственным начальным нулем является требование на вход для -1 <вход <1 (то есть 0,45 и 0,45 - разные входы, но одинаковое число, только первое допустимо)
Erik the Outgolfer 07/29/2017
@JonathanAllan Последнее не обрабатывается в любом случае.
Erik the Outgolfer 07/29/2017
@JonathanAllan Сделано.

Jonathan Allan 07/29/2017.

Желе , 13 12 байт

fØDẋ€L$ŒV+VS 

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

Try it online!

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 
4 comments
Erik the Outgolfer 07/29/2017
Umm, вы можете заменить +€ на + в 15-байтной версии на -1.
Jonathan Allan 07/29/2017
Уже сделал, спасибо, хотя!
Erik the Outgolfer 07/29/2017
Умм не в 15-байтной версии. EDIT: 3 секунды слишком рано, я полагаю ...
Jonathan Allan 07/29/2017
Я просто заметил, что вы сказали, что 15-байтная версия - еще раз спасибо!

nimi 07/29/2017.

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 

ETHproductions 07/29/2017.

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. 

Ian H. 07/31/2017.

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

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

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i 

Попробуйте прямо сейчас!

Принимает строку в качестве входа и выводит «квадрат» в качестве поплавка.


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

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

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

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

Пример:

Вход: -135.5

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

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

5 comments
1 Dada 07/31/2017
Добро пожаловать на сайт, и хороший первый ответ (объяснения, в частности, оценены!)!
Ian H. 07/31/2017
@Dada Спасибо! Даже грубо, я довольно недоволен байтами, которые я получил от таких вещей, как string.Replace() , но я думаю, это единственный способ, которым это работает!
TheLethalCoder 07/31/2017
Возможно, вы сможете сохранить несколько байтов, установив i и l в float.
Ian H. 07/31/2017
@TheLethalCoder Подумал об этом, а, к сожалению, индексирование не работает с поплавками, а .Length не может быть неявно преобразована в float.
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141 байт. Могу быть в состоянии сохранить, принимая ввод как float и бросая в строку с n+"" но я не проверял.

Erik the Outgolfer 07/29/2017.

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

Zgarb 07/29/2017.

Husk , 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 

Mr. Xcoder 07/29/2017.

Python 3 , 95 94 87 85 84 байта

 def f(i):l=[x for x in i if"/" 

Тестовый комплект .

Python 3 , 78 байт

 lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/" 

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

Второй подход - это порт для Python 3, основанный на решении @ officialaimm.


ThePirateBay 07/31/2017.

JavaScript, 75 62 байта

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

Попробовать онлайн

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (хотя функция должна получить номер, но теперь я вижу, что многие другие ответы также получают строку)


Xcali 08/05/2017.

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

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

Попробуйте прямо сейчас!

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

Explained:

 @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 
3 comments
Dom Hastings 07/31/2017
Пришел очень похожий подход, но удалось получить пару байтов, используя $ \ и выйти из цикла: попробуйте в Интернете!
Xcali 08/05/2017
Использовал некоторое вдохновение от вас, чтобы побрить мою. Что такое «} {« построить в конце вашего? Я не знаком с этим.
Dom Hastings 08/05/2017
Это тот, который я узнал из этого сайта, в основном -n и -p буквально обертывают while(){...} вокруг кода, поэтому }{ вырывается из этого. Это unsets $_ но если вы используете $\ качестве переменной, он все равно будет распечатан, так как $\ добавляется к каждой печати. Значит, вы можете хранить число или что-то в этом и игнорировать $_ . Не уверен, что это было отличное объяснение, но ознакомьтесь с советами по гольфу g в потоке Perl , я уверен, что это объяснит это лучше! Рад, что помогли вашему счету!

Erik the Outgolfer 07/29/2017.

Желе , 17 байт

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

Попробуйте прямо сейчас!


Erik the Outgolfer 07/29/2017.

Pyth, 18 байт

s+RvQsM*RF_lB@jkUT 

Попробуйте здесь.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 байт

K@jkUTQ+smv*lKdK*lKv 

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

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


объяснение

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - фильтрует цифры и присваивает их переменной K.           M - Карта.  Итерируется через цифры с переменной d             V - Оценить (конвертировать в float).              * LKd - умножает каждую цифру строки на длину K.          S - Сумма         + - Сумма                   * LKvQ - Умножает число на длину цифр String 

officialaimm 07/30/2017.

Python 2 , 81 74 байта

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder : '/'

  • Принимает целое число или float, возвращает float.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Попробуйте прямо сейчас!

Объяснение:

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

4 comments
Mr. Xcoder 07/29/2017
78 байт . Замените i.isdigit() на "/"
1 Mr. Xcoder 07/29/2017
74 байта . Вы можете заменить i.isdigit() на "/" , на самом деле, потому что оба . И - имеют более низкие коды ASCII, чем цифры, adn / находится между ними
officialaimm 07/29/2017
@ Mr.Xcoder Спасибо большое!
Mr. Xcoder 07/29/2017
Пожалуйста. Я портировал его на Python 3 в качестве альтернативы моему ответу

Bruce Forte 07/30/2017.

Octave , 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 comments
1 Tom Carpenter 07/30/2017
Вы можете сэкономить 18 байтов, все это превратит в анонимную функцию @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Попробуйте прямо сейчас!

Mr. Xcoder 07/30/2017.

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) - преобразует как String, так и количество цифр в Float и умножает их (Swift не разрешает умножение Float и Int :()). Таким образом, он добавляет число x раз, где x - количество цифр, которое оно содержит.

  • k.mapNO maps over k with the current value $0 . - 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 .


TheLethalCoder 07/31/2017.

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

Saved 2 bytes thanks to @Ian H.

Попробуйте прямо сейчас!

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

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func 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 comments
Ian H. 07/31/2017
Вы можете сохранить 2 байта в начале, используя var d=(n+ ... вместо var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Забыл удалить все пробелы -_- Это то, что я получаю для ответа при обращении к службе поддержки.

Jenny_mathy 08/09/2017.

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

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

Titus 08/11/2017.

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 для исправления.


C McAvoy 07/31/2017.

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"/"<_) 

Попробуйте прямо сейчас!

Related questions

Hot questions

Language

Popular Tags