Квадратний номер мій шлях


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" не є дійсними плаваючими самі по собі, оскільки комп'ютер зберігає номер у двійковій формі. Зазвичай це не проблема, поки проблема не покладається на десяткове подання.
Leaky Nun

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

@Gryphon Отже, ми повинні сприймати введення як рядок?
Leaky Nun

3
@Gryphon Це тут не вдалося. 244.2не є плаваючим числом. Його не можна перетворити на рядок "244.2".
Leaky Nun

3
@Gryphon Але поведінка , як це робить його дуже незручно.
Leaky Nun

Відповіді:


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 <вхід <1 (тобто 0,45 і .45 - різні входи, але однакове число, прийнятне лише одне число)
Джонатан Аллан

@JonathanAllan Останнє не обробляється.
Ерік Аутгольфер

@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.
Ерік Аутгольфер

Вже зробив, хоча дякую!
Джонатан Аллан

Нм, не у 15-байтовій версії. EDIT: 3 секунди занадто рано, гадаю, ...
Ерік Переможник

Ви щойно помітили, що ви сказали 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
Ласкаво просимо на сайт, і приємна перша відповідь (пояснення особливо оцінені!)!
Дада

@Dada Дякую! Навіть жорсткий, я досить не задоволений байтами, які я отримав з таких речей 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 байт. Можливо, ви зможете зберегти, взявши введення як a floatі передаваючи на рядок, n+""але я не перевіряв.
TheLethalCoder

3

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

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

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

Брахілог не іде добре з поплавками ...

Пояснення:

{∋ịṫ}ᶠ⟨≡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

Пітон 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і перетворюємо кожен на Float (так що рядки також перетворюються відповідно), отримуючи [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Нарешті обчислюємо sum(...)і отримуємо 167282.25.


78 байт . Замініть i.isdigit()на"/"<i<":"
містер Xcoder

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

Ласкаво просимо. Я переніс це на Python 3 як альтернативу моїй відповіді
містер 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}

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

Використовували кілька хитрощів з коду Дома, щоб поголити 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.
        s - сума
       + - Сума
                 * lKvQ - множить число на довжину цифр String

2

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

Дуже дякую @TomCarpenter, що навчив мене, що завдання мають повернене значення і економив мене на 18байтах!

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

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

Необережений / Пояснення

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

Швидкий 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з явним параметром Strings .

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

  • print(...) - Друкує результат.

  • Float(s)!*Float(k.count)- Перетворює як String, так і кількість цифр у Float і помножує їх (Swift не дозволяє множити Float і 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

Математика, 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

Пітон 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за рядок, але вихід - messier.

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.