Sıfır Olmayan Dijital Ürün Mücadelesi


26

Başlangıçta Çarpımsal dijital kök

Meydan okuma

Temel olarak başlık ne diyorsa yapın

Yöntem

Olumlu bir tamsayı verilen 1 <= N <= 100000000 , standart giriş yöntemlerimizden biriyle, her basamağı çarparak sıfırları yok sayarak.

Ör: Bir numarayı alın demek 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (sıfırları görmezden gel veya onları bunlara çevir) =1152
  • 1152* 2=2304

İçin çıkış 361218402DİR2304

Test Kılıfları

1 => 1
diğer her basamak> 0 => kendisi
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Standart Loopholes'a izin verilmiyor ve bu , yani en kısa bayt sayısı kazanıyor!

Tebrikler Jo Kral ile ödül aldık onun 70 bayt beyin kurşun geçirmez cevap!


5
Buna sıfır olmayan dijital ürün demeyi tercih ederim . "root", burada her zaman doğru olmayan tek bir rakama indirgendiğini gösteriyor.
Outgolfer Erik,

1
Bir dize olarak girdi alabilir miyiz? Ya da (iterek) bir rakam dizisi?
Shaggy

@EriktheOutgolfer Evet, ancak işlemi yeterince tekrarlarsanız, her zaman tek bir rakama gidiyor gibi görünüyor.
DJMcMayhem

Alıntılanan girişleri alabilirsiniz, ancak hayır, eğer istediğiniz şey buysa, önceden ayrıştırılmış rakamlar listesini alamazsınız
FantaC

7
Bir maksimum desteklememiz gerekiyorsa , varsayılan 32 bit bir tamsayıya uymadığından 100000000000test vakasını öneririm 99999999999 => 31381059609. Belki de daha iyisi, maksimum çıktının 32 bit'e (2147483647) düşürülmesi olabilir.
Kevin Cruijssen

Yanıtlar:


3

Pyt , 3 bayt

ąžΠ

Açıklama:

ą       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

Çevrimiçi deneyin!


Bu nispeten yeni golf sahasının bu mücadeleyi 3 baytta çözebilecek tek kişi olması şaşırtıcıydı!
ETH Sunumları

Ben de şaşırdım!
mudkip201

Cevabınızı ilk kabul ettiğimde görmedim, ama bu en kısa olanı!
FantaC

11

Haskell , 27 bayt

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

Çevrimiçi deneyin!

UniHaskell ile Ungolfed ve-XUnicodeSyntax

import UniHaskell

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

açıklama

Başlangıçta sahip olduklarım ile başlayacağım:

product.map(max 1.read.pure)

Bu bir nokta içermeyen bir işleve değerlendirir bir dizi (ya da karakterler listesi) alarak bu ifade s ( "301"bir bağımsız değişken olarak). Esasen her bir karakteri i alan , onu bir listeye enjekte eden (bir dize yapan) ( ), sonra onu okuyan, dizeyi ( ) değerlendiren ve son olarak da i ve 1 ( ) ' in büyük harflerini alarak smax 1.read.pure üzerinde eşler . Sonra ortaya çıkan tamsayıların listesini alır ( ).["3", "0", "1"][3, 0, 1][3, 1, 1]product3

Daha sonra bir bayt tarafından golf oynadım:

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

Bu çalışır çünkü producteşdeğerdir foldr (*) 1. Haritalama ve katlama yerine, (*).max 1.read.pureher ikisini de sıfır olmayan basamağı alıp akümülatör ile çarparak katlayarak birleştirdim .




6

R , 40 bayt

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

Çevrimiçi deneyin!

Girişin en fazla 12 rakamdan oluşması garanti edildiğinden, bunun iyi çalışması gerekir. Rakamları x(baştaki sıfırlar dahil) olarak hesaplar , sonra sıfırları 1ürünle değiştirir ve hesaplar.

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

Yani bu nasıl R ile kodlama ... Güzel olan;) Yine de bunun nasıl çalıştığını anlamaya çalışıyorum!
Florian

1
@Florian Daha ayrıntılı bir açıklama ekledim.
Giuseppe

Bu, denemek zorunda olduğum rakamları bölmenin yeni bir yolu!
BLT

@BLT bu R golf
Giuseppe

5

C (gcc) , 39 bayt

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

Optimizasyonlar olmadan derlenmesi gerekiyor (ki yine de gcc için varsayılan ayardır).

Çevrimiçi deneyin!


Bu k=k;koyarak kdönüş defterine yanlışlıkla sadece düz kötülük. Sen olmalıdır muhtemelen muhtemelen sadece x86 / x64 üzerinde optimizasyonlar olmadan bu sadece çalıştığını ekleyin. +1.
saat

1
@tomsmeding Biraz şaşırtıcı, x86 dışındaki mimarilerde çalışıyor . Hiçbir optimizasyon ( O0), gcc için varsayılandır, bu nedenle açıkça bu bayrağın kullanılmasına gerek yoktur. Sanırım yine de yazıya bir söz ekleyeceğim.
Steadybox

Gelecekteki provalar için çalıştığı GCC'nin tam sürümünü belirtmek isteyebilirsiniz.
moonheart08

@ moonheart08 Bazı sürümlerden sonra çalışmayı durduracağından şüpheliyim. Neyse, en son sürümle çalışır, bu nedenle gönderme süresi en azından çalıştığı sürümü bulmak için kullanılabilir.
Steadybox

5

Brain-Flak , 74 72 70 bayt

-2 Nitrodon'a, sayının olumsuzlamasını aldığınızı önerdiği için teşekkür ederiz.

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

Çevrimiçi deneyin!

Toplamı 1 ile başlatmak zorunda kalmaktan kaçınmak için çarpmayı tekrarlamak gibi, bunu daha fazla golf kullanmanın birkaç yolu olabilir (-2 bayt)

Nasıl çalışır:

{ 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
Gerçek hanenin olumsuzlamasını hesaplayıp ardından 0 yerine 0'a kadar sayarak iki bayt golf
oynayabilirsiniz

4

05AB1E , 4 bayt

0KSP

Çevrimiçi deneyin!

açıklama

0K     # remove zeroes
  S    # split to list of digits
   P   # product

Bu cevabı kabul ettim çünkü Jelly, kabuğu ve 05AB1E arasında dört yönlü bir bağdı ve ilk siz cevapladınız.
FantaC,

4

J , 17 14 13 bayt

-4 bytes @GalenIvanov'un izniyle

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

Çevrimiçi deneyin!

Muhtemelen bazı geliştirilebilir. Düzenleme: ve böylece oldu.

açıklama

[: */ 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, sağdaki fiilin, ardından soldaki fiilin ardından sağdaki fiilin tersini uygulayan şık bir zarftır . Ayrıca sayılara geri dönüşümü teknik olarak eval ( ".-do) kullanıyor.


1
Sen değiştirerek byte kaydedebilirsiniz +0=]için *#] çevrimiçi Deneyin
Galen Ivanov

1
[:*/0-.~,.&.":14 bayt için. Çevrimiçi deneyin
Galen Ivanov

@ GalenIvanov Signum'un faydalı olacağını biliyordum! Asıl düşüncem (+-.@*), sanırım eklemeye meyilliyim. '0'-.~Bir dize girdiyi varsaymakla kullanmayı denedim , neden ayrık basamaklarda bunu yapmamın aklımdan geçmediğinden emin değilim. Teşekkürler!
cole

1
1>.0-.~bir bayt için daha az iş yapar . [:*/1>.,.&.": Dene!
Galen Ivanov


3

JavaScript (ES6), 28 bayt

32-bit tamsayılar için tasarlanmıştır.

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

Test durumları



3

Brachylog , 5 bayt

⊇ẹ×ℕ₁

Çevrimiçi deneyin!

açıklama

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

Bu , büyük alt kümelerden küçük alt kümelere kadar birleştiğinden, bu nedenle sıfır olmayan bir ürünle sonuçlanacak ilk, tüm sıfırların hariç tutulduğu ve başka hiçbir şey olmadığı zamandır.




3

Julia 0.6, 26 bayt

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

Kullanım örneği:

julia> !54
20

Çevrimiçi deneyin!


Bayt sayısı kadar bunun nasıl çağırılacağına bir örnek ekler misiniz? TIO kullanabilirsiniz !
Giuseppe

@Giuseppe ayy, dikkatim dağıldı. Uzunluğu saydım ama eklemedim. Huh TIO şimdi julia'yı destekliyor. Temiz.
Lyndon White,

Aslında, TIO Julia 0.4-0.6'yı destekliyor! çok hoş, +1.
Giuseppe

3

JavaScript (Node.js) , 30 bayt

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

Çevrimiçi deneyin!

Alır dize , girdi olarak dizi olarak davranır onu ve dizinin tarafından yapı bozma ilk elemanını ayırır [a,...b]. karaktere +a||1karşılık gelen basamağı döndürür a. Sanırım bu gerisi kendi kendine açıklıyor ..



2

Beyin Flak , 88 bayt

Okunabilir sürüm:

#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
<>

Çevrimiçi deneyin!



Kelimenin tam anlamıyla bu yorumu yayınladığımı unuttum ve baştan yazdım. Sadece ayrı ayrı göndereceğim
Jo King

2

Clojure , 56 bayt

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

Oldukça basit. Sayıyı dizgeye dönüştürür, sonra sayılara döndürmek için her karakterden 48 çıkarır. Daha sonra her 0 değerini 1 ile değiştirir ve* değerini değiştirir ve sonuçtaki sayı listesine (* liste üzerinde ). Bir numara veya belirli bir numara kabul edebilir.

Çevrimiçi deneyin!

(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

Befunge, 23 22 bayt

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

Çevrimiçi deneyin!

açıklama

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

C # , 97 Bayt (İlk kod golf)

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

Bir yöntemle sarmam gerekip gerekmediğinden emin değilim, bu yüzden güvenli olması için dahil edilmedi.

Bir Int alır, onu bir dizgeye dönüştürür ve 0'ları yok sayan karakterlerin her birinin katlarını döndürür. Ascii değerini bir karakter olarak okuduğu gibi kullanan program nedeniyle eksi 48 olması gerekiyordu.


2
PPCG'ye Hoşgeldiniz! Ben C # hiçbir şey, ama bu içinde golf için kuralları anlamanıza yardımcı olacaktır.
H.PWiz

Thanks @ H.PWiz Bu küçük zorlukları gerçekten sevmeye başlıyorum, kesinlikle düzenli programlamamı daha özlü ve verimli olacak şekilde değiştirmeme neden oluyor.
James,

Hoşgeldin ve ilk önce güzelce deneyin: D Cevabınız için bazı ipuçları: var z=y.ToString();ve foreachbenzerlerini doğrudan içine yerleştirebilir ve yerleştirebilirsiniz foreach(var q in y.ToString()):; ve sonuç almak için size değiştirerek daha bayt kaydedebilirsiniz {if(q!=48){r*=q-48;}}ile r*=(q>48?q:1);parantez ve kapalı tıraş, if.
Auhmaan




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.