50.000'in altındaki yılan numaralarının bir listesini oluşturun.


24

Yılan numarası meydan

Acaba 1 ile 50.000 arasında kaç tane yılan numarası var?

Nokia'da Yılan

Snaking Numbers, bu oyunda, bir tuş yukarı, aşağı, sola veya sağa hareket ettirilerek geleneksel bir sayısal tuş takımında (aşağıdaki biçim) yazılabilen numaralardır.

7 8 9
4 5 6
1 2 3
 0

Örneğin, 5 rakamıyla başlarsanız, bir sonraki geçerli harekette 4, 6, 8 veya 2 seçeneğini belirleyebilirsiniz; . Bu nedenle, 5, 2 varsa, bir sonraki geçerli anahtar seçimleriniz tekrar 0, 1, 3 veya 5'tir.

Bu Code Golf alıştırmasında, ölçütleri karşılayan tüm sayıların son sayısının yanı sıra, 1 ile 50k arasındaki tüm pozitif yılan sayıları listesini çıkarmanız gerekir.

kurallar

  1. Sayılar Sıfır ile başlayamaz.
  2. Sayılar tam pozitif tam sayılar olmalıdır.
  3. Soldan sağa doğru okunan her sayı, sayısal tuş takımının etrafında "yılan" olmalıdır.
  4. Yılan, anahtarlar arasında çapraz olarak hareket edemez
  5. 0 numarasına hem 1 hem de 2 numaralarından erişilebilir.
  6. Numaralar eşleştirilemez (örneğin: 22)

Geçerli Yılan Numaralarına Örnekler:

12369
45201
1254
10102
1
12
987

Geçersiz sayı örnekleri

1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159  - snake cannot travel diagonally
4556 - duplicate 5

Normal Code Golf'lara göre amaç en az bayt!

Matematik ve kurallarıma göre, listenizde geçerli 670 numaralı yılan numarasının yanı sıra 670'inin de son sayı olarak basılmış olması gerekir.


2
Çıktı sıralanmalı mı? Veya herhangi bir sırayla izin veriliyor mu?
tsh

2
Bizden sabit ve sonlu bir tamsayı dizisi çıkmamızı istediğinizi görünce, belirtime tam listeyi eklemeyi öneririm.
Shaggy


4
Bu bir A215009 alt kümesidir .
bigyihsuan

İlk önce 670'i basar mısın?
Dana

Yanıtlar:


14

K (ngn / k) , 60 57 bayt

(x;#x:{*/1=3!5&+/x*x:+1_-':(+0 1,'2*!3 3)@10\x}#1+!50000)

Çevrimiçi deneyin!

!500000.. listesi49999

1+ herkese 1 ekle

{ }# fonksiyonu ile filtre { }

10\x Argümanın ondalık hanesi

( )@ endeksleri olarak kullanmak ...

  • !3 3 bir çift liste: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)

  • 2* hepsini 2 ile çarp

  • 0 1,'Önlerine 0ilk listeye ve 1ikinciye

  • +devrik (listeler çifti -> çiftlerin listesi). bu bize yaklaşık düğme kodlarını verir.

-':önceki çiftin her çiftinden çıkart. 0 0ilkinden önce hayali bir öğe olarak kullanın .

1_ ilkini bırak

+ devrik

x*x:kare (atama xve çarpma x). işte xbir çift liste - ∆xs ve ∆ys

+/ iki listeyi toplayın (öğeye göre öğe)

5& 5 dakika

3! mod 3

1= eşit olduğu yerde Boole listesi 1

*/ ürün (boolean "and")

(x;#x: )sonucun bir çiftini ve sonucun uzunluğunu ( #) yapın


9

Jöle ,  24  23 bayt

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL

Tüm sonuçların bir listesini ve ardından sonuçların sayısını basan tam bir program.

Çevrimiçi deneyin!

Nasıl?

5ȷ4µDo1.’d3ZIASĊ’ẸµÐḟṄL - Main Link: no arguments
5ȷ4                     - 5*10^4 = 50000
   µ              µÐḟ   - filter discard those for which this is truthy:
                        -                  e.g.: 8520        ... or           4559 
    D                   -   decimal digits       [8,5,2,0]                    [4,5,5,9]
      1.                -   literal 1.5
     o                  -   logical OR           [8,5,2,1.5]                  [4,5,5,9]
        ’               -   decrement            [7,4,1,0.5]                  [3,4,4,8]
         d3             -   div-mod by 3         [[2,1],[1,1],[0,1],[0,0.5]]  [[1,0],[1,1],[1,1],[2,2]]
           Z            -   transpose            [[2,1,0,0],[1,1,1,0.5]]      [[1,1,1,2],[0,1,1,2]]
            I           -   deltas               [[-1,-1,0],[0,0,-0.5]]       [[0,0,1],[1,0,1]]
             A          -   absolute value       [[1,1,0],[0,0,0.5]]          [[0,0,1],[1,0,1]]
              S         -   sum (vectorises)     [1,1,0.5]                    [1,0,2]
               Ċ        -   ceiling              [1,1,1]                      [1,0,2]
                ’       -   decrement            [0,0,0]                      [0,-1,1]
                 Ẹ      -   any?                 0 (i.e. keep)                1 (i.e. discard)
                     Ṅ  - print and yield
                      L - length
                        - implicit print

Bunun nasıl çalıştığını bilmek isterim. Arıza verme ihtimalin var mı?
MightBeAlon

1
@MightBeAlon sonra yapacak ...
Jonathan Allan

Merak ediyorum, nasıl 1.değerlendirirsiniz 1.5?
Ignorance'ın

@ Kelimenin anlam ayrıştırılması sırasındaki ayrıcalık, bir süre sonra eksik olan bir basamağın beş olduğu kabul edilir. Bkz interpreter.py içinde parse_literal nihai başka maddesini
Jonathan Allan

7

Python 3 , 140 bayt

f=lambda s:''==s[1:]or s[1]in'10021234562216565878 43 749 9   5  8'[int(s[0])::10]and f(s[1:])
print(*filter(f,map(str,range(1,50000))),670)

Çevrimiçi deneyin!

Ben birisinin arama dizesi yerine bir ifadeyle bunu yapabileceğini düşünüyorum.


7

Python 2 , 101 bayt

print[n for n in range(1,50000)if all(`n`[i:i+2]in`0x20b33ec8bc49a10589e76b15`for i in range(4))],670

Çevrimiçi deneyin!

Onaltılık sayı, 10120214525632365878969854741birbirine bitişik görünebilen her sıralı basamak çiftini kodlayan ondalıktır.


5

JavaScript (V8) ,  112 106  104 bayt

@NahuelFouilleul sayesinde 2 bayt kaydedildi

Tam bir program.

for(n=0;++n<5e4;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n)
print(670)

Çevrimiçi deneyin!

Veya sayıları ters sırada verebiliyorsak 96 byte :

for(n=5e4;n--;)[...n+''].every(x=>'6589632145201478'.match(x+p+'|'+p+(p=x)),p='')&&print(n||670)

Çevrimiçi deneyin!


3belki de son çıkarmadan çalışıyor, çünkü 36zaten dizede
Nahuel Fouilleul

@NahuelFouilleul İyi yakala. Teşekkürler!
Arnauld

1
ayrıca 6589632145201478bir bayt daha kısa
Nahuel Fouilleul

4

Stax , 37 35 bayt

ü╞╡~▄ⁿ♪eµïê◙ü╔ï▼ΔJr¥æ≤PH╟♀I♣Δz8─¶Γ╞Ç▓

Koşun ve staxlang.xyz de hata ayıklayın!

Çok güzel ve kısaydı, olmayana kadar.

Ambalajsız (42 bayt) ve açıklama

49999{E2B{{om"#qYY>!(AFI"%A|E2B{{om-C_Qf%p
49999{                                 f      Filter range [1..49999]:
      E2B                                       All adjacent pairs of digits
         {{om                                   Each sorted
             "#qYY>!(AFI"%A|                    Literal 2012365478963258741
                            E2B{{om             Pairs of digits, each sorted
                                   -            Set difference
                                    C           Cancel block execution if any remain
                                     _Q         Print current value
                                        %p    Print length

2012365478963258741 tuş takımını kodlar. Bitişik hane çiftlerine bakın. Belki de her bir çift için her iki yönde de uygun bir şekilde kısa bir alternatif bulabilirsem, sekiz baytı da kesebilirim {{om.

Bu iz 670 olmadan basit bir filtre yeterli olacaktır: f..!yerine {..C_Qf%p. Bu düzensizliği ele almanın daha iyi bir yolu olabilir. Her iki durumda da, bu filtre aralığı davranışı belgelenmemiş.


Belge boşlukları için üzgünüm. FWIW, bu bir sonraki sürümde olacak, 1.1.7. Stax.tomtheisen.com adresinde bir önizleme görebilirsiniz , ancak bu bir sır değil, kimseye söyleme. ;)
özyinelemeyle

3

PHP , 145 bayt

for(;$i++<5e4;$f&&print$i._)for($f=1,$l=b;''<$d=("$i")[$$i++];$l=$d)$f&=$l>a||strstr([12,240,1053,26,157,2468,359,48,579,68][$l],$d)>'';echo 670;

Çevrimiçi deneyin!

1 ila 50.000 arasındaki her sayı için, bu sayının her basamağını soldan sağa doğru kontrol eder. Tüm basamaklar, önceki basamağın geçerli basamakları listesinde ise, bu numara yazdırılır. Sonunda 670 kodlu bir kod yazdı, çünkü gerçekte saymaya göre daha az bayt alıyor.


3

05AB1E , 23 bayt

ŽÅKLʒSÌYX;:3‰üαï€OP}=g=

Çevrimiçi deneyin!

Jonathan Allan Limanı'nın jöle cevabı .


1
Ah, sadece 50000'ü 3 byte'a sıkıştırmak akıllıca. Kullanıyordum ₄50*ya da 4°5*daha önce bir girişimde bulundum. Ve ilk başta neden €OPsadece sahip olduğun konusunda kafam karıştı OP, ama sonra tek basamaklı sayıların (ondan sonra boş bir liste olmak üzere üα) [] → 0 → 0bunun yerine olacağını fark ettim [] → [] → 1. :)
Kevin Cruijssen

1
@KevinCruijssen Neden 4°5*yapabiliyorsunuz 5°;? ZAK'ı daha çok seviyorum. Ve evet, tek basamaklı sayılar için bu kenar durum bir acıdır.
Grimmy

3

Perl 5 ( -M5.01), 96 , 92 bayt

@Xcali sayesinde -4 bayt

$r=join"|",map$t++."[^$_]",12,240,1350,26,157,2648,359,48,579,68;map/$r/||say,1..5e4;say 670

TIO



Gerçekten teşekkürler, aşırı karmaşık çünkü ilk cevap olumlu bir eşleşme oldu
Nahuel Fouilleul 19

3

JavaScript (SpiderMonkey) , 179 173 151 129 bayt

[12,240,1350,26,157,2468,359,48,579,68].map((_,i,l)=>i&&(f=(v,t)=>print(v)|v<5e3&&[...l[t]+''].map(k=>f(v+k,k)))(i,i)),print(670)

Çevrimiçi deneyin!

-22 byte Arnauld teşekkür -22 byte dana teşekkür

açıklama:

[12,240,1350,26,157,2468,359,48,579,68] 
// an array where keys are current position and values, the possible destinations
.map((_,i,l)=>                    // loop over it
    i&&(                          // if key is not 0
        f=(v,t)=>                 // create a function
                 print(v)|        // which print the value
                          v<5e3&& // and if the limit is not attained
                                 [...l[t]+''].map(k=>f(v+k,k)) 
                    // recurcively call itself with for each destinations
                                                              )(i,i)),
                    // make the first call with each digit
print(670) // finally print 670

@dana ayrıca 670 yazdırabilirsek 123 baytlık bir çözüm de verdi

[21,420,5310,62,751,8642,953,84,975,86].map((_,i,a)=>(f=(v,t)=>print(i?v:640)|i&v<5e3&&[...a[t]+''].map(k=>f(v+k,k)))(i,i))

@Arnauld Bu kuralı unuttum
jonatjano



İlk önce 640 basılabilirse 123 .
Dana


2

Stax , 28 26 bayt

Δh┤♣É╦&·é╝n$K»à¶▲v═NÆ;↨m≥8

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve yorumlanmış gibi görünüyor.

G               Call to unbalanced trailing '}', then resume here
670P            Print 670
}               Call target
219J            219 squared (47961)
f               Filter 1-based range by the rest of the program; implicitly output
  $2B           Convert to string and get adjacent pairs; e.g. 213 -> ["21", "13"]
  O             Push 1 under list of pairs
  F             Iterate over pairs, using the rest of the program
    o           Order each pair; e.g. "21" -> "12"
    "{<f:[/T8Z" string literal with code points [123 60 102 58 91 47 84 56 90]
    $           concate as string i.e. "12360102589147845690"
    s#          How many times does the current pair appear in the constant string?
    *           Multiply this by running total.  Any zero will cause the result to be zero.

Bunu çalıştır

Gizli sos, kelimenin tam anlamıyla "{<f:[/T8Z". Tüm kod noktalarını bir araya getirdikten sonra elde edersiniz 12360102589147845690. Bu dizgede yükselen çiftler geçerli yılan hareketleridir.


1
15JJbunun yerine 219Jiyi çalışırdı, ama 1 baytlık bir sabit olmadıkça oradan herhangi bir baytı golf oynayabileceğinizi sanmıyorum 15.
Arnauld,

2

Haskell , 118 bayt

(filter(and.(zipWith elem.tail<*>map f).show)[1..50000],670)
f c=words"12 024 0135 26 157 2468 359 48 579 68"!!read[c]

Çevrimiçi deneyin!

İlk geçiş; Sıkıştırmada iyi değilim.

s=Biz aslında sonucu bağlamak gerekmez çünkü sayılmaz.

Ungolfed kod .


1

Kömür , 42 bayt

≔ΦI…·¹×⁵⁰φ⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θθILθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

≔ΦI…·¹×⁵⁰φ

Dize geçiş 1yapmak için dahil olan aralığı işleyin 50,000.

⬤ι№”)¶∧XRτ_ΠGêR⁵m⎇λ”✂ιμ⁺²μ¹θ

Sıkıştırılmış dizede bulunmayan basamak çiftleri olanları filtreleyin 01478963202125458565236987410.

θILθ

Kalan diziyi ve uzunluğunu çıkar.



1

Perl 6 , 64 bayt

{670,grep {[+&](:36<12HGX91H8VCL3MG0FDVQ>X+>m:ov/../)%2},1..5e4}

Çevrimiçi deneyin!

açıklama

{670,grep {...},1..5e4}  # Meet questionable output requirements

# Actual decision problem

     :36<12HGX91H8VCL3MG0FDVQ>  # Bit field of allowed transitions
                                # encoded in base 36
                                 m:ov/../  # All 2-digit substrings
                              X+>  # Right shift by each substring
                                   # (implicitly converted to an integer)
[+&](                                    )  # Binary and
                                          %2  # Modulo 2

Yazık ~>, henüz uygulanmadı, aksi takdirde bunu sadece string operatörleri ile yapabilirsin, bit alanı string olsun
Jo King

1

Pyth , 68 65 45 bayt

l
f.Am}dCtB+J`65874589632012541_PJCtB`TS50000

Çevrimiçi deneyin!

Gözden geçirilmiş arama süreci için ilham kaynağı Khuldraeseth na'Barya'nın Stax cevabından geldi, onlara bir oy ver!


Düzenleme 2: Bir önceki bayt grubunu kurtarmak için yeniden yazıldı:

l
f.Am}ed@c"12 024 0135 26 157 2468 359 48 579 68";shdCtB`TS50000

Düzenleme: dize aramaları kullanarak Golfed 3 byte, önceki sürüm:

l
f.Am}ed@sMMc"12 024 0135 26 157 2468 359 48 579 68";hdCtBjT;S50000
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.