Số lượng không thể bỏ qua của Cantor


58

Một số không thể nói là một số chia hết cho bảy hoặc có bảy là một trong các chữ số của nó. Một trò chơi trẻ em là để bỏ qua những con số không kể xiết

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

Phiên bản trò chơi của Cantor là chuỗi được xác định bằng cách điền đệ quy vào chuỗi "1 2 3 4 5 6 () 8 ..." vào các khoảng trống () ở trên.

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 ...

In / xuất ít nhất 7 ^ 7 số đầu tiên của trò chơi số không thể bỏ qua của Cantor ...

Trong khi định nghĩa được đưa ra đệ quy, bạn không bắt buộc phải sử dụng đệ quy trong mã.

Đây là , vì vậy chương trình có số byte ngắn nhất sẽ thắng!

Lưu ý: Tổng các số trong 1 đến 7 ^ 7 là 203511962727. 10 số cuối cùng trong phạm vi đó là 823534 823535 221563 108068 823538 823539 823540 823541 823542 221565.

Kết xuất pastebin của 1000 lần lặp đầu tiên: http://pastebin.com/Ksiu9Svf


8
Vui lòng cung cấp 7 ^ 7 số đầu tiên của chuỗi đó để chúng tôi có thể kiểm tra các giải pháp của mình.
flawr


2
Trong trường hợp bất cứ ai muốn tạo ra một số con số hơn và so sánh kết quả: Tổng số 7 ^ 77 số đầu tiên trong dãy là 3336402440238885119980169136020683586413168645292341926482898521634332654984279162327502549917668322950744929983987545341421076028
Niklas B.

Chắc chắn, số 1 trong chuỗi đó là 22977, có nghĩa là nếu bạn chọn một phần tử trong số 7 ^ 77 đầu tiên một cách ngẫu nhiên, bạn có cơ hội 2 * 10 ^ -61 là 1
Niklas B.

1
Trong trường hợp bạn quan tâm, đây là biểu đồ cho thấy sự tăng trưởng của số lần lặp lại: drive.google.com/file/d/0B71iQwGfNtw5NGladjdOZVhoNkk/ đấm
Niklas B.

Câu trả lời:


6

Pyth , 25 23 22 byte

Cảm ơn @Maltysen cho -2 byte

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

Một chương trình in một luồng vô hạn.

Hãy thử trực tuyến! (Đầu ra được xả trong khoảng thời gian và thời gian ra sau 1 phút)

Làm thế nào nó hoạt động

.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 byte . Nó hoạt động vì 7nó là số nguyên tố, vì vậy tính phân chia có thể được thực hiện thông qua việc kiểm tra hệ số nguyên tố, phù hợp với kiểm tra khác
Maltysen

bạn có thể gửi nó, phần chính của bạn của nó
Maltysen

1
Chúc mừng chiến thắng cuộc thi này. Tôi cũng thích mánh khóe của @Maltysen!
mschauer

23

Python 2, 77 75 74 70 byte

Nhờ @MartinEnder cho thấy giới hạn của 9e5mà ende r d lên làm việc, kể một sự thay đổi.
Cảm ơn @mschauer đã đề xuất một luồng vô hạn, tiết kiệm 4 byte.

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

Đây là một máy phát mang lại một dòng vô hạn của các số.


Bạn có thể không loại bỏ hoàn toàn giới hạn trên?
mschauer

@mschauer Cảm ơn, đã không nghĩ về điều đó.
PurkkaKoodari

if n%7<1or'7'in`n`else ncó thể nhanh hơn một chút (cùng số byte), vì n%7<1nhanh hơn kiểm tra chuỗi và orbị đoản mạch. Thật tệ khi yield[n,next(i)][n%7<1or'7'in`n`]nó không hoạt động.
mbomb007

@ mbomb007 Tôi không nghĩ tốc độ là một vấn đề ở đây, nhưng cảm ơn. :)
PurkkaKoodari

10

Perl, 47 46 41 39 byte

Đã lưu 5 byte nhờ @Dada

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

Dùng thử trực tuyến! TIO Nexus, hiện có hỗ trợ Perl! Điều này sẽ cắt bớt đầu ra sau một điểm nhất định, nhưng nếu bạn đã cài đặt Perl, bạn có thể chạy nó cục bộ để tạo ra đầu ra đầy đủ.

Mã này sử dụng một vài cú pháp kỳ lạ của cú pháp của Perl, vì vậy tôi sẽ chia nhỏ cách thức hoạt động bên dưới.

Sự cố mã:

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]=$_=...để giành được 2 byte nếu tôi không nhầm.
Dada

@Dada thực sự vì điều đó giúp tôi không phải gán $_, nó tiết kiệm cho tôi 5 byte. Cảm ơn!
Gabriel Benamy

1
Thật vậy, tôi chỉ có một cái nhìn nhanh và không nhận thấy sự phân công ở giữa .. công việc tốt :)
Dada

Chính tại thời điểm này (và chỉ thời điểm này!) Tôi đã hiểu câu nói "Perl có thể là ngôn ngữ chỉ viết".
haneefmubarak

@Grimy xin đừng chỉnh sửa mã người khác. Nếu bạn muốn cải thiện một câu trả lời, hãy thêm một bình luận bao gồm cải tiến hoặc đăng câu trả lời của riêng bạn. Vì bạn có thể sẽ không đến được OP bằng một bình luận chỉ cần đăng câu trả lời của riêng bạn.
trứng

5

PHP, 80 (Wahooka) 57 54 byte

Trong khi ý tưởng là từ Wahooka. Tôi nghĩ phiên bản của tôi đủ khác để biến nó thành một câu trả lời:

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

5

Haskell, 67 66 byte

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 là một danh sách vô hạn của các số.

Hãy thử trực tuyến!

fbắt đầu một lần lặp mới với 1và một chỉ số sẽ chọn số 0. Bất cứ khi nào có khoảng cách, chúng ta sẽ thực hiện một lần lặp mới, chọn ithphần tử đó và tiếp tục lặp lại hiện tại i+1. Nếu không có khoảng cách, chúng tôi lấy số hiện tại xvà tiếp tục mà không tăng i.

Chỉnh sửa: -1 byte nhờ @BMO.


4

MATL , 26 25 byte

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

Hãy thử trực tuyến! được 9e5thay thế bằng 9e4, để không vượt quá thời gian chạy tối đa và kích thước đầu ra của trình biên dịch trực tuyến.

Làm thế nào nó hoạt động

Điều này sử dụng phép lặp thay vì đệ quy. (Trên thực tế, MATL không có đệ quy).

Một mảng các số từ 1đến 9e5đầu tiên được tạo ra (điều này là đủ, vì 9e5vượt quá 7^7). Sau đó, con số đó là bội số của 7hoặc có 7như chữ số được xác định, và thay thế bằng 1, 2... Quá trình này được lặp cho đến khi không có con số mà cần phải được thay thế.

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 byte

Các giải pháp tầm thường sử dụng vòng lặp vô hạn, không có gì lạ mắt ..

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}}

Ung dung:

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
  }
}

Bạn có thể sử dụng incr. Và nếu tcl phiên bản> = 8.6, incrgiả định phiên đầu tiên một tăng của một mới biến từ 0để 1nếu biến mà không được đặt trước; để bạn có thể thoát khỏi hai sethướng dẫn đầu tiên .
sergiol

chơi golf bởi tôi - tôi cũng loại bỏ một số khoảng trắng không cần thiết.
sergiol

Trang web nơi tôi đăng các đề xuất chơi gôn của tôi cho bạn đã mất chúng, vì vậy tôi đã đưa ra câu trả lời mới của mình
sergiol

3

PHP, 106 80 byte

Cảm ơn bạn Ismael Miguel đã giúp đỡ với giải pháp ternary và mã vòng lặp ngắn hơn sử dụng thay vì trong khi.

Không thể xác minh các phần cuối của chuỗi đầy đủ do thời gian chạy tối đa 30 giây của PhpFiddle. Có vẻ hoạt động ít nhất lên tới 1K dựa trên đầu ra mẫu do OP cung cấp.

Golf:

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

Phiên bản golf gốc :

$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)." ";Tôi không biết số byte, nhưng tôi chắc chắn rằng nó thấp hơn rất nhiều so với 106 byte. Hãy thử nó và xem nếu nó hoạt động.
Ismael Miguel

Rất đẹp, cảm ơn vì sự giúp đỡ. Việc sửa đổi duy nhất cho mã của bạn là đặt 7 trích dẫn đầu tiên trong đó trích dẫn thêm hai byte vào phiên bản 78 byte của bạn.
Wahooka

Bạn có thể tiết kiệm 3 byte hoặc hơn bằng cách làm for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";. Tôi không chắc chắn nếu bạn có thể thay thế $n%7==0với !$n%7nhưng nó có giá trị một thử.
Ismael Miguel

1
Tiếp tục đi -6: $ n = 0 là vô ích, "7" có thể là 7.
Crypto

1
Tại sao phải thay đổi? for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];(58 byte). ++$b-1bởi vì$a[null] === null
Christoph

3

Julia, 62 byte

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

Không có gì lạ mắt. Sử dụng rằng trình tự trong các khoảng trống là chính trình tự. Tạo các bản sao mảng quá mức để lưu một số byte.


3

Perl 6 ,  74 57 54  53 byte

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..*}

Thử nó

Mở rộng:

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 )
}

Kiểm tra:

$ 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

Có vẻ như bạn có thể lưu một byte bằng cách nói ~7thay vì '7'.
Sean

2

Ceylon, 202 byte

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;};}

Đây không phải là một hàm, mà là một khai báo đối tượng thực hiện một chuỗi vô hạn (Iterable). Đối tượng có thể được in trực tiếp, print(u)xuất ra điều này:

{ 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, ... }

Để in thêm, sử dụng printAll(u). Đoạn mã sau sử dụng dòng mới và cũng in tổng (và 30 phần tử đầu tiên được hiển thị ở trên):

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

Đây là phiên bản chưa được chỉnh sửa và nhận xét:

// 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 byte

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}

Lần gửi đầu tiên, tôi chắc chắn rằng nó có thể được cải thiện :)


1
Chào mừng đến với PPCG! Điều này có lên đến ít nhất 7 ^ 7 (tức là 823543) không, và nó có chiếm các số có chứa chữ số 7, tức là 17 không?
Sản xuất ETH

Nó chắc chắn không. Đã sửa bây giờ. Nghĩ rằng vấn đề đó quá dễ dàng :)
Christopher Lates

Đẹp, nhưng tôi không chắc nó đủ điều kiện. Số sau 34( 8hiện tại) nên là 7, nhưng vì 7là số không thể nói được, chương trình sẽ bắt đầu lần lặp thứ ba và thay vào đó in 1.
Sản phẩm ETH

2

APL Dyalog , 39 byte

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

⍳7*7là 1 2 3 ... 7 7

{ }⍣≡là toán tử điểm cố định - áp dụng một hàm nhiều lần cho đến khi kết quả ổn định

A@I⊢B Sửa đổi điều hành - thay thế các yếu tố ở các chỉ số Itrong BvớiA

0=7|⍵ bitmask cho nơi đối số chia hết cho 7

'7'∊¨⍕¨⍵ bitmask trong đó định dạng thập phân của đối số chứa 7

hoặc là

tại các chỉ số nào là một trong các bitmas ở trên là đúng?

i← giao cho i

⍵⍴⍨⍴i định hình lại đối số cho số phần tử trong i


Cái này đẹp đấy. Nó có giúp ích gì không nếu bạn nhân ⍳7 * 7 với bitmask và lấy điểm cố định sửa đổi các số 0 trong chuỗi?
mschauer

2

C 157 155 byte

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);}

Có vẻ đúng, tôi không buồn kiểm tra đầy đủ. Lên đến 999999 là đủ lớn.

Phiên bản bị đánh cắp:

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;
}

Phiên bản chơi gôn một phần:

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;
        }
    }
}

Bạn có cần niềng răng sau else?
Zacharý

Tôi không, cảm ơn bạn. Về mặt kỹ thuật, tôi cũng không cần niềng răng trong (r=0)hầu hết thời gian. Nhưng một số trình biên dịch rất kén chọn. Tôi quá lười để kiểm tra thông số kỹ thuật ngay bây giờ.
LambdaBeta

2

R, 86 byte

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}

Sử dụng R's Truthy tích hợp T(khởi tạo thành TRUE/ 1) để đếm các số trong chuỗi và giá trị Falsy F(được khởi tạo thành FALSE/ 0) để đếm các số không thể nói được. Ngoài ra, chương trình chỉ cần kiểm tra xem mỗi số có chia hết cho bảy hay chứa số đó không.


-4 byte thay thế 7%in%el(strsplit(c(T,""),""))bởi 55%in%utf8ToInt(paste(T))? (không được kiểm tra)
JayCe

2

C - 115 byte

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));}

EDIT: Cảm ơn @mschauer, người đã chỉ ra rằng tôi đã bỏ lỡ một số điều.


Cách tiếp cận tốt đẹp. Hai nhận xét. r% 10-7 không chỉ bắt được bảy phần trăm và không làm hỏng heap của bạn: độ sâu của ngăn xếp tăng lên đa thức ... s [99] là an toàn.
mschauer

2

Javascript, 80 byte

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

Vì chỉ có một yêu cầu tối thiểu nhưng không phải là yêu cầu tối đa, giải pháp này tiếp tục xuất ra vô thời hạn.

Để xác minh rằng thuật toán là chính xác, bạn có thể thực hiện cùng một mã in chỉ 10 số cuối cùng và tổng:

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
    }
}

Cú phápError: mất tích) trong ngoặc đơn
l4m2

1

Toán học, 82 byte

Nest[#2&[i=1,If[Or@@(#==7&)/@IntegerDigits@#,i++,#]&/@#]&,Table[i,{i,7^7}],20]

1

JavaScript 81 byte

Bản gốc (98 byte)

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);

Chơi gôn

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);

Chào mừng đến với trang web! Tôi không biết nhiều về javascript, nhưng bạn có thể làm gì đó 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);không?
DJMcMayhem

Cảm ơn @DrMcMoylex, đã giảm thêm một vài byte. Tôi không nghi ngờ vẫn còn chỗ để cải thiện.
Richard Sime

Mừng vì tôi có thể giúp! Một điều khác tôi vừa nhận ra, là bạn có thể làm 9e5thay vì Math.pow(7,7), vì thử thách đã nói:Print/output AT LEAST the first 7^7
DJMcMayhem

Đúng, bắn tốt! Điều này cho phép tôi bỏ một số bằng từ một toán tử so sánh quá.
Richard Sime

Nó dường như không làm những gì mong đợi. Khi lấp đầy các khoảng trống, rõ ràng bạn phải áp dụng lại các quy tắc thay vì chỉ đặt lại một bộ đếm (xem phần này của chuỗi 34 1 36 **8** 38:). Nhưng với giá trị của nó, phiên bản hiện tại có thể được đánh gôn thêm : for(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1).
Arnauld

1

Befunge, 100 hoặc 156 byte

Phiên bản đầu tiên này là bản di động hơn của cả hai, giới hạn bản thân trong các ô nhớ 7 bit, đây là những gì bạn nhận được trong trình thông dịch tham chiếu.

"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

Phiên bản thứ hai chỉ hoạt động với các trình thông dịch có các ô nhớ 32 bit và do đó không đúng tiêu chuẩn Befunge, nhưng cho phép chúng tôi lưu trữ các giá trị lớn hơn trong bộ nhớ mà không phải phân chia chúng qua các ô.

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

Trong cả hai trường hợp, chương trình chạy vô thời hạn, nhưng phiên bản đầu tiên sẽ vượt mốc 2 triệu, trong khi phiên bản thứ hai sẽ đạt giá trị int tối đa (khoảng 2 tỷ).

Bạn có thể dùng thử trực tuyến , nhưng bạn sẽ cần phải giết quá trình để ngăn không cho nó chạy mãi mãi.


1

Clojure, 130 byte

#(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)))

Giảm cơ bản, theo dõi nội dung của vectơ kết quả và có bao nhiêu giá trị đã bị bỏ qua. Phần tử cuối cùng 0lấy phần tử đầu tiên được giảm [r s], restbỏ phần tử đầu tiên của kết quả được lập chỉ mục 0.


1

Perl6, 41 byte

put {($_=++$)%%7|m/7/??@_[$++]!!$_}…1e6

1

Tcl , 64 byte

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

Hãy thử trực tuyến!


đẹp! ngắn hơn nhiều so với tôi đào
hdrz

Điều này viết "... 33 34 7 36 8 38 ..." thay vì "... 33 34 1 36 8 38 ..."
mschauer

@mschauer: Ok, tôi sẽ sửa nó khi có thời gian ...
sergiol

@hdrz Tôi đã thử giải pháp của bạn và nó có cùng một vấn đề mà mschauer đã nói về!
sergiol

1

JavaScript, 64 byte

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 để so sánh với một vài ( console.log) câu trả lời JavaScript khác, đó là 70 byte
l4m2

1

Japt , 25 byte

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

Kiểm tra tổng10 phần tử cuối cùng.

Tạo 1.000.000 mục đầu tiên của chuỗi và in chúng. Một triệu là con số ngắn nhất 7**7 == 823543trong Japt.

Dòng mới theo dõi rất quan trọng, vì nó kích hoạt gán ngầm định cho U .

Việc tạo danh sách chỉ mất khoảng một giây, nhưng việc xuất ra toàn bộ mảng có thể sẽ khiến trình duyệt của bạn bị treo.

Giải nén & Cách thức hoạt động

[]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

Sử dụng thuộc tính mà định nghĩa đệ quy có thể được giải quyết bằng cách xem chuỗi đã tạo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.