เลขศูนย์ของ Champernowne อยู่ที่ไหน


23

พิจารณาสตริงที่ไม่สิ้นสุดของจำนวนเต็มทศนิยมแบบไม่ลบทั้งหมดที่ต่อกันเข้าด้วยกันตามลำดับ (คล้ายกับค่าคงที่ของ Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในจำนวนเต็มที่ไม่ใช่ค่าลบที่ทำดัชนี (อิง 0) ลงในสตริงที่ไม่มีที่สิ้นสุดนี้ เอาท์พุทtruthyค่าถ้าหลักจัดทำดัชนีคือ 0, เอาท์พุทมิฉะนั้นfalsyค่าถ้าหลักคือ 1-9

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ปัจจัยการผลิตที่แท้จริง 25 ข้อแรกคือ:

0
11
31
51
71
91
111
131
151
171
191
192
194
197
200
203
206
209
212
215
218
222
252
282
312

ความรุ่งโรจน์ถ้าโปรแกรมของคุณมีประสิทธิภาพหน่วยความจำ แต่นี่ไม่ใช่ข้อกำหนด



มันไม่ดีกว่าว่าโปรแกรมหรือฟังก์ชั่นนั้นคืนค่าดิจิตของอาเรย์นั้นจากดัชนี [ไม่เพียงแค่นั้นถ้าเป็น 0 หรือไม่]?
RosLuP


ฉันไม่สามารถเข้าใจสิ่งที่คำถามนี้ถามได้เลยฮ่า ๆ ๆ ใครสามารถอธิบายได้
Shaun Wild

คำตอบ:



7

05AB1E , 5 ไบต์

รหัส:

ÝJ¹è_

คำอธิบาย:

Ý      # Get the list [0 .. input].
 J     # Join the list.
  ¹    # Get the first input again.
   è   # Get the character on that index.
    _  # Logical negate (0 -> 1, everything else -> 0).

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


7

Mathematica, 42 40 ไบต์

(0@@Join@@IntegerDigits@Range@#)[[#]]<1&

ฟังก์ชั่นไม่ระบุชื่อ รับตัวเลขเป็นอินพุตและส่งคืนผลลัพธ์เป็นTrueหรือFalseเป็นเอาต์พุต โซลูชันที่ยาวกว่า แต่มีประสิทธิภาพยิ่งขึ้น:

RealDigits[ChampernowneNumber[],10,1,-#][[1,1]]<1&

5

CJam, 9 ไบต์

{_),s=~!}

นี่คือบล็อกที่ไม่มีชื่อ (ฟังก์ชัน) ซึ่งใช้จำนวนเต็มและส่งคืน 0 หรือ 1 ตามลำดับ

คำอธิบาย:

{       }        Defines a block
 _               Copy input n
  ),             Increment n and take range
    s            Convert to string - for a list of numbers this concatenates
                 the digits
     =           Index, getting nth digit
      ~          Evaluate the digit character into a number
       !         Logical negation

ล่ามออนไลน์ โปรดทราบว่า~ประเมินบล็อก คุณสามารถเรียกใช้ชุดทดสอบนี้ได้ซึ่งใช้,กรองตัวเลข 1,000 ตัวแรกสำหรับค่าจริง


4

MATL 11 ไบต์

Qt:qVXzw)U~

ลองออนไลน์!

คำอธิบาย :

    % Implicitly grab input as an integer (N)
Qt  % Add 1 and duplicate
:q  % Create an array from [0 ... N]
V   % Convert each entry to a string (places spaces between each number)
Xz  % Remove all whitespace
w)  % Get the N+1 element of the string (since MATL uses 1-based indexing natively)
U~  % Convert the result back to a number and negate which yields TRUE if it was '0' and
    % FALSE otherwise

4

Brachylog , 10 8 ไบต์

2 ไบต์ต้องขอบคุณ Fatalize

y@ec:?m0

ลองออนไลน์!

y@ec:?m0

y         range from 0 to Input, inclusive,
 @e       the digits of every number in that range,
   c      concatenated
    :?m   the Input-th digit
       0  is zero.

@evectorizes y@ec:?m0ทำงานเพื่อบันทึก 2 ไบต์
ลดขนาด

@Falize ตัวดำเนินการอื่น ๆ vectorize จำนวนเท่าใด
Leun Nun

เพียง#0, #1, #+, #_, #>และ#<vectorize เหมือน@eไม่ เพรดิเคตบางส่วนที่เป็นเวกเตอร์เช่น+หรือ*ไม่ปรับเวกเตอร์ซ้ำเป็นรายการระดับต่ำสุดและไม่ทำงานแบบเดียวกันทั้งนี้ขึ้นอยู่กับโครงสร้างของอินพุต
ลดขนาด

4

Perl 6 , 26 25 ไบต์

{!+map(|*.comb,0..*)[$_]}

แลมบ์ดาที่ใช้ตัวเลขเป็น input และผลตอบแทนหรือTrueFalse

หน่วยความจำที่มีประสิทธิภาพ

มันทำงานอย่างไร

  1. 0..* - สร้างช่วงจาก 0 ถึงอินฟินิตี้
  2. map(|*.comb, )- วนซ้ำช่วงโดยแทนที่แต่ละอักขระด้วยอักขระของการแทนค่าสตริงและส่งคืนลำดับขี้เกียจใหม่ |ช่วยลำดับใหม่บี้
  3. [$_]- ใช้องค์ประกอบที่ดัชนีที่กำหนดโดย (ประกาศโดยปริยาย) $_พารามิเตอร์แลมบ์ดา
  4. +- บังคับให้เป็นตัวเลข (ขั้นตอนนี้จำเป็นเนื่องจากการบังคับสตริงโดยตรงกับบูลีนจะให้ True เสมอยกเว้นว่าสตริงนั้นว่างเปล่า)
  5. ! - บีบบังคับให้มันเป็นบูลีนและลบล้างมัน

( ลองออนไลน์ )

แก้ไข: -1 ไบต์ขอบคุณ b2gills


คุณสามารถร่นคุณเพื่อ{!+map(|*.comb,0..*)[$_]}ฉันมาด้วย{!+({|($++).comb}...*)[$_]}ก่อนที่จะมองดูว่ามีอยู่แล้วคำตอบที่ P6 !+สามารถถูกแทนที่โดย1>
แบรดกิลเบิร์ต b2gills

4

เยลลี่ 6 ไบต์

RDF⁸ị¬

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

RDF⁸ị¬  Main link. Argument: n

R       Range; yield [1, ..., n].
 D      Decimal; convert all integers in that range to base 10 arrays.
  F     Flatten the result.
   ⁸ị   Extract the digit at index n (1-based).
        This returns 0 if the array is empty (n = 0).
     ¬  Logical NOT; return 1 if the digit is 0, 0 if not.

4

Python 3.5, 40 ไบต์

lambda n:('%d'*-~n%(*range(n),n))[n]<'1'

ทดสอบบนrepl.it

มันทำงานอย่างไร

สำหรับการป้อนข้อมูลn , '%d'*-~nซ้ำสตริงรูปแบบ1 + nครั้ง

(*range(n),n)unpacks ช่วง[0, ... , n - 1]และผลตอบแทนถัวเฉลี่ย tuple (0, ... , n)

...%...แทนที่การเกิดขึ้นของแต่ละ% dกับจำนวนเต็มสอดคล้องกันในช่วงผลผลิตสตริง01234567891011 ... n

(...)[n]<'1'เลือกตัวละครที่ดัชนีnและการทดสอบถ้ามันเป็นน้อยกว่าตัวละคร1


3

Python 3, 44 ไบต์

lambda n:''.join(map(str,range(n+1)))[n]<'1'

ฟังก์ชันที่ไม่ระบุตัวตนที่รับอินพุตผ่านอาร์กิวเมนต์และส่งคืนTrueหรือFalseตามความเหมาะสม

มันทำงานอย่างไร

lambda n      Anonymous function with input n
range(n+1)    Yield the range [0, n]...
map(str,...)  ...convert all elements to string...
''.join(..)   ...concatenate...
...[n]        ...yield nth character...
:...<'1'      ...return True if int(character)==0 else return False

ลองใช้กับ Ideone


3

Pyth, 8 7 ไบต์

ขอบคุณ @LeakyNun สำหรับ -1 ไบต์

!s@jkUh

นี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟที่ Pyth

โปรแกรมเต็มรูปแบบที่พิมพ์TrueหรือFalseตามความเหมาะสม

ลองออนไลน์

อินพุต 25 ความจริงแรก

มันทำงานอย่างไร

!s@jkUh    Program. Input: Q
      hQ   Head. Yield Q+1
     U     Unary range. Yield [0, Q]
   jk      Join. Join on empty string
  @     Q  Index. Yield string[Q]
 s         Integer. Convert to integer
!          Logical negation. 0 -> True, all other digits -> False
           Print. Print result implicitly

3

SILOS , 141 ไบต์

readIO
i+1
lblL
c=C
p=1
lblc
p*10
c/10
if c c
p/10
lbln
m=C
m/p
m%10
p/10
i-1
if i C
GOTO H
lblC
if p n
C+1
GOTO L
lblH
m/m
m-1
m|
printInt m

ลองออนไลน์!

ใช้จำนวนเต็ม 5 ตัวเท่านั้นประสิทธิภาพหน่วยความจำสูงสุด \ o /

คำอธิบาย

เราสร้างตัวเลขให้มากที่สุดเท่าที่อินพุตในค่าคงที่ของ Champernowne

ในลูปหลักเราทำสิ่งต่อไปนี้:

  • ค้นหาความยาวของหมายเลขปัจจุบันโดย floor_dividing จำนวน 10 ซ้ำ ๆ จนกระทั่งถึง 0 จากนั้นนับจำนวนแผนกที่ใช้
  • แทนที่จะเก็บจำนวนส่วนเราเก็บ 10 ถึงจำนวนนั้นแทน
  • วนซ้ำตามแต่ละหลักเช่น: จำนวน100หลักของ1234ได้มาจาก(1234/10)%10ตำแหน่งที่การ/แบ่งพื้น
  • สำหรับแต่ละหลักที่สร้างขึ้นใช้ 1 จากอินพุตขณะตรวจสอบว่าอินพุตถึงศูนย์หรือไม่
  • หากอินพุตถึงศูนย์ให้ตรวจสอบว่าตัวเลขปัจจุบันเป็น 0 แล้วหยุดพัก

3

JavaScript (ES6), 45 ไบต์ + รุ่งโรจน์

f=(n,s='0')=>s[n]?!+s[n]:f(n-s.length,-~s+'')

รุ่นที่ไม่ใช่ Kudos ที่ดีที่สุดของฉันคือ 34 ไบต์:

n=>!+(g=s=>s[n]||g(s+i++))('',i=0)

1
ฉันคิดว่ารุ่งโรจน์เป็นห้องสมุดจนกว่าฉันจะรู้ว่ามีความรุ่งโรจน์ในความท้าทาย: P
Conor O'Brien



1

Groovy ขนาด 56 ไบต์

def f(n){def s=''<<'';(0..n).each{s<<it};!(s[n] as int)}

ไม่มีอะไรแฟนซี แต่ฉันได้ลองสิ่งใหม่ ๆ

def f(n) {
  def s = ''<<''           // declare a StringBuffer
  (0..n).each { s << it }
  !(s[n] as int)           // Groovy considers a non-null char truthy, so we have to cast 
}

1

Perl, 24 ไบต์

รวม +1 สำหรับ -p

รันด้วยอินพุตบน STDIN:

zero.pl <<< 31

พิมพ์ 1 สำหรับศูนย์ไม่มีอะไรเป็นอย่างอื่น

zero.pl

$_=!(map/./g,0..$_)[$_]


1

ทับทิม, 35 23 ไบต์

นี่เป็นฟังก์ชั่นนิรนามที่เชื่อมโยง[0..n]รับnดัชนี th และตรวจสอบว่าถ่านนั้นเป็น"0"(น้อยกว่า"1") ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

->n{([*0..n]*'')[n]<?1}

Ungolfing

->n{...}   # Create an anonymous function with parameter n.
[*0..n]    # Create an array of the range [0..n].
[...]*''   # Join the array using the empty string.
(...)[n]   # Take the char at the n-th index of the string.
<?1        # Check if the char is < "1" (that is, "0").

1

ที่จริงแล้ว9 8 ไบต์

คำตอบนี้เชื่อมช่วง[0..n]จะใช้เวลาnดัชนี TH "0"และการตรวจสอบถ้าถ่านที่เป็น ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

;urεjE≈Y

Ungolfing

;          Duplicate n
 ur        Increment the duplicate and create range [0..n].
   εj      Join the range with an empty string. Stack: <string> n
     E     Take the char at the n-th index.
      ≈    int(a)
       Y   Logical NOT. If the digit is 0, then return 1, else return 0.

1

Bash, 31 28 ไบต์

seq -s "" 0 $1|egrep ^.{$1}0

เอาต์พุตไม่ว่างเปล่า (จริง) หรือว่างเปล่า (เป็นเท็จ) ทดสอบบนIdeone



1

R, 61 57 ไบต์

ขอบคุณ @plannapus สำหรับ 4 ไบต์

n=scan();strsplit(paste(0:n,collapse=""),"")[[1]][n+1]==0

สร้างเวกเตอร์ของตัวเลข 0: n (สำหรับการทำดัชนี 0) สร้างสตริงของพวกเขาดึงค่า nth จากสตริง (ปรับสำหรับการทำดัชนี 0) แปลงเป็นตัวเลขและทดสอบว่าเป็น 0 หรือไม่



0

C, 154 ไบต์

s(n,v,k,z){for(k=1;(z=n%10,n/=10)&&!v||k<v;++k); return v?z:k;}
f(n,i,j,c){for(i=0,j=0;;++i){c=s(i,0,0,0);j+=c;if(j>n){c=s(i,j-n,c,0);break;}}return !c;}

ฟังก์ชันที่คำนวณค่าคือ f (n, 0,0,0) โดยที่ n คือดัชนีอินพุต มันสามารถคำนวณได้จากการเปลี่ยนดัชนี "return! c" ใน "return c" มูลค่าของอาร์เรย์ในดัชนีนั้น ... ฉันไม่เข้าใจว่า แต่ดูเหมือนจะทำงาน ok ....

main()
{int   i,r;
 char  a[]="0123456789101112131415161718192021222324252627282930313233343536";

 for(i=0; i<1000; ++i) 
    if(r=f(i,0,0,0))  
        printf("%u|",i);
}
/*
 154
 0|11|31|51|71|91|111|131|151|171|191|192|194|197|200|203|206|209|212|215|218|222
|252|282|312|342|372|402|432|462|491|492|494|497|500|503|506|509|512|515|518|522|552
|582|612|642|672|702|732|762|791|792|794|797|800|803|806|809|812|815|818|822|852
|882|912|942|972|
*/

0

Javascript (ES5): 61 60 ไบต์

function(b){for(s="";s.length<b;)s+=s.length;return 0==s[b]}

Ungolfed:

function a(b){
  for(var s="";s.length<b;)
    s+=s.length;
  }
  return (s[b]==0);
}

เก่า:

function(n){s="";while(s.length<n)s+=s.length;return s[n]==0}

อายุเก่าแก่:

function a(n){
  var str="";
  while(str.length<n)str+=str.length; //Create String as long as needed
  return str[n]==0 //Check for 0 and return
}

แล้วจะ!s[n]เป็นs[n]==0อย่างไร
Conor O'Brien

@ ConorO'Brien ใช้งานไม่ได้สำหรับฉัน ฟังก์ชั่นของฉัน a ส่งคืน a (31) = true ในขณะที่คุณ ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) ส่งคืน a (31) = false
พอลชมิทซ์

ฮึ่ม ความผิดพลาดของฉัน.
Conor O'Brien



0

C #, 71 ไบต์

และฉันคิดว่ามันสั้นในตอนแรก แต่จากนั้นฉันต้องเพิ่มn+=11เพื่อป้องกันไม่ให้ขว้างSystem.IndexOutOfRangeExceptionเมื่อตัวเลขที่ต่ำกว่า 11 เป็นอินพุต

return String.Join("",Enumerable.Range(0,n+=11).ToArray())[n]=='0'?1:0;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.