Temel ikili hakkında


29

Lütfen cimri unvanı bağışlayın.

Bu, 82000 Meraklı Mülkiyetinden ilham alan bir soru . İçinde, yazar 82000 sayısının 2, 3, 4 ve 5 tabanlarında ikili olduğuna dikkat çekiyor. Daha sonra yayın sorusu, "2, 3, 4, 5 ve 6 numaralı tabanlarda ikili sayı var" sorusunu ortaya koyuyor. "? (Merak edenler için 10 ^ 1,000,000 değerine kadar değerleri kontrol ettim ve şu ana kadar cevap hayır.)

Bir numara verilmiş ne bazlar: Bu beni düşündürdü olduğunu o ikili?

Meraklı sayımız 82000, altı temelde aslında ikili:

Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10

Tüm sayıların ardışık olan ikili tabanları olmayacaktır. 83521 sayısını düşünün. 2, 17, 289, 83520 ve 83521 üslerinde ikilidir.

Buradaki zorluk, bir sayının hangi bazda ikili olacağını belirlemek ve göstermektir.

kurallar

  • Belirli bir temelde sayıları "ikili" olarak kabul edilir, eğer o tabandaki temsili sadece sıfırlardan oluşuyorsa. 110110İkili bir değer ise 12345, olmasa da, A380Fkesinlikle değil.
  • Numaranız standart girişte verilecek. 2 ile 2 ^ 32-1 arası bir tamsayı değeri olacak ve 10 bazında sağlanacaktır.
  • Artan sırayla, her bir kaideyi, sayının ikili olduğu sayıdan daha büyük gösterir. Her kaide kendi satırında olmalıdır. Bu tabandaki ikili değeri eklerseniz (aşağıdaki bonusu görmek için), taban ve ikili değeri bir boşlukla ayırın. Sadece standart çıktıya karar verilecek, standart hata ve diğer kaynaklar göz ardı edilecektir.

puanlama

Puanınız, programınızın bayt olarak boyutudur. Puan ne kadar düşükse, o kadar iyidir.

Bonus :
Programınız aynı zamanda bulunan bazlarda ikili değerleri de veriyorsa, puanınızı 0,75 ile çarpın.
Görüntülenen ikili değerinizde fazladan noktalama işareti, fazladan sıfırlama, ondalık sayı, sadece sıfır ve sıfırlama olmamalıdır.

Örnekler

Giriş:

82000

Çıktı (bonus alır):

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10

Giriş:

1234321

Çıktı (bonus yok):

2
1111
1234320
1234321

Giriş yeni bir satırla bitebilir mi?
LegionMammal978

@ LegionMammal978 - Uhhh ... tabi? Niyetim, giriş numarasını basit bir fgets, readline veya benzeri bir şeyle alabilmeniz gerektiği idi.
Bay Llama,

1
Genel olarak, nher zaman en az tabanlarında ikili 1(sayılmaz) 2, n-1ve n.
mbomb007

1
"Numaranız standart girişte verilecek" derken, yalnızca STDIN'i mi kastediyorsunuz yoksa alternatif olarak sitenin standart olduğu gibi sayıyı da işlev argümanı olarak kabul edebilir miyiz?
Alex A.

İkili gösterim (bonus kısımda) belirli bir formata sahip olmalı mı? Özellikle iyi olur [1, 0, 1, 1, 0]mu, yoksa rakamlar aynı şekilde olmak zorunda 10110mı?
Jakube,

Yanıtlar:


14

Pyth, 14 13

jbf!-jQTU2tSQ

Yeni Sişlevi işaret ettiği için Jakube'ye teşekkür ederiz .

Burada dene.

Çevrimiçi sürüm yapmak için çok yavaş 1234321. Bu, girişi her bir tabana 2'den kendisine dönüştürür ve 0 ve 1'den farklı değerler içeren sonuçları atar.

Açıklama:

                           : Q=eval(input) (implicit)
jb                         : join on newlines the list...
  f!                       : filter away nonempty values (impliticly named T)
    -jQTU2                 : sewtise difference of number converted to base and range(2)
     jQT                   : convert Q to base T
        U2                 : range(2)
          tSQ              : over the range [2 Q+1)

Buna ek olarak, bu bir (olan değil de golfed ikramiye sürümü (20 * 0,75 = 15) Jakube şimdi de golfed yine teşekkürler):

VQI!-JjQK+2NU2pdKjkJ

Burada dene


Pyth daha yeni güncellendi. Böylece gerçek çözümlere link verebilirsiniz.
Jakube

Ve işte 20 * 0.75 = 15 çözüm: VQI!-JjQK+2NU2pdKjkJBazen fonksiyonel programlama en iyi yaklaşım değildir.
Jakube

10

Julia, 72 70 bayt

Bonus ile aslında daha uzun, burada bonus yok.

n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end

Bu, STDIN'den bir satır okur, bir tam sayıya dönüştürür ve sonucu yazdırır. Bir kaba kuvvet yöntemi olmasına rağmen, 1234321 girişi benim için 1 saniyeden daha az sürdü.

Ungolfed + açıklama:

# Read n from STDIN and convert to integer
n = int(readline())

# For every potential base from 2 to n
for j = 2:n
    # If all digits of n in base j are 0 or 1
    if all(i -> i0:1, digits(n, j))
        # Print the base on its own line
        println(j)
    end
end

Örnekler:

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
1234321
2
1111
1234320
1234321

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
82000
2
3
4
5
81999
82000

NOT : Girdi, STDIN'den (OP'den onay bekliyor) değil, bir işlev argümanı olarak alınabilirse, çözüm 55 bayttır.



7

Mathematica, 59 bayt

Print/@Select[1+Range[n=Input[]],Max@IntegerDigits[n,#]<2&]

Ugh ... IntegerDigitsD:

Kod hakkında açıklamak için çok fazla şey yok ... STDIN ve STDOUT kullanma gereksinimi ile 12 bayt boşa harcanıyor.

Bonusu talep edebileceğimi sanmıyorum. Elimden gelenin en iyisini 84 byte (60 üzerinden puan verir):

Print@@@Select[{b=#+1," ",##&@@n~IntegerDigits~b}&/@Range[n=Input[]],Max@##3<2&@@#&]

7

Python 2, 88 86 80

Oldukça basit, bonus yok. Python, global değişkenlerle birlikte hoş ve esnek.

N=input();g=lambda n:n<1or(n%b<2)*g(n/b)
for b in range(2,N+1):
 if g(N):print b

Bonus için kazandığım en iyisi 118 * .75 = 87.75 :

N=input();g=lambda n:0**n*" "or" "*(n%b<2)and(g(n/b)+`n%b`)*(g(n/b)>'')
for b in range(2,N+1):
 if g(N):print`b`+g(N)

Güzel çözüm, çok daha kısa kodla beni yendi.
Kade

Bunun g(N)yerine sadece yapmak daha kısa olacaktır n=N.
feersum

@ feersum Oh evet ( g(N,b)virgül ikiyi eşit yapardı ki)
KSab,

@KSab Bu ikinci kısmı sildim; boşver.
feersum

Yanılıyor olabilirim ama sadece değiştirerek ikramiye alamadım g(n/b)için (g(n/b)+'n%b')bir backtick 'temsil eder?
feersum

4

Python 2, 90 * 0,75 = 67,5

n=input();b=1
while b<n:
 b+=1;s="";c=k=n
 while k:s=`k%b`+s;c*=k%b<2;k/=b
 if c:print b,s

Oldukça basit yinelemeli yaklaşım.

Bonus olmadan, bu 73 bayttır:

n=input();b=1
while b<n:
 b+=1;c=k=n
 while k:c*=k%b<2;k/=b
 if c:print b

4

SQL (PostgreSQL), 247.5 255 230,25 (307 * .75)

SQL bu tür zorluklarda harika olduğu bilindiğinden, bir araya getirmem daha iyi olur :) Bonus bunun için gerçekten faydalı oldu.
Spesifikasyona uygun olmalı, ancak STDIN'DAN KOPYALAYI test etmek için kolay bir yolum yok . Sabit siparişi
düzenle . Bir dizi kullanmak için R sütununun işlenme şekli değiştirildi.

CREATE TABLE IF NOT EXISTS I(I INT);TRUNCATE TABLE I;COPY I FROM STDIN;WITH RECURSIVE R AS(SELECT n,I/n I,ARRAY[I%n] R FROM generate_series(2,(SELECT I FROM I))g(n),(SELECT I FROM I)I(I)UNION ALL SELECT n,I/n,I%n||R FROM R WHERE I>0)SELECT n||' '||array_to_string(R,'')FROM R WHERE 2>ALL(R)and i=0ORDER BY n

Bir test olarak sadece Imasanın içine düz ekler kullandım . Test çalıştırması genişletildi ve yorumlandı.

-- Create the table to accept the input from the copy command
CREATE TABLE IF NOT EXISTS I(I INT);
-- Make sure that it is empty
TRUNCATE TABLE I;
-- Popoulate it with a value from STDIN
--COPY I FROM STDIN;
INSERT INTO I VALUES(82000); -- Testing
--Using a recursive CTE query
WITH RECURSIVE R AS (
    -- Recursive anchor
    SELECT n,                -- base for the row
       I/n I,                -- integer division
       ARRAY[I%n] R   -- put mod value in an array
    FROM generate_series(2,(SELECT I FROM I))g(n), -- series for the bases
         (SELECT I FROM I)I(I) -- Cross joined with I,  saves a few characters
    UNION ALL 
    -- for each row from r recursively repeat the division and mod until i is 0
    SELECT n,
        I/n,
        I%n||R -- Append mod to beginning of the array
    FROM R WHERE I>0
    )
-- return from r where i=0 and r has 1's and 0's only
SELECT n||' '||array_to_string(R,'')
FROM R 
WHERE 2 > ALL(R)and i=0
ORDER BY n -- Ensure correct order

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10


Çok yakın! Çıktı tabanlarının artan sırada olması gerekir. Geleneksel olmayan bir dil kullanmak için +1.
Bay Llama,

@ Mr.Llama bir ile düzeltti order by. Şimdi bu karakterleri geri alabilir miyim görmek için
MickyT

3

Haskell 109 * 0.75 = 81.75 bayt

0#x=[]
n#x=n`mod`x:div n x#x 
f n=[show x++' ':(n#x>>=show)|x<-[2..n+1],all(<2)$n#x]
p=interact$unlines.f.read

Kullanım örneği (not: ilk önce ikili değerler lsb'dir):

p 82000

2 00001010000000101
3 10011111011
4 001100011
5 00011101
81999 11
82000 01

Giriş / çıkış kısıtlamaları olmadan, yani fonksiyon argümanı ile giriş, REPL ile yerel formatta çıkış):

Haskell, 67 * 0.75 = 50.25 bayt

0#x=[]
n#x=n`mod`x:div n x#x
f n=[(x,n#x)|x<-[2..n+1],all(<2)$n#x]

(Baz, değer) çiftlerinin bir listesini döndürür. İlk önce değerler lsb'dir, örneğin (daha iyi görüntü için yeni satırlar / boşluklar eklendi):

 f 82000
 [ (2,[0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1]),
   (3,[1,0,0,1,1,1,1,1,0,1,1]),
   (4,[0,0,1,1,0,0,0,1,1]),
   (5,[0,0,0,1,1,1,0,1]),
   (81999,[1,1]),
   (82000,[0,1]) ] 

2

R, 111

Şu anda bunu geliştirmek için muhtemelen çok fazla yer var

i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')

Uyarıları ile çalışır

> i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')
1: 82000
2: 
Read 1 item
There were 17 warnings (use warnings() to see them)
2 
3 
4 
5 
81999 
82000
>

@AlexA. Maddede I%/%bmantıksal olarak zorlanmadan kaynaklanan uyarılar any(). `
MickyT

2

Java, 181 155,25 (207 * .75) 151.5 (202 x, 75) bayt

class I{public static void main(String[]a){a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1;d++<b;){String e="";for(c=b;c>0;e=c%d+e,c/=d)if(c%d>1)continue a;System.out.println(d+" "+e);}}}

Açıklama ile genişletilmiş:

class I {
    public static void main(String[]a){
        a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1; //b = input(), d = base
              d++<b;) {                                           //For all bases in range(2,b+1)
            String e="";
            for(c = b;c > 0; e = c % d + e,c /= d)                //Test all digits of base-d of b
                           //e = c % d + e                        //Append digits to string
                if (c % d > 1)                                    //Reject base if the digit is greater than 1
                    continue a;
            System.out.println(d+" "+e);                          //Print base and digits.
        }
    }
}

Orijinal (bonus olmadan):

class I{public static void main(String[]a){long b=new java.util.Scanner(System.in).nextLong(),c,d=1;a:for(;d++<b;){c=b;while(c>0){if(c%d>1)continue a;c/=d;}System.out.println(d);}}}

Ypnypn sayesinde 3.75 bayt :)


2

R, 94 83 79

n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")

Kullanımı:

> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 82000
2: 
Read 1 item
2
3
4
5
81999
82000
> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 1234321
2: 
Read 1 item
2
1111
1234320
1234321

İşlevin özü, !sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})her bir taban x için 2'den n'ye kadar olan n / x oranını kalan 0 ya da 1 olduğu sürece n / x oranını korur. Sonra sonucu verir (tüm kalanlar 1 ya da 0) ve olumsuzlar (0 DOĞRU, her şey YANLIŞ olarak reddeder). Fonksiyon kapsamı sayesinde n için yapay bir değişken yapmanıza gerek yoktur. Elde edilen boole vektörü daha sonra endekslemek için kullanılır 2:nve bu nedenle sadece çalıştığı temelleri verir.


1

TI-Basic, 45 bayt

Input N
For(B,2,N
If prod(seq(BfPart(iPart(N/B^X)/B),X,0,log(N)/log(B))<2
Disp B
End

açıklama

  • Giriş N
  • 2'den N'ye kadar her B için
    • Eğer N, B tabanında sadece 0 ve 1 ise
      • Ekran b
  • Son döngü

Karmaşık kısmı

İkinci satır aşağıdaki gibi çalışır:

  • 0'dan log'a her X için B N
  • B × fPart (iPart (N / B X ) / B) B tabanındaki Nth rakamıdır , geriye doğru sayar
  • Bunu bir liste olarak düşünün
  • Her öğe için, rakam 2'den küçükse, verim 1 (doğru), başka 0 (yanlış)
  • Ürünü alın: 1 iff tüm elemanlar 1

Not

)İkinci satırın sonuna bir parantez yerleştirilirse, program önemli ölçüde daha hızlı çalışır . Bu konuda daha fazla bilgi için buraya bakınız .


1

TI-BASIC, 31 29

For(B,2,Ans
If 2>round(Bmax(fPart(Ans/B^randIntNoRep(1,32
Disp B
End

Bu muhtemelen TI-BASIC için idealdir.

Açıklama:

randIntNoRep(1,32)1'den 32'ye kadar olan sayılara rastgele bir permütasyon döndürür (İhtiyacımız olan tek şey bazı sıralardaki sayılardır; TI-BASIC, APL'nin iota komutu gibi bir şeye sahip değildir). 32 eleman yeterli çünkü en küçük taban 2, en büyük sayı 2 ^ 32-1. B^randIntNoRep(1,31)Bu listeyi Bth gücüne yükseltir, bu da hepsini içeren listeyle sonuçlanır B^1,B^2,...,B^32(bir sırada).

Daha sonra giriş ( Ansformdaki giriş olan wer değişkeninde [number]:[program name]) bu sayıya bölünür. Girişiniz 42 ve taban 2 ise, sonuç 21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2]yine bir sırayla liste olacaktır .

Kesirli parçanın alınması ve sayının tabanınızla çarpılması, baz-b gösteriminde bu pozisyondaki rakamı verir. Tüm rakamlar 2'den küçükse, en büyük rakam 2'den az olacaktır.

Ypnypn'ın belirttiği gibi, ifade üzerindeki kapanış parantezleri Forbunu ayrıştırıcı bir hata nedeniyle hızlandırır.

31-> 31: Bir bayt kaydedildi, ancak baytı tekrar ekleyen sabit bir yuvarlama hatası oluştu.

31-> 29: Kullanmak RandIntNoRep()yerine iki bayt kaydedildi cumSum(binomcdf()).


TI-BASIC'in bir sıralama işlevi var mı?
Bay Llama,

Evet, komut seq(expression, variable, start, end[, step]). Hiçbir adım verilmezse, varsayılan olarak 1 olur. Ancak, cumSum(binomcdf(31,09 bayt iken seq(X,X,1,328 bayttır.
lirtosiast

Ah, bu onu açıklar. TI-Basic’teki puanlama çalışmalarına aşina değilim.
Bay Llama,

1

Jöle , 9 bayt

³bṀỊµÐfḊY

Çevrimiçi deneyin!

Yanında Yapıldı Caird coinheringaahing içinde sohbet .

Nasıl çalışır

FullbṀỊµÐfḊY Tam program.

     Örtük olarak oluşturulan aralığı [1, giriş] filtreleyin.
    µ Yeni bir monadik zincir başlatır.
Theb Girişi liste halinde geçerli sayının tabanına dönüştürün.
  Ṁ Maksimum.
   Ị Önemsiz. Abs (Z) ≤ 1 olup olmadığını kontrol eder.
       Que Dequeue; Listenin ilk öğesini kaldırır (taban 1'i bırakmak için).
        Y Yeni hatlara katıl.

0

Javascript, ES6, 118 * .75 = 88.5110 * .75 = 82.5

f=x=>{res={};for(b=2;b<=x;++b)if(!+(res[b]=(c=x=>x%b<2?x?c(x/b|0)+""+x%b:"":"*")(x)))delete res[b];return res}

Önceki versiyon:

f=x=>{res={};for(q=2;q<=x;++q)if(!+(res[q]=(c=(x,b)=>x%b<2?x?c(x/b|0,b)+""+x%b:"":"*")(x,q)))delete res[q];return res}

Kontrol:

f(82000)
Object { 2: "10100000001010000", 3: "11011111001", 4: "110001100", 5: "10111000", 81999: "11", 82000: "10" }

Burada girdi ve çıktı yok.
edc65

0

JavaScript ( ES6 ) 65

Parametre ve konsol çıkışı olan bir fonksiyon için 68 bayt.

f=n=>{s=n=>n%b>1||b<n&&s(n/b|0);for(b=1;b++<n;)s(n)||console.log(b)}

Pop-up ile G / Ç ile 65 bayt

n=prompt(s=n=>n%b>1||b<n&&s(n/b|0));for(b=1;b++<n;)s(n)||alert(b)

Bonusu almak: 88 * 0.75 => 66

n=prompt(s=n=>n%b>1?9:(b<=n?s(n/b|0):'')+n%b);for(b=1;b++<n;)s(n)<'9'&&alert(b+' '+s(n))

0

Mathematica, 76 * 0,75 = 57

n=Input[];G=#~IntegerDigits~b&;If[Max@G@n<2,Print[b," ",Row@G@n]]~Do~{b,2,n}

Başlangıçta giriş şartları hakkında unuttum ... Neyse ki, bunlar çok fazla ilave etmedi.



0

Perl 5 , 63 bayt

map{$t=$n;1while($f=$t%$_<2)&&($t=int$t/$_);say if$f}2..($n=<>)

Çevrimiçi deneyin!

Bu konuda bonus yok çünkü bonus sürümümden biraz daha iyi puan alıyor:

Perl 5 , 85 bayt * 0.75 = 63.75

map{my$r;$t=$n;$r=$/.$r while($/=$t%$_)<2&&($t=int$t/$_);say"$_ 1$r"if$/<2}2..($n=<>)

Çevrimiçi deneyin!

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.