Champernowne sabitindeki sayıyı bulun


35

Giriş

10 tabanında, Champernowne sabiti, ardışık tam sayıların temsillerini birleştirerek tanımlanır. 10 no'lu tabanda: 0.1234567891011121314151617...vb.

İlk görünüşte ondalıktan 15başladığını görebilirsiniz 20th:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

İlk ondalık basamağın 45başlangıcı 4th:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

Yani, görev kolaydır. Negatif olmayan bir tamsayı verildiğinde, tamsayı Champernowne sabitindeki konumunu gösterir.

kurallar

  • Bir işlev veya program sağlayabilirsiniz
  • Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!

Test durumları

Input: 20
Output: 30

Input: 333
Output: 56

Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)

Input: 2930
Output: 48

Çalışmamız gereken en yüksek pozisyon nedir? Örneğin, numara hiç 987654321123456877654234354675 olur.
Morgan Thrapp

@MorganThrapp Muhtemelen aralıktaki tamsayıları test edeceğim 0 <= x <= 99, ancak teorik olarak daha büyük tamsayılar için çalışması gerekir 99.
Adnan

Yanıtlar:



10

LabVIEW, 29 LabVIEW İlkelleri

Bu şimdilik dizeleri kullanır. Girdiyi desen olarak eşleştirir ve ofset - (giriş uzunluğu -1) olarak çıkar.


6

Javascript, 57 bayt

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Conor O'Brien sayesinde 1 bayt kaydedildi.


Sana taşıyabilirsiniz düşünmek y=için kısmını y=b=" "; boşluk artırma, sıfır artırma gibidir. ( a=prompt(y=b=" ");...)
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Güzel buluyorum.
SuperJedi224 17-15

4

Haskell, 62 bayt

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

Kullanım örneği: (#(show=<<[1..])).show $ 2930-> 48.

Nasıl çalışır: a # bpozisyonunu bulur aiçinde b: eğer abir öneki bdönüşü 1, başka eklenti 1ile özyinelemeli çağrıya a # tail b. Pointfree işlevi (#(show=<<[1..])).show(adsız) bir argüman nve çağrılar bekler show n # show=<<[1..].

İşlev subIndexaynı zamanda işini de yapar #, ancak gereken işe import Data.List.Utilsyaramaz.


Sana ihtiyacım olduğunu sanmıyorum.show
Buğday Sihirbazı


4

Ruby, 28

->n{[*0..n+10]*''=~/\B#{n}/}

Eşleşmelerin 1 dizinli olmasını sağlamak için başlangıçta bir 0 içerir, ancak \Beşleşmenin dizenin başında olmamasını gerektirir.


4

Japt, 11 bayt

Bu başlangıçta Pyth'i yeniyordu, ama görünüşe göre girdi için işe yaramadı 0.

1+1oU+B ¬bU

Çevrimiçi deneyin!

Nasıl çalışır

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression

"Nasıl çalışır" bölümünüz neden qmantıksal olumsuzluk sembolü değil kodda içeriyor ¬?
Aralık’ta

@Fatalize ( kısaca aşağıdaki boşluğa sahip) ¬için bir kısayol . Bu genellikle bir karışıklık noktası gibi gözüküyor, bu yüzden daha kısa olanı tam sürümüyle sıraladım. q
ETH Sunumları

3

Lua, 54 Bayt

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

Not: Şu anda bu program hem dizenin ilk karakterinin ilk oluşumunu hem de bittiği noktayı yazdırır. Buna izin verilmezse, bir kaç bayta mal olur. Bonus almak istiyorum çünkü programım giriş numarasının hem ilk hem de son sırasını yazdırıyor.


1
Numaranın ilk oluşumu için başlangıç ​​endeksleri ve bitiş endeksleri mi demek istiyorsunuz? Çünkü teorik olarak bu sayı sonsuz sayıda olacaktır.
Rɪᴋᴇʀ

Evet, ilk defa başlayıp bitirin.
Nikolai97

3

MATL , 22 bayt

it10+:Yst' '=~)wYsXf1)

( i) Girişini alın, vektör 1'i + 10 ( 10+:) konumuna getirin, vektörü bir dizeye ( Ys) dönüştürün ve acı veren boşlukları kaldırın ( t' '=~)). Ardından, girişi bir dizgeye ( Ys) dönüştürün, giriş dizesinin sayı dizisinde nerede olduğunu bulun ( Xf) ve ilk konumu ( 1)) alın. tVar ve wsitesindeki yığını (sırasıyla, yinelenen ve takas) manipüle edilir.


3

PowerShell, 39 44 bayt

[Düzenleme: benim varsayımım tutmuyor, 1-0 arasında bir dizi oluşturmak, yerde 0 bulmuyor.

param($i)(1..($i+10)-join'').IndexOf("$i")+1

Her zaman bulacaksınız x eklediğinizde son noktada Champernowne sabit bir dizi oluştururken x ucuna 1-x bir dizi her zaman içinde cevap olacaktır böylece. Soru şu, "Bundan daha erken meydana geliyor mu?" . Bu kod

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

bir sayı aralığı oluşturur, onu bir dizgeye aktarır ve içindeki parametreyi arar. PowerShell nesne yönelimli bir kabuk olduğundan, parametre aslında bir [int]türdür, bu nedenle iki karakteri kaydetmeye çalışmak .IndexOf($i)dizgede bir tamsayı arar ve hiçbir şey bulamaz. Bu yüzden string enterpolasyonu kullanıyorum "$i".


1
Yapmanın akıllıca bir yolu. .IndexOf()Görünüşe göre sinir bozucu -joinparens ve tırnak zorlayan unary daha yüksek çalışma tercihi vardır sinir bozucu . : - /
AdmBorkBork

3

MATL (sürüm 1.0.1), 22 bayt

iXK10+:"@Ys]N$hKYsXf1)

Örnek

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

açıklama

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL (sürüm 20.8.0), 16 bayt (dil sonrası görevler tarihi)

Programın bu sürümü için @Giuseppe'e teşekkür ederiz (biraz değiştirilmiş)

10+:"@V]&hGVXf1)

Çevrimiçi deneyin!

açıklama

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

Bunun 0 :(
David

@David Şimdi öyle. Fark ettiğiniz için teşekkürler! Sadece 3 byte eder :-)
Luis Mendo

Şimdi panoya Ggirdi (ve örtük girdi) içeriyorsa, sanırım bu cevap epeyce kısaltılabilir ve yine de Ysdeğişmesi gerekebilir V; 10+:"@Vv]!GVXf1)16 bayt için geldim .
Giuseppe

@Giuseppe Heads-up için teşekkürler! Güncelleme, nedeniyle kredi (ve "bir dil postdates challange" notu ile; yeni kuralın büyük bir hayranı değilim )
Luis Mendo

Bu kuralı pek umursamıyorum ( bayraklar olsa beni delirtiyor); Tercümanın en güncel sürümünde kullanmak Ysiçin değiştirilmesi gerektiğini fark ettiğimden beri burada yorum yapıyordum V. Dilin ne kadar geliştiğini hep etkilendim!
Giuseppe

2

PowerShell, 54 50 Bayt

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

Döngü için döngü değiştirme fikri için TessellatingHeckler teşekkürler .whilefor

Bir fordöngü ile yürütülür . Diğer dillerde olduğu gibi, döngüdeki ilk ifade değişkenler ve atamalar oluşturabilir, bu yüzden bu $csadece boş dizgeye eşit olarak başlar, böylece ''meydanın ondalık dizini ile dizilen dizgenin sıfır dizinine sahip oluruz. Biz bir döngü içinde daha sonra olduğunuzu olup olmadığını kontrol eder $cgirdi tamsayı (vardır $argsonun içinde) bir yere (yani bu yana .IndexOf()döner -1dize bulunmazsa, biz de buna bir tane ekleyin ( 0) ve (değil $TRUE) döngü devam etmek). $iBulunmazsa, önceden arttırılmış sayaç değişkenimizi ekleriz , sonra dizgiyi tekrar kontrol ederiz . Dize bulunduğunda, .IndexOf()pozitif olmayan bir değer döndürülür.$FALSE, döngüden kopuyor. Sonunda endeksi ile çıktı $x.


Klasik bir fordöngü için ideal ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xve 1 karakter tasarruf edin. IndexOf aramalarının çoğu -1 döndüreceğinden, ona bir tane ekleyin ve boolean! Daha kısa bir test için Ama bunu yapmak için parenlere ihtiyacınız var. Mevcut parenlerdeki $ c ve +1 değerlerini boşaltın, bonus daha kısadır. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 bayt. (ama 39 byte'mı kendi cevabı olarak gönderdim, çünkü tamamen farklı bir yaklaşım: P).
TessellatingHeckler

1
@TessellatingHeckler Döngüyü yeniden yazmak için güzel bir yol - teşekkürler! $cBir noktalı virgül golf oynamak için birleştirme döngü içine taşındı . Şimdi 50'de.
AdmBorkBork

2

JavaScript (ES6), 40 bayt

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

fDöngüleri önlemek için özyinelemeli işlevi kullanır . Arama yöntemi ile aynı şekilde çalışan indexOfbu meydan okuma için alakasız bir parametre olarak bir RegExp alır dışında.

Bir durum " "için a eklenmesi n=0(JS'de sıfır yanlıştır), +ekleme yerine dize birleştirmeyi gerçekleştirmeye zorlar ve sıfır temelli dizin oluşturmayı düzeltir.



1

CJam, 11 bayt

r_i),s\#Be|

Burada test et.

1 tabanlı indeksleme için hesaba Nkatar pozisyonunu buluyorum 01234...N. Sonunda 011 ile mantıksal OR uygulayarak düzeltirim .


1

Cidden, 13 bayt

;≈9u+R`$`MΣí

Bir tamsayı olarak girdi alır. Yazdırılamaz, yani hexdump:

0c3bf739752b526024604de4a1

Çevrimiçi deneyin

Açıklama:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input


1

k4, 21 bayt

{*1+(,/$1+!10+x)ss$x}

Diğer herkesle aynı algo — [1..10+x]dizge olarak birleştirin , x'i dizge olarak arayın, tek tabanlı bir dizine dönüştürün, ilk isabeti döndürün.

Test durumlarını kontrol etmek:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b

1

Mathematica, 101 bayt

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&

1

Haskell , 82 73 55 bayt

Çoğaltmadan taşındı

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

Çevrimiçi deneyin!

açıklama

İlk önce tanımlarız !. ilk görünümüne x!bkısalır . Bunu, eğer başlıyorsa ( ) ile başlayıp başkasına döndürerek başlayıp başlamayacağınızı kontrol ederek yapar. Sonra ana işlevimizi tanımlarız. Ana fonksiyonumuz sabiti ( ) sabitleyen ve onu ilk görünümüne kesen noktasuz bir fonksiyondur . Bu bir dize olarak alır .bxbxor$zipWith(==)x bxshow=<<[1..]xx



1

JavaScript (ES6), 50 39 38 bayt

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

Dene

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>





0

Perl 5 , 42 + 1 (-p) = 43 bayt

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

Çevrimiçi deneyin!

açıklama

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer

0

Perl 6 / Rakudo 29 bayt

{$_~=$++until /(.+)$^a/;$0.chars}

Tek girişli bir fonksiyon tanımlar ($ ^ a). Arayın:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

$Anonim bir değişken ekleme , $++giriş bulunana kadar artırma $^ave ondan önceki karakter sayısını sayma. Regex'ten önce en az 1 karakter gerektirmesi .+, 0-> 0 harfini hariç tutar


0

J, 30 Bayt

{.I.(":E.[:}.' '-.~":@i.@+&11)

Muhtemelen ilk n + 10 tam sayılarını bir araya getirmede biraz daha golf oynayabilirdi.

Açıklama:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

Bunun 0 indeksli olduğuna dikkat edin. Örnekler:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55

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.