Виклик не нульового цифрового продукту


26

Спочатку мультиплікативний цифровий корінь

Виклик

В основному роби те, що говорить заголовок

Метод

Давши додатне ціле число 1 <= N <= 100000000 за допомогою одного з наших стандартних методів введення , множте кожну цифру разом, ігноруючи нулі.

Наприклад: Візьміть число, скажіть 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (ігноруйте нулі або перетворіть їх на одиниці) =1152
  • 1152* 2=2304

Вихід для 361218402IS2304

Випробування

1 => 1
кожна інша цифра> 0 => себе
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Стандартні лазівки заборонені, і це , тому виграйте найменший байт!

Вітаю Джо Кінга, який отримав щедроту зі своєю відповіді на 70-байтний мозок!


5
Я б швидше назвав цей ненульовий цифровий продукт . "root" припускає, що вона зводиться до однієї цифри, що не завжди відповідає дійсності.
Ерік Аутгольфер

1
Чи можемо ми приймати введення як рядок? Або (натискаючи на нього) масив цифр?
Кудлатий

@EriktheOutgolfer Так, але якщо ви повторите процес достатньо разів , він, як видається, завжди переходить до однієї цифри.
DJMcMayhem

Ви можете взяти процитовані дані, але ні, ви не можете взяти заздалегідь розроблений список цифр, якщо про це ви запитуєте
FantaC

7
Якщо ми маємо підтримати максимум, 100000000000я пропоную тестовий випадок 99999999999 => 31381059609, оскільки він не вписується у 32-бітове ціле число за замовчуванням. Можливо, краще було б знизити максимальний вихід до 32-бітового максимуму (2147483647).
Кевін Кройсейсен

Відповіді:


3

Pyt , 3 байти

ąžΠ

Пояснення:

ą       Convert input to array of digits (implicit input as stack is empty)
 ž      Remove all zeroes from the array
  Π     Get the product of the elements of the array

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


Здивований, що цей відносно новий гольф-гольф - єдиний, який, здається, здатний вирішити цю проблему в 3 байти!
ETHproductions

Мене це теж здивувало!
mudkip201

Я не побачив вашої відповіді, коли я вперше прийняв, але це найкоротший!
FantaC

11

Haskell , 27 байт

foldr((*).max 1.read.pure)1

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

Unololfed з UniHaskell і-XUnicodeSyntax

import UniHaskell

f  String  Int
f = product  map (max 1  read  pure)

Пояснення

Почну з того, що у мене було:

product.map(max 1.read.pure)

Це вираження без точок, яке оцінює функцію, яка бере аргумент (або список символів) s ( "301"). Він відображає max 1.read.pureнад S , по суті , приймаючи кожен знак I , вводячи його в список (що робить його рядок) ( ["3", "0", "1"]), а потім читати його, який обчислює рядок ( [3, 0, 1]) і , нарешті , приймати більше з I і 1 ( [3, 1, 1]). Тоді він приймає productрезультуючий список цілих чисел ( 3).

Потім я переграв його на байті з:

foldr((*).max 1.read.pure)1

Це працює, тому що productеквівалентно foldr (*) 1. Замість картографування та складання я поєднав два, склавши за допомогою (*).max 1.read.pureякого беручи кожну ненульову цифру і помноживши її на акумулятор.




6

R , 40 байт

cat(prod((x=scan()%/%10^(0:12)%%10)+!x))

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

Оскільки вхід гарантовано містить не більше 12 цифр, це має працювати добре. Обчислює цифри як x(включаючи провідні нулі), а потім замінює нулі на 1та обчислює добуток.

cat(					#output
    prod(				#take the product of
         (x=				#set X to
	    scan()			#stdin
		  %/%10^(0:12)%%10)	#integer divide by powers of 10, mod 10, yields digits of the input, with leading zeros. So x is the digits of the input
                                   +!x  #add logical negation, elementwise. !x maps 0->1 and nonzero->0. adding this to x yields 0->1, leaving others unchanged
                                      ))

Отже, це як кодогольф з R ... Хороший;) Ще намагаюся розібратися, як це працює, хоча!
Флоріан

1
@Florian Я додав більш детальне пояснення.
Джузеппе

Це новий спосіб розділення цифр, який мені доведеться спробувати!
BLT


5

C (gcc) , 39 байт

k;f(n){for(k=1;n;n/=10)k*=n%10?:1;k=k;}

Необхідно компілювати без оптимізацій (це все одно за замовчуванням для gcc).

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


Що випадкове k=k;внесення kдо реєстру повернень - це просто зло. Вам, мабуть, слід додати, що це працює лише без оптимізацій щодо лише x86 / x64. +1.
tomsmeding

1
@tomsmeding Дещо дивно, але це працює і за іншими архітектурами, ніж x86 . Не використовується оптимізація ( O0) за замовчуванням для gcc, тому немає необхідності явно використовувати цей прапор. Я думаю, я все одно додам згадку про це до пошти.
Steadybox

Ви можете вказати точну версію GCC, з якою вона працює, для подальшого підтвердження.
moonheart08

@ moonheart08 Я сумніваюся, що вона перестане працювати після якоїсь версії. У будь-якому випадку він працює з останньою версією, тому час публікації можна використовувати для пошуку версії, з якою вона принаймні працює.
Steadybox

5

Мозг-Флак , 74 72 70 байт

-2 завдяки Nitrodon за те, що він запропонував отримати заперечення числа, так що вам доведеться лише збільшувати, а не зменшувати пізніше

{([{}]((((()()()){}){}){}){}){({<({}())><>([[]](){})<>}<><{}>)<>}{}}<>

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

Можливо, існує кілька способів продовжити гольф, наприклад, повторення множення, щоб уникнути необхідності ініціалізації загальної величини з 1. (-2 байти)

Як це працює:

{ Loop over every number
  ([{}]((((()()()){}){}){}){}) Add 48 to the negative of the ASCII to get the negation of the digit
  { If the number is not 0
     ({<({}())><>([[]](){})<>}<><{}>)<> Multiply the total by the number
                                          If the total is on an empty stack, add 1
  } 
  {} Pop the excess 0
}<> Switch to the stack with the total

1
Ви можете пограти ще два байти, обчисливши заперечення фактичної цифри, а потім порахувати до 0, а не 0
Nitrodon


4

J , 17 14 13 байт

-4 байти люб’язно надано @GalenIvanov

[:*/1>.,.&.":

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

Напевно, можна дещо вдосконалити. Редагувати: і так було.

Пояснення

[: */ 1 >. ,.&.":
                 ": Convert to string
             ,.     Convert row to column vector
               &.   Convert to numbers
      1 >.        Maximum of each element with 1 (convert 0 to 1)
   */              Product
[:                 Cap fork

&.-under - витончений прислівник, який застосовує дієслово праворуч, потім дієслово зліва, потім зворотне дієслово праворуч. Також для технічного перетворення на номери технічно використовується eval ( ".-do).


1
Ви можете зберегти байт, змінивши +0=]для *#] Спробувати онлайн
Гален Іванов


@GalenIvanov Я знав, що синум буде корисний! Моя оригінальна думка була (+-.@*), гадаю, я схильний додати. Я намагався використати '0'-.~припущення введення рядка, не знаючи, чому це не перешкоджає мені робити це на розбитих цифрах. Спасибі!
Коул

1
1>.робить роботу 0-.~на байт менше. [:*/1>.,.&.": Спробуй це!
Гален Іванов


3

JavaScript (ES6), 28 байт

Призначений для 32-бітних цілих чисел.

f=n=>!n||(n%10||1)*f(n/10|0)

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



3

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

⊇ẹ×ℕ₁

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

Пояснення

⊇        Take a subset of the input
 ẹ       Split the subset into a list of digits
  ×      Product
   ℕ₁    This product must be in [1, +∞)

Це працює, тому що об’єднує великі підмножини в малі підмножини, тому перше, що призведе до ненульового продукту, - це коли всі нулі виключені і більше нічого.



3

Java 8, 55 54 53 51 байт

int f(int n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}

Порт @Dennis 'Python 2 відповідь .
-1 байт завдяки @RiaD .

Спробуйте тут.

Версія 55 54 байти:

n->{int r=1;for(;n>0;n/=10)r*=n%10>0?n%10:1;return r;}

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


1
ви можете зберегти парени так:long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
RiaD

1
Вибачте, я стверджую, що це (45 байт), оскільки алгоритм зовсім інший ;-)
Олів'є Грегоар

3

Джулія 0,6, 26 байт

!x=prod(max.(digits(x),1))

Приклад використання:

julia> !54
20

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


Ви можете додати приклад, як викликати це, а також кількість байтів? ви можете використовувати TIO !
Джузеппе

@Giuseppe, ой, я відволікався. Я порахував довжину, але не додав її. Huh TIO зараз підтримує Джулію. Акуратний.
Ліндон Уайт

Насправді TIO підтримує Julia 0.4-0.6! дуже приємно, +1.
Джузеппе

3

JavaScript (Node.js) , 30 байт

f=([a,...b])=>a?(+a||1)*f(b):1

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

Приймає рядок як вхідний, трактує його як масив, а шляхом деструктуризації масиву відокремлює перший елемент [a,...b]. +a||1повертає цифру, відповідну aсимволу. Я думаю, що відпочинок сам пояснює ..



2

Мозок-Флак , 88 байт

Читаема версія:

#Push a 1 onto the alternate stack. Return to the main stack
(<>())<>

#While True:
{

    #Push the current digit minus 48 (the ASCII value of '0') onto the alternate stack
    ({}[((((()()()){}){}){}){}]<>)

    #If it's not 0...
    {
        (<

            #Multiply the top two values (the current digit and the current product that started at 1)
            ({}<>)({<({}[()])><>({})<>}{}<><{}>)

        #Also push a 0
        >)

    #Endwhile
    }

    #Pop the 0
    {}

    #Return to the main stack
    <>

#Endwhile
}

#Toggle to the alternate stack, and implicitly display
<>

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



Я буквально забув, що опублікував цей коментар і переписав його з нуля. Я просто збираюся розміщувати пошту окремо
Jo King

2

Clojure , 56 байт

(fn[n](apply *(replace{0 1}(map #(-(int %)48)(str n)))))

Досить базовий. Перетворює число в рядок, потім віднімає 48 з кожного символу, щоб перетворити їх назад у числа. Потім він замінює кожен 0 на 1 і застосовується *до отриманого списку чисел (який зменшується *над списком). Можна прийняти номер або рядковий номер.

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

(defn non-zero-prod [n]
  (let [; Abusing strings to get each digit individually
        str-n (str n)

        ; Then turn them back into numbers
        digits (map #(- (int %) 48) str-n)

        ; Substitute each 0 for a 1
        replaced (replace {0 1} digits)]

    ; Then get the product
    (apply * replaced)))

2

MATL , 5 байт

!UXzp

Введення приймається як рядок

Спробуйте в MATL Online! Або перевірити тестові випадки в "Try it Online"!

Пояснення

!     % Implicit input: string (row vector of chars). Transpose into
      % a column vector of chars
U     % Convert from string to number. Treats each row independently,
      % producing a column vector of numbers
Xz    % Keep only nonzeros
p     % Product. Implicit display

2

Befunge, 23 22 байти

1<*_$#`.#0@#:+!:-"0"~$

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

Пояснення

1<                        Push 1, turn back left, and push a second 1.       
                     $    Drop one of them, leaving a single 1, the initial product.

                -"0"~     Read a char and subtract ASCII '0', converting to a number.
             +!:          If it's 0, make it 1 (this is n + !n).
      `  0  :             Then test if it's greater than 0, to check for EOF.
   _                      If it is greater than 0, it wasn't EOF, so we continue left.
  *                       Multiply with the current product, becoming the new product.
1<                        Now we repeat the loop, but this time push only a single 1...
                     $    ...which is immediately dropped, leaving the current product.

   _                      On EOF, the input value will be negative, so we branch right.
    $                     We don't need the input, so drop it.
       .  @               Leaving us with the product, which we output, then exit.

2

JavaScript (Node.js) , 36 33 байт

Простий метод Javascript (ES6), який приймає введення як числовий рядок, поширює його в масив, потім зменшує його шляхом множення або повертає значення, якщо результат дорівнює 0.

3 байти збережено завдяки Шаггі

s=>[...s].reduce((a,b)=>b*a||a,1)

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


Збережіть 3 байти, взявши введення як рядок.
Кудлатий

Я не знаю, чому я подумав, що це потрібно перетворити, дякую: D
Вілсон Джонсон Reta232

2

Рубі, 42 40 35 32 27 байт

p eval (gets.chars-[?0])*?*

Не передбачає нових рядків у введенні Основний вплив

-2 байти завдяки @GolfWolf

-5 байт завдяки @Conor O'Brien


Ще коротше, ніж tr: 32 байти
Крістіан Лупаску

@GolfWolf Clever :)
Håvard Nygård

Чи можете ви використовуватись *для приєднання? p eval (gets.chars-[?0])*?*?
Conor O'Brien


2

C # , 97 байт (гольф першого коду)

static int X(int y){var z=y.ToString();int r=1;foreach(var q in z){if(q!=48){r*=q-48;}}return r;}

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

Займає Int in, перетворює його в рядок і повертає кратне число кожного символу, ігноруючи 0. Прийшлося до мінус 48 через програму, яка використовує значення ascii, оскільки вона читає її як знак.


2
Ласкаво просимо до PPCG! Я нічого з C #, але це повинно допомогти вам зрозуміти правила гольфу в ньому.
H.PWiz

Дякую @ H.PWiz Я справді починаю любити ці маленькі виклики, безумовно, змушуючи мене змінити своє регулярне програмування на більш стисле та ефективне.
Джеймс м

Ласкаво просимо і приємно перша спроба: D Деякі поради для вашої відповіді: ви можете видалити var z=y.ToString();і помістити його безпосередньо в foreach, наприклад , так: foreach(var q in y.ToString()); і щоб отримати результат, ви можете зберегти більше байтів, замінивши {if(q!=48){r*=q-48;}}їх r*=(q>48?q:1);, відчепивши дужки та if.
auhmaan




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