ตัวเลขที่ไม่สามารถบรรยายได้ของคันทอร์


58

ตัวเลขที่ไม่สามารถบรรยายได้คือตัวเลขซึ่งหารด้วยเจ็ดหรือมีเจ็ดเป็นหนึ่งในหลัก เกมสำหรับเด็กคือการนับจำนวนที่ข้ามไม่ได้

1 2 3 4 5 6 ( ) 8 9 10 11 12 13 ( ) 15 16 ( ) 18 ...

เวอร์ชั่นของคันทอร์ของเกมคือลำดับที่กำหนดโดยการกรอกข้อมูลแบบวนซ้ำ "1 2 3 4 5 6 () 8 ... " ลงในช่องว่าง () ด้านบน

1 2 3 4 5 6 1 8 9 10 11 12 13 2 15 16 3 18 19 20 4 22 23 24 25 26 5 6 29 30 31 32 33 34 1 36 8 38 ...

พิมพ์ / ส่งออกอย่างน้อย 7 ^ 7 หมายเลขแรกของเกมตัวเลขที่ไม่สามารถบรรยายได้ของ Cantor ...

ในขณะที่คำจำกัดความจะได้รับซ้ำคุณไม่จำเป็นต้องใช้การสอบถามซ้ำในรหัส

นี่คือดังนั้นโปรแกรมที่มีจำนวนไบต์สั้นที่สุดจะเป็นผู้ชนะ!

หมายเหตุ: ผลรวมของตัวเลขใน 1 ถึง 7 ^ 7 คือ 203511962727 ตัวเลข 10 ตัวสุดท้ายในช่วงนั้นคือ 823534 823535 221563 108068 823538 823539 823540 823541 823542 221565

การถ่ายโอนข้อมูลของ Pastebin สำหรับ 1,000 ครั้งแรกซ้ำ: http://pastebin.com/Ksiu9Svf


8
โปรดระบุหมายเลข 7 ^ 7 แรกของลำดับนั้นเพื่อให้เราสามารถตรวจสอบการแก้ปัญหาของเรา
ข้อบกพร่อง


2
ในกรณีที่ทุกคนต้องการที่จะสร้างตัวเลขบางมากขึ้นและเปรียบเทียบผล: ผลรวมของคนแรกที่ 7 ^ 77 ตัวเลขในลำดับคือ 3336402440238885119980169136020683586413168645292341926482898521634332654984279162327502549917668322950744929983987545341421076028
คลาสบี

แน่นอนว่าจำนวนของ 1 ในลำดับนั้นคือ 22977 ซึ่งหมายความว่าถ้าคุณเลือกองค์ประกอบจาก 7 ^ 77 ครั้งแรกโดยการสุ่มคุณมีโอกาส 2 * 10 ^ -61 เป็น 1
Niklas B.

1
ในกรณีที่คุณสนใจนี่คือกราฟแสดงการเติบโตของจำนวนซ้ำ: drive.google.com/file/d/0B71iQwGfNtw5NGladjdOZVhoNkk/ …
Niklas B.

คำตอบ:


6

Pyth , 25 23 22 ไบต์

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

.V1=+Y
?}7+PbjbT@Y~hZb

โปรแกรมที่พิมพ์สตรีมไม่สิ้นสุด

ลองออนไลน์! (เอาต์พุตจะถูกลบทิ้งเป็นช่วงและหมดเวลา 1 นาที)

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

.V1=+Y
?}7+PbjbT@Y~hZb

Z = 0, Y = []    Implicit variable assignment
.V1              Infinite incrementing for loop with variable b, starting at 1:
   =+Y            Y = Y +
(newline)          (Implicitly print the result of the following:)
?                   If
 }7                  7 is in
    Pb                the prime factorisation of b
   +                  or
      jbT             the digits of b:
         @Y            Index into Y at index
             Z          Z
           ~h          (Increment Z)
                    else:
              b      b

1
23 ไบต์ มันทำงานได้ดีเพราะ7มันเป็นเรื่องสำคัญดังนั้นการหารสามารถทำได้ผ่านการตรวจสอบการแยกตัวประกอบเฉพาะซึ่งเหมาะกับการตรวจสอบอื่น ๆ
Maltysen

คุณสามารถโพสต์ได้ซึ่งเป็นส่วนหลักของคุณ
Maltysen

1
ขอแสดงความยินดีที่ชนะการประกวดครั้งนี้ ฉันชอบเคล็ดลับของ @Maltysen ด้วย!
mschauer

23

Python 2, 77 75 74 70 ไบต์

ต้องขอขอบคุณสำหรับการแนะนำ @MartinEnder ขีด จำกัด ของ9e5ซึ่ง Ende Rวันที่ผ่านมาทำงานหลังจากการเปลี่ยนแปลง
ขอบคุณ @mschauer ที่แนะนำสตรีมแบบไม่ จำกัด ให้บันทึก 4 ไบต์

def f(n=0):
 i=f()
 while 1:n+=1;yield next(i)if'7'in`n`or n%7<1else n

นี่คือเครื่องกำเนิดไฟฟ้าที่ให้จำนวนกระแสที่ไม่สิ้นสุด


คุณไม่สามารถลบขอบเขตบนทั้งหมดได้หรือไม่
mschauer

@mschauer ขอบคุณไม่คิดอย่างนั้น
PurkkaKoodari

if n%7<1or'7'in`n`else nอาจจะเร็วกว่าเล็กน้อย (นับเป็นไบต์เดียวกัน) เนื่องจากn%7<1เร็วกว่าการตรวจสอบสตริงและorมีการลัดวงจร มันเลวร้ายเกินไปที่yield[n,next(i)][n%7<1or'7'in`n`]จะไม่ทำงาน
mbomb007

@ mbomb007 ฉันไม่คิดว่าความเร็วเป็นปัญหาที่นี่ แต่ขอบคุณ :)
PurkkaKoodari

10

Perl, 47 46 41 39 ไบต์

บันทึก 5 ไบต์ด้วย @Dada

say$_=$_%7*!/7/?$_:$a[$b++]for@a=1..1e6

ลองออนไลน์! TIO Nexus ตอนนี้พร้อมรองรับ Perl! สิ่งนี้จะตัดทอนผลลัพธ์หลังจากผ่านไประยะหนึ่ง แต่ถ้าคุณติดตั้ง Perl ไว้คุณสามารถเรียกใช้ภายในเครื่องเพื่อสร้างเอาต์พุตเต็ม

โค้ดใช้ประโยชน์จากไวยากรณ์แปลก ๆ ของ Perl ดังนั้นฉันจะแยกแยะวิธีการทำงานด้านล่าง

การวิเคราะห์รหัส:

say$_=$_%7*!/7/?$_:$a[$b++]for@a=1..1e6
                              @a=1..1e6 #Assign the range (1..1,000,000) to the array @a
                           for          #and then loop through this list, with $_ as an alias for the list member.  As an alias, modifying $_ modifies @a.
      $_%7*!/7/?$_:$a[$b++]             #Ternary operation
      $_%7                              #Returns the residue modulo 7...
          *!/7/                         #...and multiplies it by the negation of whether or not there exists a 7 $_
                                        #Since % and * have the same operator precedence, it must be evaluated in this order
                                        #otherwise we would get (!/7/*$_)%7 instead of ($_%7)*!/7/
               ?$_                      #If the result is non-zero (i.e. truthy), then return $_
                  :$a[$b++]             #Otherwise, return the $b-th element of @a, and increment $b
   $_=                                  #Reassign the result back to $_, modifying @a
say                                     #Prints the result of the assignment, separated by newlines

1
say$a[@a]=$_=...เพื่อชนะ 2 ไบต์ถ้าฉันไม่เข้าใจผิด
Dada

@Dada จริง ๆ แล้วตั้งแต่ที่ช่วยฉันจากการกำหนดให้$_มันช่วยฉัน 5 ไบต์ ขอบคุณ!
Gabriel Benamy

1
โอ้แน่นอนฉันเพิ่งมีลักษณะอย่างรวดเร็วและไม่ได้สังเกตเห็นการกำหนดที่อยู่ตรงกลาง .. งานที่ดี :)
Dada

ในขณะนี้ (และช่วงเวลานี้เท่านั้น!) ที่ฉันเข้าใจคำว่า "Perl สามารถเป็นภาษาเขียนได้อย่างเดียว"
haneefmubarak

@Grimy โปรดอย่าแก้ไขรหัสอื่น ๆ หากคุณต้องการปรับปรุงคำตอบให้เพิ่มความคิดเห็นรวมถึงการปรับปรุงหรือโพสต์คำตอบของคุณเอง ในขณะที่คุณอาจจะไม่ถึง OP ด้วยความคิดเห็นเพียงโพสต์คำตอบของคุณเอง
ovs

5

PHP, 80 (Wahooka) 57 54 ไบต์

ในขณะที่ความคิดนั้นมาจาก Wahooka ฉันคิดว่าเวอร์ชันของฉันแตกต่างกันมากพอที่จะทำให้เป็นคำตอบของตัวเอง:

for(;;)echo$a[]=strpos(++$n,55)<-$n%7?"$n ":$a[+$b++];

5

Haskell, 67 66 ไบต์

i#x|mod x 7<1||'7'`elem`show x=f!!i:(i+1)#(x+1)|y<-x+1=x:i#y
f=0#1

f เป็นรายการที่ไม่มีที่สิ้นสุดของตัวเลข

ลองออนไลน์!

fเริ่มต้นการทำซ้ำใหม่ด้วย1และดัชนีที่จะเลือกหมายเลข 0 เมื่อใดก็ตามที่มีช่องว่างเราจะทำการเลือกการทำซ้ำใหม่เป็นithองค์ประกอบและดำเนินการทำซ้ำในปัจจุบันi+1ต่อไป หากมีช่องว่างไม่มีเราใช้หมายเลขปัจจุบันและต่อไปโดยไม่ต้องเพิ่มxi

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


4

MATL , 26 25 ไบต์

9e5:`t7\yFYA!7-A*~s:2M(2M

ลองออนไลน์! ด้วย9e5แทนที่ด้วย9e4ดังนั้นเวลาในการทำงานสูงสุดและขนาดเอาต์พุตของคอมไพเลอร์ออนไลน์ไม่เกิน

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

ใช้การวนซ้ำแทนการเรียกซ้ำ (ที่จริงแล้ว MATL ไม่มีการเรียกซ้ำ)

อาร์เรย์ของตัวเลขจาก1ถึง9e5ถูกสร้างขึ้นครั้งแรก (ซึ่งเพียงพอเนื่องจาก9e5เกิน7^7) จากนั้นตัวเลขที่มีหลายรายการ7หรือมี7เป็นหลักจะมีการระบุและถูกแทนที่ด้วย1, 2... กระบวนการนี้ซ้ำจนกว่าจะมีตัวเลขที่ไม่ต้องมีการเปลี่ยน

9e5:       % Generate array of numbers [1 2 ... 9e5]. This array will become the
           % output, after some numbers have been replaced
`          % Do...while
  t        %   Duplicate the array of numbers
  7\       %   Modulo 7. Gives zero for multiples of 7
  y        %   Duplicate the array of numbers
  FYA!     %   Matrix of decimal digits, with a column for each number
  7-       %   Subtract 7 to each entry of that matrix
  A        %   Array that contains "true" for columns that only contain nonzeros;
           %   that is, for numbers that do not have 7 as digit 
  *        %   Multiply. This corresponds to a logical "and" of the two conditions.
           %   A zero indicates that the number at that index needs to be replaced
  ~        %   Logical negate. Each "true" corresponds to a number to be replaced
  s        %   Sum. This is the amount of numbers to be replaced, say n
  :        %   Push array [1 2 ... n]
  2M       %   Push array of logical values again
  (        %   Replace the numbers at the positions indicated by the logical array
           %   by the values [1 2 ... n]
  2M       %   Push n again. This is used as loop condition, so if it is nonzero
           %   the next iteration will be executed. Note that this executes one
           %   too many iterations: the exit condition is that no replacing has
           %   been needed in the current iteration; but then the current iteration 
           %   (which will be the last) was not really necessary. This does not
           %   matter; the last iteration is useless but also harmless
           % End do...while implicitly. Display implicitly

3

Tcl , 121 ไบต์

วิธีแก้ปัญหาเล็กน้อยโดยใช้ลูปไม่ จำกัด ไม่มีอะไรแฟนซี ..

set r 0;set n 0;while {[set r [expr $r+1]]} {if {![expr $r%7]||(7 in[split $r ""])} {puts [set n [expr $n+1]]} {puts $r}}

Ungolfed:

set r 0
set n 0
while {[set r [expr $r+1]]} {
  if {![expr $r % 7] || (7 in [split $r ""])} {
    puts [set n [expr $n+1]]
  } {
    puts $r
  }
}

incrคุณสามารถใช้ และหากเวอร์ชัน tcl> = 8.6 ให้incrถือว่าการวนซ้ำครั้งแรกเป็นการเพิ่มขึ้นของตัวแปรใหม่จาก0เป็น1หากไม่ได้ตั้งค่าตัวแปรนั้นไว้ก่อน เพื่อให้คุณสามารถกำจัดsetคำแนะนำสองข้อแรกได้
sergiol

golfed โดยฉัน - ฉันลบบางพื้นที่สีขาวที่ไม่ต้องการ
sergiol

เว็บไซต์ที่ฉันโพสต์คำแนะนำการเล่นกอล์ฟของคุณสำหรับคุณได้สูญเสียพวกเขาดังนั้นฉันจึงได้คำตอบใหม่ของฉัน
sergiol

3

PHP, 106 80 ไบต์

ขอขอบคุณ Ismael Miguel สำหรับความช่วยเหลือเกี่ยวกับวิธีแก้ปัญหาแบบไตรภาคและรหัสวนรอบที่สั้นลงซึ่งใช้แทนในขณะนั้น

ไม่สามารถตรวจสอบส่วนสุดท้ายของลำดับเต็มได้เนื่องจากรันไทม์สูงสุด 30 วินาทีของ PhpFiddle ดูเหมือนว่าจะทำงานอย่างน้อยมากถึง 1K ขึ้นอยู่กับเอาต์พุตตัวอย่างที่ได้รับจาก OP

กอล์ฟ:

for($n=1;;$n++)echo$a[]=!(strpos($n,"7")>-1||$n%7==0)?"$n ":array_shift($a)." ";

รุ่น golfed ดั้งเดิม :

$n=1;while(1){if(!(strpos($n,"7")>-1||$n%7==0)){echo$a[]=$n." ";}else{echo$a[]=array_shift($a)." ";}$n++;}

1
for($n=1;;$n++)echo$a[]=!(strpos($n,7)>-1||$n%7==0)?"$n ":array_shift($a)." ";ฉันไม่ทราบจำนวนไบต์ แต่ฉันแน่ใจว่ามันต่ำกว่า 106 ไบต์มาก ลองใช้ดูว่าใช้ได้ไหม
Ismael Miguel

ดีมากขอบคุณสำหรับความช่วยเหลือ การแก้ไขโค้ดของคุณเพียงอย่างเดียวคือการใส่ 7 รายการแรกในใบเสนอราคาซึ่งเพิ่มสองไบต์ในเวอร์ชัน 78 ไบต์ของคุณ
Wahooka

คุณสามารถบันทึก 3 for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";ไบต์หรือดังนั้นด้วยการทำ ฉันไม่แน่ใจว่าคุณสามารถแทนที่$n%7==0ด้วย!$n%7แต่มันคุ้มค่าลอง
Ismael Miguel

1
ดำเนินการต่อไป -6: $ n = 0 ไม่มีประโยชน์, "7" สามารถเป็น 7 ได้
Crypto

1
ทำไมต้องเปลี่ยน? for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];(58 ไบต์) ++$b-1เพราะ$a[null] === null
Christoph

3

จูเลีย 62 ไบต์

x=[];j=0;for i=1:7^7;x=[x;i%7<1||('7' in "$i")?x[j+=1]:i]end;x

ไม่มีอะไรแฟนซี ใช้ว่าลำดับภายในช่องว่างเป็นลำดับเอง ทำสำเนาอาร์เรย์มากเกินไปเพื่อบันทึกบางไบต์


3

Perl 6 ,  74 57 54  53 ไบต์

sub u{my@u;(1..*).map: {if $_%%7||.comb('7') {@u||=u;@u.shift} else {$_}}}
sub u{(1..*).map: {$_%%7||.comb('7')??(@||=u).shift!!$_}}
sub u{map {$_%%7||.comb('7')??(@||=u).shift!!$_},1..*}
sub u{map {$_%%7||.comb(~7)??(@||=u).shift!!$_},1..*}

ลองมัน

ขยาย:

sub u{
  map             # for each element transform using:

  { # bare block lambda with implicit parameter 「$_」

      $_ %% 7     # if it is divisible by 7
      ||          # or
      .comb(~7)   # contains the number 7 (implicit method call on 「$_」)

    ??            # then
      ( @ ||= u ) # store a new instance of the Seq into an unnamed state array if it is empty
                  # ( it is only empty the first time it is seen in this Seq instance )
      .shift      # pull one off of the front

    !!            # else
      $_          # return the value
  },

  1 .. *          # infinite range starting at one ( elements to be mapped over )
}

ทดสอบ:

$ time perl6 -e'sub u{map {$_%%7||.comb(~7)??(@||=u).shift!!$_},1..*};put 203511962727 == sum u()[^7**7]'
True

real    2m45.744s
user    2m45.416s
sys     0m0.212s

ดูเหมือนว่าคุณจะสามารถประหยัดไบต์โดยพูดแทน~7 '7'
Sean

2

Ceylon, 202 ไบต์

object u satisfies{Integer*}{iterator()=>object satisfies Iterator<Integer>{variable value i=0;late Iterator<Integer>n;next()=>if(++i%7<1||'7'in"``i``")then(i<8then(n=iterator())else n).next()else i;};}

นี่ไม่ใช่ฟังก์ชั่น แต่เป็นการประกาศวัตถุที่ใช้ลำดับไม่สิ้นสุด (Iterable) วัตถุสามารถพิมพ์โดยตรงprint(u)ส่งออกสิ่งนี้:

{ 1, 2, 3, 4, 5, 6, 1, 8, 9, 10, 11, 12, 13, 2, 15, 16, 3, 18, 19, 20, 4, 22, 23, 24, 25, 26, 5, 6, 29, 30, ... }

printAll(u)ในการพิมพ์มากขึ้นการใช้งาน รหัสต่อไปนี้ใช้การขึ้นบรรทัดใหม่และพิมพ์ผลรวม (และองค์ประกอบ 30 รายการแรกที่แสดงด้านบน):

shared void run() {
    printAll(u.take(7^7), "\n");
    print(sum({0, * u.take(7^7)}));
    print(u);
}

นี่คือเวอร์ชันที่ไม่น่ารังเกียจและแสดงความคิดเห็น:

// Prints cantor's unspeakable numbers.
//
// Question:  http://codegolf.stackexchange.com/q/101231/2338
// My answer: http://codegolf.stackexchange.com/a/101297/2338

// this object u (which is like a singleton class with its single instance)
// implements the Iterable<Integer> interface.
object u satisfies {Integer*} {
    // That interface has just one formal method,
    // `shared formal Iterator<Integer> iterator()`.
    // Lets implement it by ...
    iterator()
    // ... providing for each call ...
            =>
                // ... a new (anonymous) object, which
                // implements the Iterator<Integer> interface.
                object satisfies Iterator<Integer> {
                    // This is the counter (the type `Integer`
                    // is longer than `value`, so we infer it).
                    // We start at 0.
                    variable value i = 0;
                    // This is a nested Iterator. It will be
                    // initialized when first needed, so we don't
                    // get an endless recursion when creating the
                    // first iterator.
                    late Iterator<Integer> n;
                    // `shared formal Integer next()` is the single method
                    // of Iterator which needs to be implemented.
                    next()
                    // each time it is called, the following
                    // expression will be evaluated.
                            =>
                                // increment the counter, then check if it
                                // is an unspeakable number.
                                if (++i % 7 < 1 || '7' in "``i``")
                                then
                                    // if so, take the nested iterator (and the
                                    //  first time, for i == 7, create it first),
                                    // and take its next element.
                                    (i < 8 then (n = iterator()) else n).next()
                                else
                                    // otherwise, just return i.
                                    i;
                };
}

2

Ruby, 80 ไบต์

l=->x{x%7==0||x.to_s[/7/]};a=(1..100);b=a.reject &l p a.map{|x|!l[x]?x:b.shift}

การส่งครั้งแรกฉันแน่ใจว่าสามารถปรับปรุงได้ :)


1
ยินดีต้อนรับสู่ PPCG! สิ่งนี้เพิ่มขึ้นอย่างน้อย 7 ^ 7 (เช่น 823543) และเป็นตัวเลขที่มีตัวเลข 7 หรือ 17 หรือไม่
ETHproductions

มันไม่แน่ใจ แก้ไขแล้ว คิดว่าปัญหาที่เป็นเพียงเล็กน้อย :) ง่ายเกินไป
คริสโต Lates

ดี แต่ฉันไม่แน่ใจว่ามันมีคุณสมบัติ จำนวนหลัง34(ซึ่ง8ในปัจจุบัน) ที่ควรจะเป็น7แต่เพราะเป็นเลขเลวโปรแกรมควรเริ่มต้นการทำซ้ำที่สามและการพิมพ์แทน7 1
ETHproductions

2

Dyalog APL ขนาด 39 ไบต์

{(⍵⍴⍨⍴i)@(i←⍸('7'∊¨⍕¨⍵)∨0=7|⍵)⊢⍵}⍣≡⍳7*7

⍳7*7คือ 1 2 3 ... 7 7

{ }⍣≡เป็นผู้ดำเนินการจุดคงที่ - ใช้ฟังก์ชั่นซ้ำ ๆ จนกว่าผลลัพธ์จะคงที่

A@I⊢B แก้ไขผู้ประกอบการ - เปลี่ยนองค์ประกอบที่ดัชนีIในBด้วยA

0=7|⍵ bitmask สำหรับที่อาร์กิวเมนต์สามารถหารได้ด้วย 7

'7'∊¨⍕¨⍵ bitmask สำหรับที่การจัดรูปแบบทศนิยมของอาร์กิวเมนต์ประกอบด้วย 7

หรือ

ดัชนีใดที่ bitmasks ข้างต้นเป็นจริง

i← มอบหมายให้ i

⍵⍴⍨⍴i ก่อร่างใหม่อาร์กิวเมนต์เป็นจำนวนขององค์ประกอบใน i


นี่เป็นสิ่งที่ดี มันช่วยได้ไหมถ้าคุณคูณ⍳7 * 7 ด้วย bitmask และหา fixpoint เพื่อแก้ไขค่าศูนย์ตามลำดับ?
mschauer

2

C 157 155 ไบต์

int c[999999],r;main(_,p){if(_){p=--_;c[_]=1;for(;;){printf("%d ",c[_]);main(0,++_+1);c[_]=r?_+1:c[p++];}}else!p?r=1:p%7?p%10-7?main(0,p/10):(r=0):(r=0);}

มันดูถูกต้องฉันไม่ได้สนใจที่จะตรวจสอบอย่างเต็มที่ เพิ่มขึ้นถึง 999999 ซึ่งมีขนาดใหญ่พอ

เวอร์ชันที่ไม่ถูกปรับแต่ง:

int cantor_n[1000000];

int cantor_n_safe(int x) {
    if (!x) return 1;
    if (x % 7 == 0) return 0;
    if (x % 10 == 7) return 0;
    return cantor_n_safe(x / 10);
}

int main(_, prev_index) {
    prev_index = --_;
    cantor_n[_] = 1;
    for(;;) {
        printf("%d ", cantor_n[_]);
        _++;
        if (!cantor_n_safe(_+1)) {
            cantor_n[_] = cantor_n[prev_index++];
        } else {
            cantor_n[_] = _+1;
        }
    }
    return 0;
}

รุ่น golfed บางส่วน:

int c[999999];int r;
safe(x){ 
    !x?
        r=1:
        x%7?
            x%10-7?
                safe(x/10):
                (r=0):
            (r=0);
}

main(_){
    int p;
    p=--_;
    c[_]=1;
    for(;;){
        printf("%d ",c[_]);
        safe(++_+1);
        if (!r) {
            c[_]=c[p++];
        } else {
            c[_]=_+1;
        }
    }
}

คุณต้องการเครื่องมือจัดฟันelseไหม?
Zacharý

ฉันไม่ขอบคุณ ฉันไม่จำเป็นต้องใช้เครื่องมือจัดฟันในทางเทคนิค(r=0)เกือบตลอดเวลา แต่คอมไพเลอร์บางคนจู้จี้จุกจิก ฉันขี้เกียจเกินไปที่จะตรวจสอบข้อมูลจำเพาะตอนนี้
LambdaBeta

2

R, 86 ไบต์

x=1;while(T<7^7){T=T+1;x[T]=if(!T%%7|7%in%el(strsplit(c(T,""),""))){F=F+1;x[F]}else T}

ใช้ Truthy ในตัวของ R T(กำหนดค่าเริ่มต้นเป็นTRUE/ 1) เพื่อนับจำนวนในลำดับและค่า Falsy F(กำหนดค่าเริ่มต้นเป็นFALSE/ 0) เพื่อนับจำนวนที่ไม่สามารถบรรยายได้ นอกเหนือจากนั้นโปรแกรมเพียงแค่ตรวจสอบว่าแต่ละหมายเลขหารด้วยเจ็ดหรือมีหมายเลข


-4 ไบต์แทนที่7%in%el(strsplit(c(T,""),""))โดย55%in%utf8ToInt(paste(T))? (ไม่ผ่านการทดสอบ)
JayCe

2

C - 115 ไบต์

s[99],r;g(x){return x%10-7&&(!x||g(x/10));};f(i){(r=++s[i])%7&&g(r)||f(i+1);}main(){for(;;f(0),printf("%d\n",r));}

แก้ไข: ขอบคุณ @mschauer ที่ชี้ให้เห็นว่าฉันพลาดบางสิ่ง


วิธีการที่ดี สองข้อสังเกต r% 10-7 จับเพียงแค่ sevens ที่ต่อท้ายและไม่ทำให้กองของคุณเสียหาย: ความลึกของสแต็คเพิ่มขึ้นแบบ polynomially ... s [99] ปลอดภัย
mschauer

2

Javascript, 80 ไบต์

n=[]
r=l=>(m=n[l]=++n[l]||1,!/7/.test(m)m%7?m:r(l+1))
for(;;)console.log(r(0))

เนื่องจากมีข้อกำหนดขั้นต่ำเพียงอย่างเดียว แต่ไม่ใช่ข้อกำหนดขั้นสูงสุดโซลูชันนี้จะแสดงผลต่อไปเรื่อย ๆ

ในการตรวจสอบว่าอัลกอริทึมนั้นถูกต้องคุณสามารถสั่งพิมพ์รหัสเดียวกันได้เฉพาะ 10 หมายเลขสุดท้ายและผลรวม:

n = []
r = l => (m = n[l] = ++n[l] || 1, !/7/.test(m) && m % 7 ? m : r(l + 1))
var tot = 0
for (i = 0; i + 1; i++) {
    v = r(0)
    tot += v
        if (i > Math.pow(7, 7) - 11) {
        console.log(v)
    }
    if (i === Math.pow(7, 7) - 1) {
        console.log(tot)
        break
    }
}

SyntaxError: หายไป) ในวงเล็บ
l4m2


1

จาวาสคริปต์ 81 ไบต์

ดั้งเดิม (98 ไบต์)

for(c=0,i=1;i<=Math.pow(7,7);i++)/7/.test(i)||i%7==0?(6==c?c=1:c++,console.log(c)):console.log(i);

แข็งแรงเล่นกอล์ฟ

p=console.log;for(c=0,i=1;i<9e5;i++)/7/.test(i)||i%7==0?(6==c?c=1:c++,p(c)):p(i);

ยินดีต้อนรับสู่เว็บไซต์! ฉันไม่ค่อยรู้เกี่ยวกับจาวาสคริปต์ แต่คุณสามารถทำอะไรได้p=console.log;for(c=0,i=1;i<=Math.pow(7,7);i++)/7/.test(i)||i%7==0?(6==c?c=1:c++,p(c)):p(i);บ้าง
DJMcMayhem

ขอบคุณ @DrMcMoylex ที่ลดลงอีกสองสามไบต์ ฉันไม่สงสัยเลยว่ายังมีห้องพักสำหรับการปรับปรุง
Richard Sime

ดีใจที่ฉันช่วยได้! อีกสิ่งหนึ่งที่ฉันเพิ่งรู้ก็คือคุณสามารถทำได้9e5แทนMath.pow(7,7)เนื่องจากความท้าทายกล่าวว่า:Print/output AT LEAST the first 7^7
DJMcMayhem

อ๋อยิงดี Doc! เรื่องนี้ทำให้ฉันสามารถวางเท่ากับจากผู้ประกอบการเปรียบเทียบด้วย
Richard Sime

ดูเหมือนจะไม่ทำสิ่งที่คาดหวัง เมื่อกรอกช่องว่างคุณเห็นได้ชัดว่ามีการใช้กฎอีกครั้งมากกว่าแค่การรีเซ็ตเคาน์เตอร์ (ดูส่วนหนึ่งของลำดับนี้34 1 36 **8** 38) for(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1)แต่สำหรับสิ่งที่คุ้มค่ารุ่นปัจจุบันอาจจะแข็งแรงเล่นกอล์ฟบางมากขึ้น:
Arnauld

1

Befunge, 100 หรือ 156 ไบต์

รุ่นแรกนี้เป็นแบบพกพาของทั้งสอง จำกัด ตัวเองให้เซลล์หน่วยความจำ 7 บิตซึ่งเป็นสิ่งที่คุณได้รับในการอ้างอิงล่าม

"O":0>\#09#:p#-:#1_v<0$.< 
9\*"~"g9+1:+1::p00:<+3$_^#g01$$<v"~":/"~"p9g00%"~"::+1+g9\*"~"+g
:#15#+5#g+#0%#17#\-#/!#+\#5:#5_^>%00g1+9p"~"/00g2+9p::7%!10>>p#0

รุ่นที่สองใช้งานได้กับล่ามที่มีเซลล์หน่วยความจำ 32 บิตเท่านั้นดังนั้นจึงไม่ได้มาตรฐาน Befunge อย่างเคร่งครัด แต่นั่นช่วยให้เราเก็บค่าที่ใหญ่กว่าในหน่วยความจำโดยไม่ต้องแยกพวกมันออกจากเซลล์

"O":0>\#09#:p#-:#1_v<0$.< 
%7::p9g00:+1g9:p00:<+1$_^#g01$$<v01!
:#15#+5#g+#0%#17#\-#/!#+\#5:#5_^>p#0

ในทั้งสองกรณีโปรแกรมจะรันไปเรื่อย ๆ แต่เวอร์ชันแรกจะล้นรอบ 2 ล้านมาร์คในขณะที่เวอร์ชันที่สองควรได้รับมูลค่าสูงสุด int (ประมาณ 2 พันล้าน)

คุณสามารถลองออนไลน์ได้ แต่คุณจะต้องฆ่ากระบวนการเพื่อป้องกันไม่ให้มันทำงานได้ตลอดไป


1

Clojure 130 ไบต์

#(let[R(range(inc %))](rest((reduce(fn[[r s]i](if(or(=(mod i 7)0)((set(str i))\7))[(assoc r i(r s))(inc s)][r s]))[(vec R)0]R)0)))

การลดพื้นฐานการติดตามเนื้อหาของเวกเตอร์ผลลัพธ์และจำนวนค่าที่ถูกข้ามไป องค์ประกอบสุดท้าย0จะใช้องค์ประกอบแรกของการลดลง[r s]และrestลดลงองค์ประกอบแรกของผลการจัดทำดัชนี 0



1

Tcl , 64 ไบต์

while 1 {puts [expr {[incr i]%7&&7ni[split $i ""]?$i:[incr s]}]}

ลองออนไลน์!


ดี! สั้นกว่าของฉันมาก ...
hdrz

สิ่งนี้เขียนว่า "... 33 34 7 36 8 38 ... " แทน "... 33 34 1 36 8 38 ... "
mschauer

@mschauer: ตกลงฉันจะแก้ไขมันเมื่อฉันมีเวลา ...
sergiol

@hdrz ฉันลองวิธีการแก้ปัญหาของคุณและมีปัญหาเดียวกัน mschauer บอกเกี่ยวกับ!
sergiol

1

จาวาสคริปต์, 64 ไบต์

for(f=n=>!/7/.test(m=++n[0])*m%7?m:f(n.t=n.t||[0]);;)alert(f(f))

output=[];index=0;for(f=n=>!/7/.test(m=++n[0])*m%7?m:f(n.t=n.t||[0]);index<100;)output[index++]=f(f);console.log(output.join(','))


ps เพื่อเปรียบเทียบกับอีกสองสามconsole.logคำตอบของ JavaScript ( ) คือ 70 ไบต์
l4m2

1

Japt 25 ไบต์

[]L³õ@pX%7«/7/tX ?X:UgV°

ทดสอบผลรวมและองค์ประกอบ 10 รายการสุดท้าย

สร้างรายการลำดับแรก 1,000,000 รายการแรกและพิมพ์ออกมา หนึ่งล้านเป็นจำนวนที่สั้นที่สุด7**7 == 823543ใน Japt

Uขึ้นบรรทัดใหม่เป็นสำคัญขณะที่มันเปิดใช้งานที่ได้รับมอบหมายโดยปริยายไป

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

เอาออกแล้วมันทำงานอย่างไร

[]L³õX{UpX%7&&!/7/tX ?X:UgV++

[]                            Assign empty array to U
  L³õX{                       Map over 1 to 1,000,000 inclusive...
         X%7&&                  If X is not divisible by 7 and
              !/7/tX            X does not have a digit 7
                     ?X:UgV++   then X, otherwise the next element already in U
       Up                       Push it to the end of U

                              Implicit print U

ใช้คุณสมบัติที่นิยามแบบวนซ้ำสามารถแก้ไขได้โดยดูที่ลำดับที่สร้างขึ้นแล้ว

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