Cantor'ın konuşamayan numaraları


58

Açıklanamayan bir sayı, yedi ile bölünebilen veya rakamlarından biri olarak yedi olan bir sayıdır. Bir çocuk oyunu tarif edilemez sayıları atlamayı saymaktır.

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

Oyunun Cantor versiyonu, "1 2 3 4 5 6 () 8 ..." sırasını tekrar tekrar yukarıdaki boşluklara () doldurmak suretiyle tanımlanan sıradır.

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

Cantor'ın tarif edilemez sayıdaki oyununun ilk 7 ^ 7 sayısını yazdırın / yazdırın ...

Tanım özyinelemeli olarak verilirken, kodda özyineleme kullanmak zorunda değilsiniz.

Bu , bu yüzden en kısa bayt sayısı ile program kazanır!

Not: 1 ila 7 ^ 7'deki sayıların toplamı 203511962727'dir. Bu aralıktaki son 10 sayı 823534 823535 221563 108068 823538 823539 823540 823541 823542 221565'dir.

İlk 1000 yinelemenin pastebin dökümü: http://pastebin.com/Ksiu9Svf


8
Lütfen çözümlerimizi kontrol edebilmemiz için bu dizinin ilk 7 ^ 7 numarasını girin.
kusur


2
Durumda herkes sonuçlar biraz daha sayılar üretmek ve karşılaştırmak için ister: sırayla ilk 7 ^ 77 sayının toplamı 3336402440238885119980169136020683586413168645292341926482898521634332654984279162327502549917668322950744929983987545341421076028 olduğu
Niklas B.

Elbette, bu sırayla 1 'lerin sayısı, rastgele homojen ilk 7 ^ 77 arasında bir eleman almak durumunda, yani 22.977 olan, bunun bir 1 olma 2 x 10 ^ -61 şansı
Niklas B.

1
İlgilendiğiniz takdirde, işte tekrarlananların sayısındaki büyümeyi gösteren bir grafik: drive.google.com/file/d/0B71iQwGfNtw5NGladjdOZVhoNkk/…
Niklas B.

Yanıtlar:


6

Pyth , 25 23 22 bayt

-2 baytlık @Maltysen'e teşekkürler

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

Sonsuz bir akışı basan bir program.

Çevrimiçi deneyin! (Çıkış aralıklarla ve 1 dakika zaman aşımına uğradı)

Nasıl çalışır

.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 bayt . Cuz 7asaldır, bu nedenle diğer
çeklerle

sizinkinin ana bölümünü
yayınlayabilirsiniz

1
Bu yarışmayı kazandığınız için tebrik ederim. Ayrıca @Maltysen'in numarasını da seviyorum!
mschauer

23

Python 2, 77 75 74 70 bayt

Sayesinde limitini öneren @MartinEnder için 9e5ende olan R değişikliği çalışma sona d.
Sonsuz bir akım önerdiği için @ mschauer'e teşekkürler, 4 bayt tasarruf ediyor.

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

Bu sayıların sonsuz bir akışını veren bir jeneratördür.


Üst sınırı tamamen çıkaramıyor musunuz?
mschauer

@ mschauer Teşekkürler, bunu düşünmedim.
PurkkaKoodari

if n%7<1or'7'in`n`else nn%7<1dize kontrol etmekten daha hızlı ve orkısa devre olduğundan , biraz daha hızlı olabilir (aynı bayt sayısı) . İşe yaramaması çok kötü yield[n,next(i)][n%7<1or'7'in`n`].
mbomb007

@ mbomb007 Burada bir sorun olduğunu sanmıyorum, ama teşekkürler. :)
PurkkaKoodari

10

Perl, 47 46 41 39 bayt

@Dada sayesinde 5 bayt kaydedildi

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

Çevrimiçi Deneyin! TIO Nexus, şimdi Perl desteği ile! Bu, belirli bir noktadan sonra çıkışı keser, ancak Perl yüklüyse, tam çıktısını üretmek için yerel olarak çalıştırabilirsiniz.

Kod, Perl'in sözdiziminin tuhaf tuhaflıklarını kullanır, bu yüzden aşağıda nasıl çalıştığını çözeceğim.

Kod dökü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]=$_=...Yanılmıyorsam 2 bayt kazanmak için.
Dada

@Dada aslında bu beni atamak zorunda kalmamdan kurtarıyor $_, bu da 5 bayt kazandırıyor. Teşekkürler!
Gabriel Benamy

1
Oh gerçekten, sadece hızlıca bir bakış
Dada

Şu anda (ve sadece bu anda!) "Perl oldukça salt-yazı dili olabilir" ifadesini anladım.
haneefmubarak

@Grimy lütfen başkalarının kodunu değiştirmeyin. Bir cevabı geliştirmek istiyorsanız, iyileştirmeyi içeren bir yorum ekleyin veya kendi cevabınızı gönderin. Muhtemelen OP'ye ulaşamayacağınız için bir yorum yaparak sadece kendi cevabınızı yazınız.
ovs

5

PHP, 80 (Wahooka) 57 54 bayt

Fikir Wahooka'dan iken. Sürümümün kendi cevabını verecek kadar farklı olduğunu düşünüyorum:

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

5

Haskell, 67 66 bayt

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 sayıların sonsuz bir listesidir.

Çevrimiçi deneyin!

file yeni bir yineleme başlatır 1ve bu sayı 0 olan bir dizini başlatır. Ne zaman bir boşluk olursa, yeni bir yineleme seçeriz, onun ithelemanını seçeriz ve mevcut yinelemeye devam ederiz i+1. Boşluk yoksa, şu anki sayıyı alıyoruz ve artmadan xdevam ediyoruz i.

Düzenleme: @ BMO sayesinde -1 bayt.


4

Matl , 26 25 bayt

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

Çevrimiçi deneyin! ile 9e5yerini 9e4zamanını ve çevrimiçi derleyici çıktı boyutunu çalışan maksimum aşılmaması böylece.

Nasıl çalışır

Bu özyineleme yerine yineleme kullanır. (Aslında, MATL özyinelemeye sahip değildir).

Numaralardan oluşan bir dizi 1için 9e5, ilk oluşturulur (Bu nedenle, yeterli 9e5aşan 7^7). Sonra katları olan sayılar 7veya sahip 7rakam olarak tanımlanan ve yerini 1, 2değiştirilmesi gereken numara bulunmayan dek ... işlem tekrarlanır.

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 Bayt

Sonsuz döngü kullanarak önemsiz çözüm, süslü bir şey değil ..

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

Kullanabilirsiniz incr. Ve Tcl versiyonu> = 8.6, eğer incrbirinci tekrarda bir bir artış kabul yeni gelen bir değişken 0için 1bu değişken önce ayarlanmış,; Böylece ilk iki settalimattan kurtulabilirsiniz .
sergiol

benim tarafımdan golf oynadım - ayrıca ihtiyaç duyulmayan beyaz boşlukları da kaldırdım.
sergiol

Sizin için golf önerilerimi yayınladığım site onları kaybetti, bu yüzden yeni bir cevap
verdim

3

PHP, 106 80 bayt

Üçlü çözüm ve kısa döngü kodunun yerine bir süre kullanmakta yardımcı olduğunuz için teşekkürler Ismael Miguel.

PhpFiddle'ın 30 saniyelik maksimum çalışma süresi nedeniyle tam dizinin son bölümleri doğrulanamadı. OP tarafından sağlanan örnek çıktısına göre en az 1 K çalışmış gibi görünüyor.

Golf:

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

Orijinal golf versiyonu :

$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)." ";Bayt sayısını bilmiyorum, ancak 106 bayttan çok daha düşük olduğundan eminim. Deneyin ve çalışıp çalışmadığını görün.
Ismael Miguel

Çok hoş, yardımın için teşekkürler. Kodunuzdaki tek değişiklik, ilk 7'yi 78 bayt sürümünüze iki bayt ekleyen alıntılar koymaktı.
Wahooka

Yaparak 3 bayt kadar tasarruf edebilirsiniz for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";. Sana yerini alabilir emin değilim $n%7==0ile !$n%7ama denemeye değer.
Ismael Miguel,

1
Devam et -6: $ n = 0 işe yaramaz, "7" 7 olabilir.
Crypto

1
neden vardiya for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];(58 bayt). ++$b-1çünkü$a[null] === null
Christoph

3

Julia, 62 bayt

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

Hiçbir şey fantezi. Boşluklar içindeki dizinin dizinin kendisi olduğunu kullanır. Bazı baytları kaydetmek için aşırı dizi kopyalarını yapar.


3

Perl 6 ,  74 57 54  53 bayt

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

Dene

Expanded:

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

Ölçek:

$ 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

~7Bunun yerine bir bayt kurtarabilir gibi görünüyor '7'.
Sean,

2

Seylan, 202 bayt

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

Bu bir işlev değil, sonsuz bir sıra uygulayan bir nesne bildirimidir (Yinelemeli). Nesne doğrudan yazdırılabilir, şunu print(u)çıktılar:

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

Daha fazla yazdırmak için kullanın printAll(u). Aşağıdaki kod yeni satırları kullanır ve ayrıca toplamı (ve yukarıda gösterilen ilk 30 öğeyi) yazdırır:

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

İşte ungolfed ve yorumlanan versiyonu:

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

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}

İlk başvuru, geliştirilebileceğinden eminim :)


1
PPCG'ye Hoşgeldiniz! Bu en az 7 ^ 7'ye (yani 823543) kadar mı çıkıyor ve 7 rakamını , yani 17 rakamını içeren sayıları mı hesaba katar ?
ETHproductions

Kesinlikle olmadı. Şimdi düzeltildi. Bu sorunun biraz fazla kolay olduğunu düşündüm :)
Christopher Lates

Güzel, ama henüz hak ettiğinden emin değilim. Sonrasında 34( 8şu anda olan) sayı olmalıdır 7, ancak 7okunamayan bir sayı olduğundan, program üçüncü bir yineleme başlatmalı ve bunun yerine yazdırmalıdır 1.
ETHproductions

2

Dyalog APL , 39 bayt

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

⍳7*71 2 3 ... 7 7

{ }⍣≡olduğu sabit nokta operatörü - sonuç stabilize kadar tekrar tekrar bir işlevi uygulamak

A@I⊢B tadil operatörü - endekslerine elemanları yerine Ide BsahipA

0=7|⍵ Argümanın 7 ile bölündüğü yer için bit maskesi

'7'∊¨⍕¨⍵ bağımsız değişkenin ondalık biçiminin 7 içerdiği bit maskesi

veya

Hangi endekslerde yukarıdaki bit maskelerinden biri doğrudur?

i← atamak i

⍵⍴⍨⍴i argümanı içindeki öğelerin sayısına göre yeniden şekillendir i


Bu güzel. Eğer bit maskesi ile ⍳7 * 7 ile çarpmanız ve dizideki sıfırları değiştirme noktasını belirlemeniz yardımcı olur mu?
mschauer

2

C 157 155 Bayt

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

Doğru görünüyor, tamamen kontrol etmeye zahmet etmedim. Görünüşe göre yeterince büyük olan 999999'a kadar çıkıyor.

Ungolfed versiyonu:

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

Kısmen golf versiyonu:

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

Sonra diş tellerine ihtiyacınız var elsemı?
Zacharý

Yapmadım, teşekkürler. Ayrıca teknik olarak (r=0)çoğu zaman diş tellerine de ihtiyacım yok . Ancak bazı derleyiciler seçicidir. Şu anda spec kontrol etmek için çok tembelim.
LambdaBeta

2

R, 86 bayt

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ıradaki sayıları saymak için R's Truthy yerleşikini T( TRUE/ ile başlatılır 1) ve konuşamayanları saymak için Falsy değerini F( FALSE/ ile başlatılır 0) kullanır. Bunun dışında program sadece her sayının yedi ile bölünebilir olup olmadığını kontrol eder veya sayıyı içerir.


-4 byte değiştirerek 7%in%el(strsplit(c(T,""),""))tarafından 55%in%utf8ToInt(paste(T))? (test edilmedi)
JayCe

2

C - 115 bayt

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: işaret ettim @ mschauer sayesinde bazı şeyleri özledim.


Güzel yaklaşım. İki açıklama. r% 10-7 sadece yedileri yakalar ve öbeklerinizi bozmaz: yığın derinliği polinom olarak büyür ... s [99] güvenlidir.
mschauer

2

Javascript, 80 bayt

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

Yalnızca minimum gereksinimler var, ancak maksimum gereksinimler olmadığından, bu çözüm süresiz olarak çıktı vermeye devam ediyor.

Algoritmanın doğru olduğunu doğrulamak için, yalnızca son 10 sayıyı ve toplamı yazdırmak üzere aynı kodu çalıştırabilirsiniz:

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

SözdizimiError: parantez içinde eksik)
l4m2

1

Mathematica, 82 bayt

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

1

JavaScript 81 bayt

Orijinal (98 bayt)

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

golfed

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

Siteye Hoşgeldiniz! Javascript hakkında pek bir şey bilmiyorum, ama böyle bir şey yapabilir misiniz 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

Teşekkürler @DrMcMoylex, birkaç bayt daha düştü. Gelişme için hala yer olduğundan şüphem yok.
Richard Sime

Yardımcı olduğuma sevindim! Şimdi fark ettim Bir başka şey, sen yapabileceğini olduğu 9e5yerine Math.pow(7,7)meydan söylediğinden beri,:Print/output AT LEAST the first 7^7
DJMcMayhem

Evet, iyi atış Doktor! Bu da bir karşılaştırma operatöründen bir eşittir düşürmeme izin verdi.
Richard Sime

Bekleneni yapmak gibi görünmüyor. Boşlukları doldururken, yalnızca bir sayacı sıfırlamak yerine, kuralları yeniden uygulamanız gerekir (dizinin bu bölümüne bakın 34 1 36 **8** 38). Ama buna değer ne için, geçerli sürüm biraz daha golfed olabilir: for(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1).
Arnauld,

1

Befunge, 100 veya 156 bayt

Bu ilk sürüm, ikisinin daha taşınabilir, kendisini 7 bitlik bellek hücreleriyle sınırlandırıyor; bu da referans yorumlayıcıda elde ettiğiniz şey.

"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

İkinci sürüm yalnızca 32 bit bellek hücrelerine sahip tercümanlarla çalışır ve bu nedenle kesinlikle standart Befunge değildir, ancak daha büyük değerleri bellekte hücrelere ayırmak zorunda kalmadan depolamamıza olanak tanır.

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

Her iki durumda da program süresiz çalışır, ancak ilk sürüm 2 milyon işaret civarında taşar, ikinci sürüm ise maksimum int değerine (2 milyar civarında) ulaşır.

Şunları yapabilirsiniz çevrimiçi Deneyin , ama sonsuza kadar çalıştırmak için çalışıyor önlemek için süreci öldürmek gerekir.


1

Clojure, 130 bayt

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

Temel azaltma, sonuç vektörünün içeriğini ve kaç değerin atlandığını takip etme. Son 0düşük ilk elemanı alır [r s], rest0 endeksli sonucunun ilk elemanı düşer.


1

Perl6, 41 bayt

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

1

Tcl , 64 bayt

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

Çevrimiçi deneyin!


Güzel! benden çok daha kısa…
hdrz

Bu yazıyor "... 33 34 7 36 8 38 ..." yerine "... 33 34 1 36 8 38 ..."
mschauer

@ mschauer: Tamam, zamanım varken tamir edeceğim ...
sergiol

@hdrz Çözümünüzü denedim ve mschauer hakkında söylediği aynı sorunu var!
sergiol,

1

JavaScript, 64 bayt

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 birkaç diğer ( console.log) JavaScript cevapları ile karşılaştırmak için , bu 70 bayt
l4m2

1

Japt , 25 bayt

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

Toplamı ve son 10 elemanı test edin .

Dizinin ilk 1.000.000 girişini oluşturur ve bunları yazdırır. Bir milyon, 7**7 == 823543Japt'deki en kısa sayıdır .

Sondaki yeni satır, örtük atamalarını etkinleştirdiğinden dolayı önemlidir U.

Listenin oluşturulması sadece bir saniye sürer, ancak dizinin tamamını çıkarmak tarayıcınızı askıda tutar.

Ambalajsız ve Nasıl Çalışır?

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

Özyinelemeli tanımlamanın önceden oluşturulan sıraya bakarak çözülebileceği özelliği kullanır.

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.