Чарівні попконт числа


25

Існує відомий складний алгоритм підрахунку кількості встановлених бітів у 32-бітному цілому цілому:

int popcount(unsigned x) {
   x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
   x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
   x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
   x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
   x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);
   return x;
}

Я не поясню це тут. Але уявіть собі подібний код для 512-бітних цілих чисел! Шістнадцяткові константи були б величезними і мали б досить малюнок. Ваше завдання - просто надрукувати цей точний вихід :

0x55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
0x33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff
0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff
0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff
0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff
0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Немає пробілів, проте, будь-який номер нового рядка необов’язковий.

Це , тому найкоротша відповідь (у байтах) виграє.


Чи дозволяється нам приймати дані (як у чомусь на зразок 0x0x0x0x0x0x0x0x0x)?
ouflak

@ouflak No. ———
Лінн

Відповіді:


3

05AB1E , 26 22 21 байт

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

9F„0x0NÍo×9ooNoo>÷hJ,

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

Пояснення

9F                      # for N in [0 ... 8]
  „0x                   # push the string "0x"
     0NÍo×              # push 2**(N-2) zeroes
          9oo           # 2**2**9
                 ÷      # //
             Noo>       # (2**2**N+1)
                  h     # converted to base-16
                   J    # join everything to string
                    ,   # print with a newline

Інші версії, які можуть бути вдосконалені

9F9ooNoo>÷h¾6o×J7o£R…0xÿ,
9F9ooNoo>÷h0žy×ìR7o£R…0xÿ,
9FX0No×1No×JCh7o×1K7o£…0xÿ,
8ÝovX0y×1y×JCh7o×1K7o£…0xÿ,
9F1NoÅ0D>)˜JCh1K7o×7o£…0xÿ,

21

Python 2, 52 49 46 байт

К-то число задається числом 2**512/(2**2**k + 1). Це для 512-бітного числа, тому тривіально розширити візерунок на різну ширину.

l=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9

3 байти збережено завдяки Деннісу.
3 байти збережено завдяки xnor.


2
Переваги довільних точних цілих чисел ...
ETHproductions

Приємно. Це економить кілька байт.
Денніс

Коротше продовжуйте проводити квадрати:l=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9
xnor

1
Це зігріває моє серце, щоб побачити Python у голосуванні :)
Тобіас Кіенцлер

4
@TuukkaX Я просто маю багато досвіду роботи з тріщинними хакерами. Я багато використовував Wolfram Alpha для спрощення сум і подібного. Але в основному я зробив малюнок 01010101, 00010001, 00000001, а потім множаться на те 1, 11, 1111щоб отримати правильні бінарні шаблони. Наприклад, 01010101ви можете отримати формулу для певної ширини w, зробивши sum 2^(2*k) for k = 0, w/2 - 1та дізнавшись, що це (2**w - 1)/3.
orlp

7

PHP, 111 110 108 байт

Один байт збережено завдяки @ user59178.

<?=($p=str_pad)("0x",130,5).$p($s="\n0x",131,3);for($x=1;$x<65;$x*=2)echo($p($s,131,$p(0,$x,0).$p(f,$x,f)));

Який шаблон для 1024 біт? : D


1
Ви можете зберегти байт за допомогою, $x<65а не $i++<7. Цього разу я тестував це і все.
user59178

6

Сітківка , 43 байти

:`
0x128$*5
:`5
3
;{:`33
0f
0(f+)(0+)
0$2$1

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

Пояснення

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

:`
0x128$*5

Це замінює порожній вхід з 0xнаступним 128 5с і друкує його для створення першого рядка.

:`5
3

Цей замінює 5s на 3s, щоб генерувати другий рядок і друкує його також.

;{:`33
0f

Це останній спеціалізований рядок, і він перетворюється кожні два 3s 0fдля створення третього рядка. Це також починає цикл через останні два етапи ( {). Однак цей етап нічого не зробить після першої ітерації, окрім друку поточного стану. В ;пригнічує вихід в самому кінці програми , щоб уникнути дублювання в останньому рядку.

0(f+)(0+)
0$2$1

Ця заміна тепер перетворює кожен рядок у наступний, замінюючи кожну іншу пару fs і 0s. Умова "кожна інша пара" виконується шляхом зіставлення нуля перед значком f, що унеможливлює співставлення послідовних пар, оскільки збіги не можуть перетинатися.


6

Vim, 32 байти

i5<CR>3<Esc>qqYpVrf$<C-V>{yPG1vr0q6@q<C-V>{I0x<Esc>

Мені потрібно тільки вручну написати перший 5і 3, а макрос бере на себе всі решта, «подвоюючи кількість біт» кожен раз , коли він працює. Порядок дій у макросі трохи дивний (зробіть новий fрядок, блокуйте копію, повторно використовуйте розмір візуального блоку, щоб поставити 0s у fрядку), але це найшвидший варіант, який я знайшов.


5

Pyth, 26 байт

V9%"0x%0128x"/^2 512h^2^2N

Порт моєї відповіді Python.


5

J, 46 34 байт

Я працюю над гольфом над цим, але ця дитина любить триматися на 46 байтах ... Більше! -12 байт завдяки милям!

'0x',"1'5','3','0f'(128$#)"{~2^i.7

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

Результат

   '0x',"1'5','3','0f'(128$#)"{~2^i.7
0x55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
0x33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff
0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff
0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff
0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff
0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Для цієї відповіді мені знадобилося (в ідеалі) дієслово з рангом 0 1, щоб використовувати його у u"vвизначенні рангу; проте милі спостерігали, що 0 _було достатньо для виконання завдання.

┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│= │< │<.│<:│> │>.│>:│+ │+.│+:│* │*.│*:│_ 0 0│_ 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│- │-.│-:│% │%.│%:│^ │^.│$ │$.│$:│~.│~:│0 0 0│0 _ _│0 _ _│0 0 0│2 _ 2│0 0 0│0 0 0│0 0 0│_ 1 _│_ _ _│_ _ _│_ 0 0│_ 0 0│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│| │|.│, │,.│,:│; │;:│# │#.│#:│! │/:│\:│0 0 0│_ 1 _│_ _ _│_ _ _│_ _ _│_ _ _│1 _ _│_ 1 _│1 1 1│_ 1 0│0 0 0│_ _ _│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│[ │[:│] │{ │{.│{:│}.│}:│".│":│? │?.│a │_ _ _│_ _ _│_ _ _│1 0 _│_ 1 _│_ 0 0│_ 1 _│_ 0 0│1 _ _│_ 1 _│0 0 0│_ 0 0│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│A │A.│b │C │C.│d │D │e │e.│E │E.│f │H │_ _ _│1 0 _│_ _ _│_ _ _│1 1 _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│0 _ _│_ _ _│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│i │i.│i:│I │I.│j │j.│L │L.│M │o │o.│p │_ _ _│1 _ _│0 _ _│_ _ _│1 _ _│_ _ _│0 0 0│_ _ _│_ 0 0│_ _ _│_ _ _│0 0 0│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│p.│p:│q │q:│r │r.│s │s:│S │t │T │u:│x:│1 1 0│0 _ _│_ _ _│0 0 0│_ _ _│0 0 0│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

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


Дієслово з рангом 0 _тут добре. Ви можете скоротити його до 34 байт за допомогою'0x',"1'5','3','0f'(128$#)"{~2^i.7
миль

@miles Huh. Я думав, що спробував це ... круто! і я забув про функцію автоматичного заповнення рядків J, ще раз дякую!
Conor O'Brien

4

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

9r`╙╙u9╙╙\#"0x%0128x"%`Mi

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

Це рішення використовує той факт, що f(n) = 2**512//(2**2**n + 1)(де //є floored поділ) для порівняння значень.

Пояснення:

9r`╙╙u9╙╙\#"0x%0128x"%`Mi
9r`╙╙u9╙╙\#"0x%0128x"%`M   for n in range(1, 10):
      9╙╙\                   2**2**9//
   ╙╙u                                (2**2**n + 1)
          #"0x%0128x"%       pad with zeroes to 128 digits, prefix with "0x"
                        i  flatten and implicitly print

4

JavaScript (Firefox 30+), 139 113 112 92 83 80 байт

_=>[for(x of"970123456")(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):'0x')(128)].join`
`

Нарешті потрапив на рекурсивне солодке місце :-) Використовує зручне розуміння рядків для збереження 3 байтів .map:

_=>[..."970123456"].map(x=>(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):'0x')(128)).join`
`

.replace також 83 байти:

_=>"970123456".replace(/./g,x=>(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):'0x')(128)+`
`)

Якби дозволений провідний новий рядок, це також буде 80 байт:

_=>"970123456".replace(/./g,x=>(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):`
0x`)(128))


3

Bubblegum , 65 байт

00000000: c5cb 4501 0441 1043 d17b d4fc 254b d110  ..E..A.C.{..%K..
00000010: f7cb 9761 9e7a 8d45 e451 4ce4 564c 04d7  ...a.z.E.QL.VL..
00000020: 2e11 b02b 8f08 80df aa5e 11fe fc77 762c  ...+.....^...wv,
00000030: 428b 5b8e ae8b 30c1 13b6 ce8b b091 377a  B.[...0.......7z
00000040: 01                                       .

Обов’язкова відповідь Bubblegum.


3

Хаскелл, 84 72 байти

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

import Text.Printf
mapM(\n->printf"0x%0128x\n"$div(2^2^9)$2^2^n+1)[0..8]

94 байт альтернативи без потужності Text.Printf:

import Data.List
mapM(putStrLn.("0x"++))$transpose$("53"++).reverse<$>sequence(["0f"]<*[1..7])

r=[0..127]
mapM(putStrLn.("0x"++))$('5'<$r):('3'<$r):[["0f"!!mod(div x(2^y))2|x<-r]|y<-[0..6]]

@nimi whoops, повинні бути завантажені Control.Monadв REPL. Виправлено.
Ангс

3

PowerShell v2 +, 68 байт

5,3|%{"0x"+"$_"*128}
($a=1)..7|%{"0x"+('0'*$a+'f'*$a)*(128/($a*=2))}

PowerShell не має довільних точних цілих чисел без використання [bigint]викликів, і їх не можна легко перетворити на шістнадцятковий, тому ми натомість трактуємо це як виклик на основі рядків.

Перший рядок обробляє повторювані 5та 3просто виконуючи множення рядків на 128символи та додаючи a0x на передній панелі.

Наступний рядок замикається з $a=1на 7, кожна ітерація виводить інший рядок. Знову ми 0xвставили на передню частину, і ми робимо множення рядків в середині, щоб побудувати відповідне число 0та fоб'єднати разом, а потім робити рядкове множення цього на відповідну кількість символів. Зверніть увагу, що ми тут використовуємо змінну $a, а не лічильник циклу $_, тому ми можемо належним чином масштабувати (інакше нам знадобиться циклічно виглядати 1,2,4,8,16,32,64|%{...}, що довше).

Отримані рядки залишаються на конвеєрі, а виведення за допомогою неявних Write-Outputвідбувається при завершенні програми з новим рядком між елементами.


3

V , 43 байти

64i0fòYpÓ¨¨0«©¨f«©©û2}/²²³³òdd{3ÄÒ5jÒ3Îi0x

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

Тут використовується один із найдовших стислих регексів, які мені колись знадобилися у відповіді V. Ось більш читаема версія, де я додав байт для читабельних регулярних виразів і змінив недрукований символ втечі на<esc>

64i0f<esc>òYpÓö((0+)(f+)){2}/²²³³òdd{3ÄÒ5jÒ3Îi0x

Пояснення (використовуючи читану версію):

64i0f<esc>                                          " Insert 64 "0f"s and escape to normal mode
          ò                      ò                  " Recursively:
           Yp                                       "   Duplicate this line
             Ó                                      "   Substitute:
              ö                                     "     (Optionally Turn the readable version on)
               ((0+)(f+))                           "     One or more '0's followed by one or more 'f's
                         {2}                        "     Repeated twice
                            /                       "   With:
                             ²²                     "     The second capture group twice (the '0's)
                               ³³                   "     Followed by the third capture group twice (the 'f's)
                                                    "   Once the search is not found, the loop will break
                                  dd                " Delete a line (because we have one too many)
                                    {               " Move to the first line
                                     3Ä             " Make three copies of this line
                                       Ò5           " Replace the first one with '5's
                                         jÒ3        " Move down a line and replace the second with '3's
                                            Î       " On every line:
                                             i0x    "   Insert a '0x'



2

Пакетна, 216 байт

@echo off
set s=5
call:c
set s=3
call:c
set a=0
set b=f
for /l %%i in (1,1,7)do call:l %%i
exit/b
:l
set s=%a%%b%
:c
for /l %%j in (0%1,1,6)do call set s=%%s%%%%s%%
echo 0x%s%
set a=%a%%a%
set b=%b%%b%

2

Vim 72 байти

i0x128a5Ypll128r3o0x64a0fa0Ypqqffdt0fft0p@qq@qqwYp@qq@w@w@w@w:%s/0$

СпробуйтеItOnline!

Недруковані матеріали:

i0x^[128a5^[Ypll128r3o0x^[64a0f^[a0^[Ypqqffdt0fft0p@qq@qqwYp@qq@w@w@w@w:%s/0$

4 @wсек в кінці клопочуться мене, але, оскільки я покладався на те, @qщо не вдалося вийти в кінці рядка, він також виходить з ладу @w. Я можу спробувати просто запустити q 32 рази і побачити, чи це переплутує пізніші рядки.


2

C, 146 байт

#define F for(i=0;++i<129;)s[i+1]=
#define P ;puts(s);
i,j;f(){char s[131]={'0','x'};F'5'P F'3'P for(j=1;(j*=2)<129;){F(i-1)%j<j/2?'0':'f'P}}

Безголівки:

#define F for(i=0;++i<129;)s[i+1]=
#define P ;puts(s);
i,j;f(){
  char s[131]={'0','x'};
  F'5'P
  F'3'P
  for(j=1;(j*=2)<129;){
    F(i-1)%j<j/2?'0':'f'P 
  }
}


2

мозковий ебать , 211 байт

+++++++>++>>-[>>>>+<<++<+<-----]>--->>++++++++++>++<<<<<<[->----[>+++<--]>-->.<.++++++++[->>>>.<<<<]>>>.>--[<]<<]+<[->>----[>+++<--]>-->.<.++++++++[<<[>+>->.<<<-]>[<+>>->>.<<<-]>]>>>.<<<<[-<+>]<[->++<]>[-<+>]<<]

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


1
197 байт через різні перевірки циклу. Я майже впевнений, що зараз xгенератор можна перемістити поза циклу
Джо Кінг,



1

C #, 168 байт

()={string R="",o="0",f="f";for(int i=0,j;i<9;i++){R+="0x";if(i>2){o+=o;f+=f;}for(j=0;j<128;){R+=i<1?"5":i<2?"3":o+f;j+=i>1?(int)Math.Pow(2,i-1):1;}R+="\n";}return R;};

1

Стакс , 19 байт

⌡hÅék╝94"ºé♪╛#V┐5í╒

Запустіть і налагоджуйте його

Розпакований, неозорений та прокоментований, це виглядає приблизно так.

512r        [0..511]
{:Brm       convert each to bits and reverse each
M           transpose matrix, filling missing elements in rectangle with zero
m           map over each element of array, using the rest of the program.  outputs implicitly.
  4/        split bits into groups of 4
  {:b|Hm    convert each 4-bit binary number to single digit hex string
  .0xp      print "0x" without newline

Виконати цей


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