Відлік від "Нескінченність"


47

Здається, неможливе завдання, правда? Ну, насправді це не так складно. Якщо ми запишемо слово Infinityяк 8-бітний двійковий код ASCII, ми отримаємо:

01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001

Це можна об'єднати і перетворити на десяткове значення 5291279215216915577. Тепер це число, з яким ми можемо працювати ...

Спосіб, який ви будете рахувати, це:

  1. Виведіть початковий рядок у вигляді десяткового числа (як показано вище)
  2. Видаліть ведучі 0 у своєму бінарному поданні (якщо такі є)
  3. Увімкніть біти у двійковому поданні (1-> 0, 0-> 1)
  4. Виведіть число десятковою
  5. Повторюйте кроки 2-4, поки не досягнете 0.

Виклик:

Створіть програму або функцію, яка приймає рядок як вхідний і виводить (у будь-якому відповідному форматі) цифри, які ви отримаєте, виконуючи процедуру, описану вище.

Тестовий випадок:

Я думаю, що виклик буде досить легко зрозуміти, хоча це лише один тестовий випадок. Я використаю Infзамість того, Infinityщоб тримати це досить коротко.

Inf
4812390  (10010010110111001100110)
3576217  ( 1101101001000110011001)
618086   (   10010110111001100110)
430489   (    1101001000110011001)
93798    (      10110111001100110)
37273    (       1001000110011001)
28262    (        110111001100110)
4505     (          1000110011001)
3686     (           111001100110)
409      (              110011001)
102      (                1100110)
25       (                  11001)
6        (                    110)
1        (                      1)
0        (                      0)

Input: Inf 
Output:
4812390, 3576217, 618086, 430489, 93798, 37273, 28262, 4505, 3686, 409, 102, 25, 6, 1, 0 

Input: Infinity
Output:
5291279215216915577, 3932092821637860230, 679593196789527673, 473328307817319302, 103132444486104185, 40982743589751686, 31074850448176249, 4953946570787718, 4053252683953273, 450346943417222, 112603010004089, 28134478351238, 7049893737593, 1746199284614, 452823970937, 96931842950, 40507110521, 28212366214, 6147372153, 2442562438, 1852404857, 295078790, 241792121, 26643334, 6911097, 1477510, 619641, 428934, 95353, 35718, 29817, 2950, 1145, 902, 121, 6, 1, 0

Ваш код повинен підтримувати рядки, які можуть бути представлені у вигляді двійкового числа до межі вашої мови. Усі рядки містять лише символи для друку ASCII від 32-126 (пробіл до тильди).


Таблиця лідерів


31
Чак Норріс , 8 байт:Inf:-1:0
Луїс Мендо

2
@LuisMendo Чак Норріс 'NARS-APL:∞..0
Adám

5
@LuisMendo Ви впевнені, що не маєте на увазі Джон Скіт ?
mbomb007

Відповіді:


12

Желе , 15 10 байт

-5 байт завдяки @Dennis (конвертувати безпосередньо з бази 256 після чергової передачі)

Oḅ⁹µBCḄµÐĿ

СпробуйтеItOnline!

Як?

Oḅ⁹µBCḄµÐĿ - Main link: s                     e.g. "Inf"
O          - cast to ordinals                 e.g. [73,110,102]
 ḅ⁹        - convert from base 256 to integer e.g. 4812390
   µ   µ   - monadic chain separations
    B      -     convert to binary
     C     -     complement
      Ḅ    -     convert to integer
        ÐĿ - loop until no longer unique and collect results 

1
Перша частина справедлива Oḅ⁹.
Денніс

О мій, як я це пропустив ?!
Джонатан Аллан

11

Python 2, 89 82 77 76 75 байт

n=0
for c in input():n=n<<8|ord(c)
while 1:print n;n^=2**n.bit_length()-n/n

Перевірте це на Ideone .

Як це працює

Після ініціалізації n до 0 другий рядок виконує перетворення рядка в ціле число, визначене в завданнях, наступним чином.

На кожному кроці n зміщується на 8 одиниць ліворуч, потім порозрядно АБО -ed з кодовою точкою наступного символу c . Для введення Inf це відбувається наступним чином.

n                                  0
a = n<<8                           0
b = 'I'                      1001001
n = a ^ b                    1001001
a = n<<8             100100100000000
b = 'n'                      1101110
n = a ^ b            100100101101110
a = n<<8     10010010110111000000000
b = 'f'                      1100110
n = a ^ b    10010010110111001100110

Тепер ми готові генерувати вихід. Інвертувати біти n поступаємо так.

По-перше, ми обчислюємо біти в бінарному поданні n , не ведучими нулями. Назвемо результат k . Тоді ми обчислюємо k k потужність 2 , яка має k + 1 двійкові цифри: одинарна 1 , а потім k 0 's. Від результату віднімаємо 1 , отримуючи число, складене з k , яке потім XOR з n перевертаємо його бітами. Для введення inf це йде наступним чином.

n         4812390   10010010110111001100110
k              23 
t = 2**k           100000000000000000000000
t -= 1              11111111111111111111111
n ^= t    3576217    1101101001000110011001
k              22
t = 2**k            10000000000000000000000
t -= 1               1111111111111111111111
n ^= t     618086      10010110111001100110
.
.
.
n               6                       110
k               3
t = 2**k                               1000
t -= 1                                  111
n ^= t          1                         1
k               1
t = 2**k                                 10
t -= 1                                    1
n ^= t          0                         0

Додатковим перешкодою у здійсненні є те, що ми повинні надрукувати n до першого кроку, після останнього кроку та всіх кроків між ними. У Python немає циклів виконання часу, і одна операція друку коштує 8 байт, тому ми робимо наступне.

При прямому виконанні кроку оновлення, тобто

while n:print n;n^=2**n.bit_length()-1
print n

ми замінюємо цикл нескінченним ( while 1) і обчислюємо 1цикл як n/n. Це еквівалентно тоді, коли n> 0 .

Як тільки n = 0 , ми залишаємось у циклі, ще раз надрукуємо стан та спробуємо оновити його. Однак, 0/0запускає ZeroDivisionError , вириваючись з циклу та закінчуючи помилкою. Зауважте, що це призводить до збитого виходу на STDERR, що дозволено за замовчуванням .


2
Я люблю цей -n/nтрюк :-)
ETHproductions

Чи можете ви пояснити, ніж n/nхитрість? Це, мабуть, було пояснено в іншій відповіді десь, але я її не знайшов. Що це робить тут?
Стюі Гріффін

@StewieGriffin n / n дорівнює 1, поки n не дорівнює 0, то воно видає помилку і зупиняє програму.
джазпі

З повідомленням про помилку (сподіваюся)?
Стюі Гріффін

1
@StewieGriffin Дійсно. Python є болісно багатослівним, коли йдеться про повідомлення про помилки. Я відредагував свою відповідь, щоб включити пояснення.
Денніс

8

JavaScript, 82 байти

Збережено байт завдяки @Ar yeard

for(y of prompt(n=0))n=n<<8|y.charCodeAt()
for(;alert(n)|n;)for(i=1;i<=n;i*=2)n^=i

Один з небагатьох випадків, коли повна програма перевершує функцію (а ES6 не перевершує ES5) ...


Вищезгадане підтримує до 4 букв слів. Додайте 4 байти для підтримки до 6-літерних слів:

for(y of prompt(n=0))n=n*256+y.charCodeAt()
for(;alert(n)|n;n=i-n-1)for(i=1;i<=n;)i*=2


g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0(-1)
Тит

@Titus Дякую! Не впевнений, чому я про це не думав
ETHproductions

n<<8|y.charCodeAt()повинен зберегти байт. for(;n;)for(i=!alert(n);i<=n;i*=2)n^=iврятували б ще один байт, але ви не відображатимете 0, що, ймовірно, потрібно.
Арнольд

@Arnauld Дякую Я думав про те, щоб зробити n<<8раніше, але вирішив, що це не спрацює, тому що він зробиться для n з більш ніж 31 бітом. Я думаю, це не має значення, коли я вже розділив його між 31-бітною та 53-розрядною версією ... І, на жаль, я не думаю, що я можу нічого зберегти на спостереженні, попереджаючи про першу. ітерація та остання.
ETHproductions

7

Власне , 14 байт

2@├¿W■├♂≈♂Y2@¿

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

Пояснення:

2@├¿W■├♂≈♂Y2@¿
 @├             encode input in binary
2  ¿            convert from binary to decimal
    W           while the number is not 0:
     ■            print the number without popping
      ├           convert number to binary
       ♂≈         convert each character to an int
         ♂Y       boolean negate each int
           2@¿    convert from binary to decimal

6

05AB1E , 18 байт

Використовує кодування CP-1252 .

Çžz+b€¦J[CÐ,_#bS_J

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

Пояснення

Ç                     # convert string to list of ascii codes
 žz+                  # add 256 to each
    b                 # convert to binary
     €¦               # remove the first digit of each list of digits
       J              # join
        [             # start loop
         C            # convert to decimal
          Ð           # triplicate
           ,          # print 1 copy
            _#        # if the 2nd copy is 0, break loop
              b       # convert 3rd copy to binary
               S      # split to list
                _     # negate each in list
                 J    # join

4

MATL , 13 байт

8W:qZA`tB~XBt

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

Пояснення

8W:q            % Push array [0 1 ... 255]
    ZA          % Take input string and convert it from the base defined by the
                % alphabet [0 1 ... 255] to decimal
      `         % Do...while
       t        % Duplicate
        B       % Convert to binary
         ~      % Negate
          XB    % Convert to decimal
            t   % Duplicate. Used as loop condition: exit if zero

4

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

a=FromDigits;b=IntegerDigits;NestWhileList[a[1-#~b~2,2]&,a[Join@@b[ToCharacterCode@#,2,8],2],#>0&]&

Анонімна функція. Бере рядок як вхідний і повертає список номерів як вихідний.


4

Хаскелл, 109 123 118 102 97 байт

Дякуємо @nimi за збереження 5 байт!

c 0=0
c n=1-mod n 2+2*c(div n 2)
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum

Використання: (++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"

Гарантована робота з числами до 29 біт мовою, як правило, працює до 63-бітових чисел у 64-бітних системах. Використовуйтеmap(fromIntegral.fromEnum) натомість (+14 байт) для підтримки довільно великої кількості.

Працює для діапазону unicode [0..255]. Рекурсивно перегортає шматочки.


1
Ви можете замінити takeWhile(>0)на fst.span(>0). Якщо ви перейдете точково, ви можете скинути ім'я f, тому ваша основна функція (++[0]) ... map fromEnum.
німі

@nimi спасибі, випадання імені вирішує проблему виводу типу, з якою я мав f.
Ангс

Чому fromIntegral? З виклику: "повинен підтримувати ... до 63 біт ... або обмеження вашої мови", тож Intмає бути добре. Якщо ви хочете зберегти його, перемістіть його map, тобто вашу стару версію foldl1та map(fromIntegral.fromEnum).
німі

@nimi OP розмістив тут коментар (з моменту видалення), запитуючи, чи підтримує це 63 біти, тож я припустив, що це було його наміром. Биє мене.
Ангс

4

PHP, 132 126 123 120 108 107 байт

foreach(unpack("C*",$argv[1])as$i)$n=$n*256+$i;for(print$n;$n;)echo _.$n=bindec(strtr(decbin($n),"01",10));
  • друк 0 після циклу замість початкового значення перед циклом зберігає 6 байт.
  • unpackзамість str_splitрендерівord() застарілими -> -3 байтів
  • підкреслення, _оскільки роздільник зберігає 3.
  • bindecзамість того, ltrimщоб прибрати початкові нулі: -12
  • echoв корпусі циклу економить 1 байт на printголові петлі.

Не $n=$n*256+$i;for(print$n;$n;)можна записати як for(print$n=$n*256+$i;$n;)? Оскільки частина завдання буде виконана один раз, це має працювати. І замість цього echo _.$n=[...]слід використовувати echo _,$n=[...]замість цього. Це не збереже жодного байта, але пришвидшить код крихітним крихітним крихітним бітом і розділить заяви. Це означає, що, наприклад, echo _,$a?5:6;можна писати замість echo _.($a?5:6);. Це може бути корисним у майбутньому.
Ісмаїл Мігель

@IsmaelMiguel Частина призначення - це цикл. Я фактично використовую кому, коли мені не потрібна крапка; це залишок від цього printв цьому випадку. Поодинці не варто редагувати; але дякую
Тит

О, так ... Це всередині foreach(unpack("C*",$argv[1])as$i)... Нерозумно мені ... І так, зміна періоду, коли кома має такий же ефект, не вартує клопоту.
Ісмаїл Мігель

4

Perl, 65 байт

53 байти код + 12 для -Mbigint -p.

Дякую @ Dada, що врятував мені 13 байт!

$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0

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

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

echo -n 'Inf' | perl -Mbigint -pE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
4812390
3576217
618086
430489
93798
37273
28262
4505
3686
409
102
25
6
1
0
echo -n 'Infinity' | perl -Mbigint -pE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
5291279215216915577
3932092821637860230
679593196789527673
473328307817319302
103132444486104185
40982743589751686
31074850448176249
4953946570787718
4053252683953273
450346943417222
112603010004089
28134478351238
7049893737593
1746199284614
452823970937
96931842950
40507110521
28212366214
6147372153
2442562438
1852404857
295078790
241792121
26643334
6911097
1477510
619641
428934
95353
35718
29817
2950
1145
902
121
6
1
0

1
Розпакуйте мій друг, розпакуйте! perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'(Я поняття не маю, як зазвичай розпаковувати , мені просто пощастило, коли гуглити, як перетворити рядок у бінарний ;-))
Dada

А-а-а, я завжди забуваю про unpackсинтаксис завжди дує мій розум! Я оновлю, дякую!
Дом Гастінгс

Є perlpacktut, який повинен допомогти ... Я прочитав перші 10 рядків десятки разів, але я дійсно повинен вжити час, щоб прочитати решту!
Дада

@Dada Я впевнений, що я читав його багато разів, він просто ніколи не залишається ... Ще раз дякую -13 - це не маленький подвиг! Мені довелося перейти echo -n- це єдина інша зміна.
Дом Гастінгс

4

Pyth, 12 байт

.usi!MjN2 2C

Програма, яка приймає введення цитованого рядка і друкує результат у вигляді списку цілих чисел.

Перевірте всі тестові випадки

Як це працює

.usi!MjN2 2C  Program. Input: Q
           C  Convert Q to an integer by code-points using base-256 (implicit input)
.u            Apply the following function A(N) until a repeat occurs, storing the results
              in a list:
      jN2       Convert to binary as a list
    !M          Map negation over the above
   i      2     Convert from binary to integer
  s             Integer (Converts final False to 0)
              Implicitly print

3

Python 3, 99 95 байт

x=int.from_bytes(bytes(input(),'utf-8'),'big')
while x:print(x);x^=2**x.bit_length()-1
print(0)

Основна ідея - перетворити рядок у байти в число. Кожна ітерація надрукує вихід і XOR зі всіма 1s, щоб перейти до нуля.


Круглі дужки навколо не потрібні 2**x.bit_length()-1. Порядок операцій на потужність і віднімання вище xor. Також це whileможе бути в одному рядку.
mbomb007

Напишіть цикл while на одному рядку (видаліть новий рядок і відступ)
FlipTack

Спробуйте запустити програму, P=printа потім використати P()замістьprint()
Cyoce

3

Пітон 2, 117 115 байт

Збереження 2 байт завдяки Cyoce.

Передбачає введення, укладене в лапки, наприклад "Inf"

s=input()
n=sum(ord(s[-i-1])<<i*8for i in range(len(s)))
while n:
 print n;k,m=n,1
 while k:k/=2;m*=2
 n^=m-1
print 0

m зараховується до найвищої цифри, так m-1 це маска XOR для виконання потрібної операції. Найдовша частина - це перетворення вводу в початкову бітову послідовність.

Приклад:

"Inf"
4812390
3576217
618086
430489
93798
37273
28262
4505
3686
409
102
25
6
1
0

"Infinity"
5291279215216915577
3932092821637860230
679593196789527673
473328307817319302
103132444486104185
40982743589751686
31074850448176249
4953946570787718
4053252683953273
450346943417222
112603010004089
28134478351238
7049893737593
1746199284614
452823970937
96931842950
40507110521
28212366214
6147372153
2442562438
1852404857
295078790
241792121
26643334
6911097
1477510
619641
428934
95353
35718
29817
2950
1145
902
121
6
1
0

Ви можете замінити -i-1на~i
Cyoce

3

Рубі, 104 101 100 81 80 65 байт

19 байт збережено завдяки @WayneConrad!
15 байт збережено завдяки @philomory!
1 байт збережено завдяки @LeeW!

p n=$*[0].unpack('B*')[0].to_i(2)
p n^=2**n.bit_length-1while n>0

Здійснює введення через аргументи командного рядка.

Натхненний відповіддю @ JimmyJohnson Python


Можливо, ви зможете зберегти кілька символів, замінивши i.to_s(2).rjust 8,'0'на"%08b"%i
Уейн Конрад

Також, я думаю, inject(:+)можна замінити наjoin
Уейн Конрад

@WayneConrad дякую за допомогу! Не знаю, як я забув про них
Cyoce

Радий, що можу допомогти! Дякую, що ви навчили мене методу #bit_length, про який я не знав.
Уейн Конрад

1
Перехід на unpackнаступне, [0]а не возитися gsub, заощадить 11 байт. Перехід на $*[0]замість gets.chop(використання аргументу командного рядка замість введення консолі) збереже ще 9, перший рядок стає p n=$*[0].unpack('B*')[0].to_i(2).
філоморія

3

Лабіринт , 104 103 байти

'  )25 }_';:_';_2/;{
''', 6 2 1   1   { (
 ' | / _ _   _}*2_ $
 * _ :!\ }2_\     !:
 652       @'''''''

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

Пояснення:

Кольорове зображення вихідного коду

Покажчик інструкцій починається з самого лівого верхнього лівого символу (стіни містять пробіли та будь-яку літеру, крім v ).

Помаранчевий:

Цей цикл отримує вхід один символ одночасно у вигляді коду ASCII, додаючи його до поточного значення та помножуючи поточне значення на 256.

  • ' Не-оп
  • ,Натисніть на коду ascii наступної вхідної таблиці до верхньої частини стека або -1, якщо EOF. У цей момент, якщо вхід був отриманий, код повернеться праворуч (рухається вниз), оскільки верхня частина стека є позитивною. Інакше він поверне ліворуч, оскільки верхня частина стека від’ємна.
  • | Виконайте два верхні елементи зі стека та натисніть на результат побіжно АБО.
  • _ Натисніть нуль
  • 256Кожна цифра бачить спливи xі штовхання x*10+digit. Таким чином, це поєднується з нульовим натисканням попереднього натискання 256 до вершини стека.
  • *Поп y, поп x, поштовх x*y. З цього моменту, оскільки верхня частина стека є позитивною, код повернеться праворуч, щоб продовжити цикл.

Синій:

  • )Збільшити верхню частину укладання. Коли кінець введення буде досягнутий, код поверне ліворуч, щоб дістатися до цієї точки зі значенням -1 на стеці, який зросте до нуля.
  • 256 Наявність у верхній частині стека 0 дозволяє нам просунути цю 256.
  • /Поп y, поп xпоштовх x/y(ціле ділення). Оскільки ми множили вхід на 256 кожного циклу, нам потрібно повернути останнє множення.
  • : Дублюйте верхню частину стека, щоб у нас була копія поточного значення для подальшого.
  • ! Виконайте верхню частину стека та надрукуйте ціле значення в STDOUT.
  • \ Друк нового рядка.
  • _2 Притисніть дві до верхньої частини стека.
  • } Перемістіть верхню частину стека до верхньої частини допоміжного штабеля.

Червоний:

Цей цикл перевертає біти поточного значення на XOR з певним значенням, обчисленим у внутрішньому (зеленому) циклі. Потім він виводить поточне значення і виходить із програми, якщо поточне значення дорівнює нулю.

  • _ Натисніть нуль (контрольний потік).
  • ; Відкиньте верхню частину стеку (контрольний потік).
  • :Дублювати поточне значення. Копія буде використана для обчислення XOR.
  • _ Натисніть нуль (контрольний потік).
  • (Зелена петля)
  • $Поп y, поп x, поштовх x XOR y.
  • :! Скопіюйте поточне значення та надрукуйте ціле представлення.
  • Якщо поточне значення дорівнює 0, ми продовжуємо прямо в @і закінчуємо.
  • \ Друк нового рядка.
  • _2} Натисніть 2 і перейдіть до допоміжного стека.
  • _1 Натисніть 1 (контрольний потік).

Зелений:

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

  • _ Натисніть нуль (контрольний потік).
  • ; Відкиньте поточне значення, яке використовується лише для забезпечення управління потоком.
  • _2 Натисніть 2, щоб удвічі зменшити поточне значення.
  • / Розділити
  • { Перемістіть верхню частину вкладної частини до верхньої частини основного стека.
  • _2* Подвойте верхню частину стека
  • } Перемістіть верхню частину основної стеки назад в допоміжну групу.
  • _1 Натисніть один для управління потоком.
  • Після виходу з циклу:
  • ; Відкиньте лівий нуль від обчислення XOR.
  • { Перемістіть обчислений XOR в основний стек.
  • ( Віднімаємо одне зі значення XOR.

2

PowerShell v2 +, 158 байт

for($a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)});$a){[convert]::ToInt64($a,2);$a=$a.TrimStart('0')-split0-replace1,0-join1}

Так, перетворення баз у PowerShell дійсно вдале . І ми тут робимо це двічі.

Гаразд, значить, це просто forцикл на $a- тобто ми циклічаємо так довго, як $aіснує. Зрештою ми дістанемося до порожнього рядка (що є фальсиєю), тож так ми припинимо.

Установка циклу, $a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})приймає вхід $args[0], charпередає його як- масив та проходить цикл через кожен символ. Ми використовуємо .NET [convert]::ToString(int,base)для перетворення кожного у двійковий рядок. Однак це не включає провідні нулі, тому нам потрібно перезапустити цей рядок як [int]і називати його .ToString() метод 8нулями як маску. Потім ці рядки інкапсулюються в парени і редагуються -joinразом, а потім зберігаються в $a.

Всередині циклу ми [convert]::ToInt64(string,base)перетворюємо двійкове число в десяткове число. Це залишається на трубопроводі і згодом вимивається, коли цикл скидається (і тому неявно друкується). Наступний розділ виконує обчислення - ми .TrimStart()видаляємо будь-які провідні нулі, -split0розділяємо на нулі і отримуємо- stringмасив 1s, -replaceті, що мають нулі, і, нарешті, -joinмасив назад разом з 1s. Потім петля починається знову.

PS C:\Tools\Scripts\golfing> .\count-down-from-infinity.ps1 'PPCG'
1347437383
800046264
273695559
263175352
5260103
3128504
1065799
1031352
17223
15544
839
184
71
56
7
0

2

CJam , 17 16 18 байт

q256b0{_p2b:!2bj}j

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

q256b   e# read printable ascii to integer
0       e# value for terminal case
{       e# recursive function
  _p    e#   print current number
  2b    e#   create binary representation with no leading zeros
  :!    e#   flip bits
  2b    e#   convert binary back to integer
  j     e#   recursive call
}j      e# end

ПРИМІТКА: Стара 16-байтна версія не поводилася правильно з порожніми рядками:

q256b{_p2b:!2b}h

Також дякую Деннісу за те, pщо він заощаджує 1 байт за N\розміщення нових рядків у стеку.


_p2b:!2bзберігає байт. Також слід використовувати l; rне вдасться, якщо вхід містить пробіли.
Денніс

@ Денніс Дякую, хоча це зараз викликає занепокоєння, якщо проблема з порожнім рядком.
Лінус

Правильно. qбуде правильно працювати з порожніми рядками.
Денніс


1

Сітківка, 116 байт

Кількість байтів передбачає кодування ISO 8859-1. Рядок 5 містить недруковані байти. Це T`\x00-\xFF.

-2`
±
s{`±(.)
$&$1
}T`-`_o`±.
[^±]+
$.&
±

\d+
$*
+`(1+)\1
${1}0
01
1


{*(`1
01
+`10
011
^0+

)M`1
^0+

T`01`10

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

Не намагайтеся це вводити більше двох символів. (Час вичерпується за допомогою інтерпретатора.) Ми повинні перетворити двійкове в одинарне перед десятковим. : D

На жаль, є кінцевий нуль і передача ліній, але я вирішив припустити, що це нормально, оскільки вихідний результат все ще правильний.

Пояснення

-2`         # Convert ASCII to decimal (ord)
±
s{`±(.)
$&$1
}T`-`_o`±.
[^±]+
$.&
±

\d+         # Decimal to binary
$*
+`(1+)\1
${1}0
01
1


{*(`1       # Loop; Loop print and undo; Convert binary to unary
01
+`10
011
^0+

)M`1        # Unary to decimal; End print and undo
^0+         # Remove leading zeros

T`01`10     # Flip bits; (implicit loop end)

1

Рубін - 70 байт

λ cat inf.rb
n,=$*[0].unpack 'B*';loop{p n.to_i(2);n.tr!('10','01').sub!(/^0*/,'')}
λ ruby inf.rb Hello
310939249775
788572378000
310939249775
238816564112
36061342831
32658133904
1701604463
445879184
90991727
43226000
23882863
9671568
7105647
1282960
814191
234384
27759
5008
3183
912
111
16
15
0
inf.rb:1:in `block in <main>': undefined method `sub!' for nil:NilClass (NoMethodError)
        from inf.rb:1:in `loop'
        from inf.rb:1:in `<main>'

Програма закінчується за винятком після завершення, але я розумію, що це добре, якщо вихід помилок переходить до STDERR, а не STDOUT (що це робить).


1

C, 147 135 133 125 122 121 117 115 103 байт

Збережено 5 байт завдяки @Cyoce!

Збережено 2 байти завдяки @Cyoce та @cleblanc!

Збережено 12 байт завдяки @ceilingcat

i,n;main(p,v)char**v;{while(*v[1])i=i*256+*v[1]++;for(;printf("%d\n",n=i),i;i^=p-1)for(p=2;n/=2;)p*=2;}

Безголівки:

int i;
int main (c,v) {
    char**v;
    while (*v[1]) /* put first command line argument into i as binary */
        i = i*256 + *v[1]++;
    while (i != 0) { 
        printf("%d\n",i);
        int p = 2,n = i;
        while (n /= 2) /* calculate smallest power of 2 > i */
            p *= 2;
        i ^= p - 1; /* flip bits */
    }
}

Я думаю, ви можете залишити свої intдекларації
Cyoce

Ви також можете зберегти байт, перетворивши останній whileцикл у forцикл
Cyoce

А ви можете змінитись while(1)доfor(;;)
Cyoce

@Cyoce Я спробував видалити intдекларації скрізь і отримав gcc -std=89помилки. Але дякую за for(;;)пораду. Я продовжую намагатися видалити intдекларації :)))
Noodle9

вибачте, я не перевіряв цього. Я думаю, що це спрацює, якщо перемістити їх до вершини ( i;main(c,v)char**v;{...}). Зараз на мобільному, тому я не можу бути впевненим
Cyoce

0

C, 129 120 117 110 107 105 байт

long long i,m,n;f(char*v){for(;*v;i<<=8,i+=*v++);for(;printf("%llu,",i),n=i;i^=m-1)for(m=2;n>>=1;m<<=1);}

Тестували с

main (int c, char**v) {
    f(v[1]);
}

вихід

5291279215216915577,3932092821637860230,679593196789527673,473328307817319302,103132444486104185,40982743589751686,31074850448176249,4953946570787718,4053252683953273,450346943417222,112603010004089,28134478351238,7049893737593,1746199284614,452823970937,96931842950,40507110521,28212366214,6147372153,2442562438,1852404857,295078790,241792121,26643334,6911097,1477510,619641,428934,95353,35718,29817,2950,1145,902,121,6,1,0,

Я думаю, ви можете перейти i=0до декларації iта залишити розділ ініціалізації forциклу порожнім
Cyoce

@Cyoce Функція повинна працювати щоразу, коли вона викликається, і оскільки iнеявна глобальна int, її потрібно ініціалізувати кожен раз, коли викликається f (...).
клебланк

@Cyoce Ви мали рацію. Функція не виходить, поки iзнову не буде нуль, тому її все ще можна повторно використовувати.
cleblanc


0

C #, 360 359 байт

using w=System.Console;using q=System.Convert;s={System.Func<int,int,string>S=q.ToString;string t="",f="";for(int i=0;i<s.Length;i++)t+=i>0?S(s[i],2).PadLeft(8,'0'):S(s[i],2);w.WriteLine(q.ToInt64(t,2).ToString());while(t!="0"){f="";foreach(var n in t)f+=n=='0'?'1':'0';t=f.TrimStart(new char[]{'0'});t+=t==""?"0":"";w.WriteLine(q.ToInt64(t,2).ToString());}};

Повна програма:

using w = System.Console;
using q = System.Convert;

class a
{
    static void Main()
    {
        System.Action<string> b = s =>
        {
            System.Func<int,int,string> S = q.ToString;
            string t = "", f = ""; // Var does not work here
            for(int i = 0; i < s.Length; i++)
                t += i > 0 ? S(s[i], 2).PadLeft(8, '0') : S(s[i], 2);
            w.WriteLine(q.ToInt64(t, 2).ToString());
            while(t != "0")
            {
                f = "";
                foreach (var n in t) f += n== '0' ? '1' : '0';
                t = f.TrimStart(new char[] { '0' });
                t += t == "" ? "0" : "";
                w.WriteLine(q.ToInt64(t, 2).ToString());
            }
        };

        b("Inf");
        b("Infinity");
        w.Read(); // prevent close in VS
    }
}

Я не роблю C #, але може var t="";var f="";бути var t="",f=""замість цього? Економить 5 байт.
corsiKa

@corsiKa Так, я спробував це, але це дало мені помилку, я вважаю, що це var, а не рядок.
Йодл

Насправді рядок зберігає один байт, тому я думаю, що я зроблю це саме так.
Йодл

Ви також можете зробити az змінну для нуля, щоб зберегти ці неприємні цитати?
corsiKa

Щойно спробував, він фактично збільшує кількість рахунків, тому що я не можу замінити і рядок "0", і char '0' :(
Yodle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.