Alakalı rakam gruplarını bulun


14

Son zamanlarda itibarımdı 25,121. Her rakam grubunun (virgülle ayrılmış sayılar) mükemmel bir kare olduğunu fark ettim.

Negatif olmayan bir tamsayı N ve bir tekli boolean Kara Kutu Fonksiyonu f : Z *B verildiğinde, N'nin basamak gruplarına uygulanan f'nin her değeri doğruysa, aksi takdirde falsey ise, zorluğunuz doğrudur.

Sayıları sağ taraftan başlayarak 3'lü gruplara bölerek rakam gruplarını bulabilirsiniz. En soldaki grup 1, 2 veya 3 hane içerebilir. Bazı örnekler:

12398123  -> 12,398,123    (3 digit groupings)
10        -> 10            (1 digit grouping)
23045     -> 23,045        (2 digit groupings)
100000001 -> 100,000,001   (3 digit groupings)
1337      -> 1,337         (2 digit groupings)
0         -> 0             (1 digit grouping)

Ek kurallar

  • Bu işlev boolean (ör. trueVe false), 1s ve 0s veya herhangi bir doğruluk / falsey değerine eşlenebilir. Lütfen yanıtınız tarafından hangi biçimlerin desteklendiğini belirtin.
  • Girdi olarak bir tam sayı veya bir tam sayı dizesi (örn. Rakamlardan oluşan bir dize) alabilirsiniz.
  • Bir program veya işlev yazabilirsiniz.
  • Dijital grupları f işlevine geçirirken , gereksiz tüm önde gelen sıfırları kırpmalısınız. Örneğin, f , N = 123,000'e uygulandığında f (123) ve f (0) olarak yürütülmelidir .

Test senaryoları

İşlev gösterimi n -> f(n)örn n -> n == 0. Tüm operatörler tamsayı aritmetiği varsaymaktadır. (Örn. sqrt(3) == 1)

function f
integer N
boolean result

n -> n == n
1230192
true

n -> n != n
42
false

n -> n > 400
420000
false

n -> n > 0
0
false

n -> n -> 0
1
true

n -> sqrt(n) ** 2 == n
25121
true

n -> sqrt(n) ** 2 == n 
4101
false

n -> mod(n, 2) == 0
2902414
true

n -> n % 10 > max(digits(n / 10))
10239120
false

n -> n % 10 > max(digits(n / 10))
123456789
true

İşlevleri bağımsız değişken olarak alamıyorsak, işlevin bir değişken olarak tanımlandığını varsayabilir miyiz ve programımızda buna başvururuz?
coinheringaahing Caird

@cairdcoinheringaahing Lütfen Kara kutu işlevleri için referansı, özellikle bu yazının sonundaki referansları okuyun . Özetlemek gerekirse, diliniz argüman olarak işlevler alabilse bile (evet)
Conor O'Brien

Girdi negatif olabilir mi? Sıfır? Tamsayılardan bahsediyorsunuz, ancak tüm örnekler olumlu. Ayrıca, 000'lık bir gruplamanın ele alınması gereken test durumlarını da eklemenizi öneririm.
xnor

1
@ ConorO'Brien Bu durumda , çoğu yanıt başarısız olduğu için test senaryolarına ( n -> n > 0uygulanmış 0) eklemeniz gerekir.
Asone Tuhid

1
@EriktheOutgolfer Onlar [0].
Conor O'Brien

Yanıtlar:


4

Jöle , 5 bayt

bȷÇ€Ạ

Çevrimiçi deneyin!

Komut satırı bağımsız değişkeni sayıdır. Bu işlevin içinde bulunduğu satırın üzerindeki satır, programın geri kalanının ana satırıdır, yani grupların her biri için çağrılan koddur. Hattın içeri girmemesine dikkat edin bȷÇ€Ạ! Burada kullanılan örnek 5. test örneğidir.



@AsoneTuhid Değil; Sayı 0ve rakam grubu listesi [0], böylece her öğeye ( 0burada tek ) eşlenir , listeyi dönüştürür [1]ve bu listenin tüm öğeleri doğrudur, çünkü 1döndürülür. Rakam grup listesi []olsaydı sonuç değişmez, çünkü tüm unsurları []doğrudur (boş gerçek). Bununla birlikte, sonuç farklı programlar için farklı olabilir ve kurallar bu konuda tam olarak açık değildir ( sorulan OP ).
Outgolfer Erik

Üzgünüm, Jelly'i anlayamıyorum. Güzel çözüm.
Asone Tuhid

7

Brachylog , 8 bayt

ḃ₁₀₀₀↰₁ᵐ

Çevrimiçi deneyin!

Kara kutu işlevi ikinci satıra (veya TIO'daki "Altbilgi") gider ve tam sayı STDIN'den okunur. true.Veya false.buna göre yazdırır .

ḃ₁₀₀₀      Compute the base-1000 digits of the input.
     ↰₁ᵐ   Map the blackbox predicate over each digit. We don't care about the
           result of the map, but the predicate must succeed for each digit,
           otherwise the entire map fails.






3

JavaScript (ES6), 40 36 bayt

f=>g=i=>f(i%1e3)&(i<1e3||g(i/1e3|0))

Fonksiyonu ve değeri körelerek alır ve 0 veya 1 döndürür. Düzenleme: @Shaggy sayesinde 4 bayt kaydedildi.


1000-> 1e3birkaç bayt kaydetmek için. Ve yerini alabilecek &&olan &başka byte için?
shaggy

@Shaggy Evet, bence bu yeterince güvenli. Betseg'in cevabı için de aynı şey geçerli mi?
Neil

başarısızfunction_name(n=>n>0)(0)true
Asone Tuhid

@AsoneTuhid Teşekkürler, düzeltildi.
Neil

2

Pyth , 9 bayt

.AyMjQ^T3

Çevrimiçi deneyin! (üçüncü test senaryosunu kullanır)

Kara kutu işlevinin adlandırıldığını varsayar y. TIO'da gösterildiği gibi L(argument b:) kullanarak böyle bir işlevi bildirebilirsiniz . Zamanım varsa, tüm test senaryolarını daha sonra uygulayacağım.


2

Stax , 8 bayt

Vk|Eym|A

Stax programlarında işlev çağrıları veya bağımsız değişkenler bulunmadığından, Ykayıtta tek bir değer tüketen ve üreten bir blok saklarız . Bu program kodundan önce yapılabilir.

{...}Yd     store a block in the Y register that executes ...
Vk|E        get "digits" of input using base 1000
    ym      map "digits" to array using y as mapping function
      |A    all elements are truthy?

İşte mükemmel kare işlevini kullanan bir örnek .





1

05AB1E , 8 bayt

₄вεI.V}P

Çevrimiçi deneyin!

açıklama

₄в         # convert first input to base-1000
  ε   }    # apply to each element
   I.V     # execute second input as code
       P   # product of the resulting list

Sayıyı ilk girdi satırı ve işlevi ikinci olarak alır.
Çıkışlar 1 truthy ve 0 falsy için.


Bu, kodu her öğede değil, tüm listede yürütür.
Outgolfer Erik

@EriktheOutgolfer: 05AB1E'nin otomatik vektörleştirmesi ile çoğu durumda olacaktır. Sadece için çalışmaz fark Qve Êgerçi. 8 baytlık sürüme geri döneceğim.
Emigna

Yine de, .Vvektörleşmek değil, listeyi başlangıçta bir argüman olarak bile almıyor.
Outgolfer Erik

@EriktheOutgolfer: Bunun .Vvektörleştiğini hiç söylemedim . Bağlantımdaki örnekte bu È.
Emigna

Aslında Qve Êdaha önce belirttiğim gibi vektörizasyonla çalışacaktı, ancak otomatik vektörleştirmeyi kullanmak, bu komutların tüm liste üzerinde meydan okuma ruhunun dışında hissettiği haritayı yapmasını gerektirdi, bu yüzden ihtiyacımız var ε.
Emigna

1

Excel VBA, 79 bayt

nAralıktan tür tamsayı olarak girdi alan ve aralıktan [A1]genel olarak tanımlanmış bir VBA işlevinin adı olarak anonim bir VBE anlık pencere işlevi [B1].

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t

Kullanım örneği

Genel bir modülde, giriş işlevi, bu durumda f()tanımlanır.

Public Function f(ByVal n As Integer) As Boolean
    Let f = (n Mod 2 = 0)
End Function

Giriş değişkenleri ayarlanır.

[A1]=2902414    ''  Input Integer
[B1]="f"        ''  input function

Hemen pencere işlevi çağrılır.

t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t
 1              ''  Function output (truthy)

1

Ruby , 37 bayt

g=->f,n{f[n%x=1000]&&(n<x||g[f,n/x])}

Çevrimiçi deneyin!

Tekrarlayan bir lambda, fonksiyon ve tamsayı alan ve boolean döndüren.

36 bayt (yalnızca pozitif n)

g=->f,n{n>0?f[n%k=1000]&&g[f,n/k]:1}

Bu sürüm 1falsey için doğruluk falseiçin geri döner . Ne yazık ki başarısız olabilir zamann = 0

Çevrimiçi deneyin!


Sanırım g=yinelemeli
ise saymalısın

@AsoneTuhid Oh, bu mantıklı. Onu ekleyeceğim.
benj2240

Ayrıca, deneyin bu , bu döner (-1 bayt) 1truthy değeri olarak
Asone TÜHİD

Bu beynimi biraz kırıştı ... Kendimi her durumda işe yaradığına ikna etmek için biraz uğraşmak zorunda kaldım. Teşekkürler!
benj2240

Yanılmışım, bu sürüm çalışmıyor g[->n{n>0},0](döner true). Sadece giriş ise başarısız olur, 0ancak soru "negatif olmayan" diyor, bu yüzden 37'ye geri dönmelisiniz. Üzgünüm
Asone Tuhid

1

Elma tohumu , 51 bayt

(lambda(n f)(all(map f(or(to-base 1000 n)(q(0))))))

Bir sayı ve bir işlev alan ve bir boole değeri döndüren anonim lambda işlevi.

Çevrimiçi deneyin!

(lambda (n f)         ; Function with parameters n and f
 (all                 ; Return true if all elements of this list are truthy:
  (map f              ; Map the function f to each element of
   (or                ; This list if it is nonempty:
    (to-base 1000 n)  ; Convert n to a list of "digits" in base 1000
    (q (0))           ; Or if that list is empty (when n=0), then use the list (0) instead
   ))))

1

++ , 15 bayt ekle

L,1000$bbbUª{f}

Çevrimiçi deneyin!

fTIO başlığında bildirilecek bir işlev gerektirir .

Nasıl çalışır

D,f,@,0.5^i2^A=	; Declares a function 'f' to check if a perfect square
		; E.g. 25 -> 1; 26 -> 0

L,		; Declare the main lambda function
		; Example argument: 		[25121]
	1000$bb	; Convert to base 1000	STACK = [[25 121]]
	bUª{f}	; Is 'f' true for all?	STACK = [1]
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.