Все про базовий бінарний


29

Вибачте, будь ласка, заголовок.

Це питання натхнене Цікавою власністю 82000 . У ній автор зазначає, що число 82000 є двійковим у базі 2, 3, 4 та 5. Після цього пост ставить питання "чи є число, яке є двійковим у базах 2, 3, 4, 5 та 6 "? (Для тих, хто цікавиться, я перевірив значення до 10 ^ 1 000 000, і поки відповідь немає.)

Це змусило мене замислитися: враховуючи число, на яких підставах він є бінарним?

Наш цікавий номер, 82000, насправді двійковий на шість основ:

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

Не всі числа матимуть двійкові бази, які є послідовними. Розглянемо число 83521. Це двійкове значення в базах 2, 17, 289, 83520 та 83521.

Ваша задача полягає в тому, щоб визначити та відобразити, на основі яких чисел є двійкове значення.

Правила

  • Число вважається "двійковим" у даній базі, якщо його представлення в цій базі складається лише з нулів та одиниць. 110110є двійковим значенням, а 12345поки ні, A380Fточно не є.
  • Ваш номер буде надано на стандартному введенні. Це буде ціле значення від 2 до 2 ^ 32-1 включно і надаватиметься у форматі base-10.
  • У порядку зростання виводьте кожну базу більше, ніж число, яке є двійковим. Кожна база повинна знаходитись у власному рядку. Якщо ви включите бінарне значення в цю базу (див. Бонусний бал нижче), розділіть базу та двійкове значення пробілом. Буде оцінено лише вихід у стандартний вихід, стандартна помилка та інші джерела будуть ігноровані.

Оцінка балів

Ваш бал - це розмір вашої програми в байтах. Чим нижче оцінка, тим краще.

Бонус :
Якщо ваша програма також виводить бінарні значення у знайдених базах, помножте свій результат на 0,75.
У відображеному бінарному значенні не повинно бути зайвих знаків пунктуації, сторонніх нулів, жодних знаків після коми, лише нулі та одиниці.

Приклади

Вхід:

82000

Результат (отримує бонус):

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

Вхід:

1234321

Вихід (без бонусу):

2
1111
1234320
1234321

Чи може вхід закінчуватися новим рядком?
LegionMammal978

@ LegionMammal978 - Угу ... впевнений? Моя мета полягала в тому, щоб ви мали змогу отримати вхідний номер простими значками, читаннями чи чимось подібним.
Містер Лама

1
Загалом, nзавжди принаймні бінарна в базах 1(до уваги береться), 2, n-1, і n.
mbomb007

1
Коли ви говорите: "ваш номер буде надано на стандартному вході", ви маєте на увазі лише STDIN, чи ми можемо альтернативно прийняти число як аргумент функції, як це є стандартним для сайту?
Олексій А.

Чи має двійкове представлення (у бонусній частині) мати певний формат? Особливо було [1, 0, 1, 1, 0]б нормально, чи чисел потрібно з'єднувати так 10110?
Якубе

Відповіді:


14

Піта, 14 13

jbf!-jQTU2tSQ

Дякую Якубе за вказівку на нову Sфункцію.

Спробуйте тут.

Онлайн-версія занадто повільна 1234321. Це просто перетворює вхід для кожної бази з 2 до себе і відкидає результати, що містять значення, відмінні від 0 і 1.

Пояснення:

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

Крім того, це бонусна версія ( не дуже добре зараз гольф, знову ж завдяки Джакубе) (20 * .75 = 15):

VQI!-JjQK+2NU2pdKjkJ

Спробуйте тут


Піт щойно оновився. Тож ви можете зв’язатись із фактичними рішеннями.
Якубе

І ось рішення 20 * 0,75 = 15: VQI!-JjQK+2NU2pdKjkJІноді функціональне програмування - не найкращий підхід.
Якубе

10

Юлія, 72 70 байт

Насправді довше з бонусом, тому ніякого бонусу тут немає.

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

Це зчитує рядок зі STDIN, перетворює його на ціле число та друкує результат. Незважаючи на метод грубої сили, вхід 1234321 для мене зайняв менше 1 секунди.

Недоліковані + пояснення:

# 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

Приклади:

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

ПРИМІТКА . Якщо введення можна сприймати як аргумент функції, а не з STDIN (очікує підтвердження від ОП), рішення становить 55 байт.


7

CJam, 20 байт (або 27 байт * 0,75 = 20,25)

Ось без бонусної версії 20 байт:

ri:X,2f+{X\b2,-!},N*

Спробуйте це тут.

Просто для задоволення, ось бонусна версія, 27 байт:

ri:X{X\)b2,-!},1>{)SX2$bN}/

Спробуйте його онлайн тут


Звичайно. Одного разу я заробив трохи гольфу.
Оптимізатор

1
ri_,f{2+S@2$bN}4/{2=2,-!},(19,5 байт)
Денніс

7

Математика, 59 байт

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

Тьфу ... IntegerDigitsD:

Пояснювати код не дуже багато ... 12 байт витрачається на вимогу щодо використання STDIN та STDOUT.

Я не думаю, що я можу вимагати премію. Найкраще, що я отримав, - це 84 байти (що дає бал понад 60):

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

7

Пітон 2, 88 86 80

Досить прямо, без бонусу. Python приємний і поблажливий з глобальними змінними.

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

Найкраще, що мені вдалося отримати за бонус, - 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(N)замість цього n=N.
feersum

@feersum О так (це було g(N,b)раніше, кома зробила їх двома рівними), але що ви маєте на увазі, мені не потрібна змінна для N?
KSab

@KSab я видалив цю другу частину; не заважай.
feersum

Може бути , я помиляюся , але не могли б ви отримаєте бонус, тільки змінюючи g(n/b)до (g(n/b)+'n%b')де 'являє собою зворотну одиничні лапки?
feersum

4

Пітон 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

Досить простий ітеративний підхід.

Без бонусу це 73 байти:

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, як відомо, чудово справляється з подібними проблемами, я подумав, що краще зібрати його :) Бонус справді вартий цього.
Він повинен відповідати специфікаціям, але у мене немає простого способу перевірити КОПІЮ Я ВІД СТИДИНУ .
Редагування фіксованого замовлення. Змінено спосіб обробки стовпця R для використання масиву.

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

Як тест я просто використав прямі вставки в Iтаблицю. Тестовий запуск розширено та прокоментовано.

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


Дуже близько! Вихідні бази повинні бути у порядку зростання. +1 за використання нетрадиційної мови.
Містер Лама

@ Mr.Llama виправив це за допомогою order by. Тепер, щоб побачити, чи можу я повернути цих персонажів
MickyT

3

Haskell 109 * 0,75 = 81,75 байт

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

Приклад використання (примітка: двійкові значення спочатку lsb):

p 82000

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

Без обмежень на введення / виведення, тобто введення через аргумент функції, вихід у рідному форматі через REPL):

Haskell, 67 * 0.75 = 50.25 байт

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

Повертає список пар (база, значення). Першими є значення lsb, наприклад (для кращого відображення додаються нові рядки / пробіли):

 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

Напевно, є багато можливостей для покращення цього на даний момент

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

Працює з попередженнями

> 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. Попередження, викликані примушенням I%/%bдо логічного в any()пункті. `
MickyT

2

Java, 181 155,25 (207 * .75) 151,5 (202 * .75) байт

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

Розширено з поясненням:

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

Оригінал (без бонусу):

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

3,75 байти завдяки Ypnypn :)


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

Використання:

> 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

Основна функція полягає в !sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})тому, що для кожної бази x від 2 до n зберігати коефіцієнт n / x до тих пір, поки решта дорівнює 0 і 1. Потім вона видає результат (який дорівнює 0, якщо всі залишки були 1 або 0) і заперечує його (0 відміняє НА ПРАВИЛЬНО, все інше заперечує ЛІЖНУ). Завдяки області функцій немає необхідності робити фіктивну змінну для n. Отриманий вектор булевих значень потім використовується для індексації 2:nі тому виводить лише основи, на яких він працював.


1

TI-Basic, 45 байт

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

Пояснення

  • Вхід N
  • Для кожного B від 2 до N
    • Якщо N просто 0 і 1 в базі B
      • Дисплей B
  • Кінцева петля

Складна частина

Другий рядок працює наступним чином:

  • Для кожного X від 0 до журналу B N
  • B × fPart (iPart (N / B X ) / B) - це N-та цифра в базі B, рахуючи назад
  • Розглянемо це як список
  • Для кожного елемента, якщо цифра менше 2, вийде 1 (справжній), інше 0 (помилковий)
  • Візьміть продукт: 1 якщо всі елементи - 1

Примітка

Програма запускається значно швидше, якщо в )кінці другого рядка розміщується дужка, що закривається . Дивіться тут докладніше про це.


1

TI-BASIC, 31 29

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

Це, мабуть, оптимально для TI-BASIC.

Пояснення:

randIntNoRep(1,32)повертає випадкову перестановку чисел від 1 до 32 (Все, що нам потрібно, це ці числа в певному порядку; TI-BASIC не має нічого подібного до команди йоти APL). 32 елемента достатньо, тому що найменша можлива основа - 2, а найбільша кількість - 2 ^ 32-1. B^randIntNoRep(1,31)піднімає цей список до Bth power, що призводить до того, що список містить усі B^1,B^2,...,B^32(у певному порядку).

Потім вхід (у Ansзмінній wer, яка вводиться у формі [number]:[program name]) ділиться на це число. Якщо ваш внесок становить 42, а база - 2, результатом буде список 21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2], знову в певному порядку.

Якщо взяти дробову частину і помножити число на базу, ви отримаєте цифру в цьому положенні в поданні base-b. Якщо всіх цифр менше 2, то найбільша цифра буде менше 2.

Як заявив Ypnypn, закриваючу дужку на For операторі прискорює це через помилку аналізатора.

31-> 31: збережений байт, але виправлені помилки округлення, які знову додали байт.

31-> 29: збережено два байти за допомогою, RandIntNoRep()а не cumSum(binomcdf()).


Чи має TI-BASIC функцію послідовності?
Містер Лама

Так, команда є seq(expression, variable, start, end[, step]). Якщо не зроблено кроку, він за замовчуванням cumSum(binomcdf(31,0дорівнює 1. Однак, це 8 байт, тоді seq(X,X,1,32як 9 байт.
lirtosiast

Ах, це пояснює це. Я не знайомий із оцінкою робіт у TI-Basic.
Містер Лама

1

Желе , 9 байт

³bṀỊµÐfḊY

Спробуйте в Інтернеті!

У чаті поруч із птахом coinheringaahing .

Як це працює

³bṀỊµÐfḊY Повна програма.

     Ðf Фільтр неявно створеного діапазону [1, вхід].
    µ Запускає новий монастирський ланцюг.
³b Перетворити вхід у базу поточного числа як список.
  Ṁ Максимум.
   Ị Незначні. Перевіряє, чи abs (Z) ≤ 1.
       Ḋ Dequeue; Видаляє перший елемент списку (для випадання бази 1).
        Y Приєднуйтесь за новими лініями.

0

Javascript, ES6, 118 * .75 = 88.5 110 * .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}

Попередня версія:

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}

Перевірка:

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

Тут у вас немає ні вводу, ні виводу.
edc65

0

JavaScript ( ES6 ) 65

68 байт для функції з параметром та консольним виходом.

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

65 байт з I / O через спливаюче вікно

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

Затвердження бонусу: 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

Математика, 76 * 0,75 = 57

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

Спочатку забули про вхідні вимоги ... На щастя, ті не додали занадто багато зайвих.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.