Это было тогда, но сейчас все перешли на IPv6 . (Правильно?)
Ваша задача - написать программу, которая распечатывает все адреса IPv6. .
Вы должны написать полную программу, которая не требует ввода и печатает адреса IPv6, по одному на строку, и никаких других выходных данных. Ваша программа должна распечатать все 2 128 возможных адресов, включая недействительные. Каждый адрес должен быть напечатан ровно один раз. Вы можете распечатать адреса в любом порядке.
Каждый адрес может быть напечатан полностью, с 8 группами из 4 шестнадцатеричных цифр, разделенных двоеточиями, например
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Вы можете по своему усмотрению использовать любые стандартные сокращения из RFC 5952 :
- Начальные нули в группе могут быть опущены, за исключением того, что
0
не могут быть сокращены далее. ::
может использоваться не более одного раза для каждого адреса, чтобы сократить последовательность из одной или нескольких групп, состоящих из всех нулей.- Шестнадцатеричные цифры могут использовать строчные или прописные буквы.
Если вы достигнете рекомендации по представлению из RFC 5952 (только строчные буквы, самое короткое из возможных представлений, которое ::
используется как можно раньше, если есть несколько мест, где его можно использовать), вы получите бонус -20% .
Из-за размера вывода ваша программа не должна завершиться, пока мы сидим там. В какой-то момент ваша программа может быть прервана внешними средствами ( Ctrl+ C, отключение питания,…). Ваша программа должна выводить данные в виде потока, чтобы после «разумного» ожидания она выдавала несколько строк. В принципе, создание гигантской строки в памяти только для печати в конце не допускается. Любая программа, которая исчерпала бы память на «стандартном» ПК, дисквалифицируется. (Тем не менее, если ваша программа была запущена достаточно долго, она должна распечатать все адреса IPv6 и затем выйти.)
(Если это условие является проблемой для веб-интерпретаторов, которые запускают программу до завершения, а затем позволяют увидеть выходные данные, и у вас нет размещенного интерпретатора, протестируйте свою программу на уменьшенной версии проблемы, а затем тщательно отрегулируйте ее в полной мере 2 128. )
Ваша оценка - это длина вашей программы в байтах, умноженная на 0,8, если вы получите бонус. Это код гольф, поэтому выигрывает самая низкая оценка.
источник
Ответы:
Pyth, 21 байт
Использует цикл while с
J
переменной итератора. Инициализирует максимальное использование8^chr(' ')
. Дополняет, добавляя это начальное значение, преобразовывая его в шестнадцатеричное, затем удаляя первый символ.источник
Python 3, 65 байт · 0,8 = 52,0
источник
ipaddress
это только python3.Pyth,
272524 байтаПримечание: в коде ранее была ошибка, исправление которой сохранял 1 байт
Печатает адреса как
Предыдущая (более сложная) версия с использованием оператора pad (также 24 байта):
объяснение
Pyth, 21 байт (неверно)
Это не может быть выполнено, так как 1) он будет занимать как минимум 2 132 байта (2 52 йобибайта) памяти и 2) интерпретатору это не понравится (2 128 не подходят
ssize_t
, так что нетlist
такого размера) , Это напечатало бы адреса в лексикографическом порядке. Вы можете попробовать алгоритм, изменив число (и) в конце на что-то пригодное для использования.источник
C (с расширениями GCC), 76 байтов * 0,8 = 60,8
Это использует 128-битное расширение числа GCC просто подсчитывать от
::
доffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
.inet_ntop()
правильно форматирует каждый адрес, чтобы получить бонус -20%.Выход
Использование
sed
для вывода каждой миллионной строки до 10 миллионов:Примечание. Я использую машину x86_64 с прямым порядком байтов, и сетевые адреса обычно всегда в сетевом порядке (big-endian), так что порядок байтов эффективно заменяется с помощью
inet_ntop()
. Это не имеет значения - все адреса будут (в конечном итоге) отображаться.источник
CJam,
3627 байт-9 байтов благодаря @Dennis (я забыл, что CJam имеет форматирование строк). Печатает адреса строчными и нисходящими.
По понятным причинам используйте интерпретатор Java, а не онлайн. Вы можете заменить
G32#
что-то меньшее для тестирования онлайн, например, вот последние 100 .объяснение
источник
0000:0000:0000:0000:0000:0000:ffff:ffff
. Похоже, форматирование строк может работать по-другому в Интернете. Я подтвердил, что он работает нормально с автономной версией.n
такой же, какoNo
в TIO .Python 2.7, 67 байт
В качестве побочного эффекта метода, используемого для вставки двоеточий, адреса печатаются с крайним правым столбцом, появляющимся слева:
источник
[printing] the addresses in any order
. ;)Верилог, 335
Моя первая заявка на Verilog, возможно, могла бы использовать больше игры в гольф, но у меня нет сил сделать это прямо сейчас.
c
это часы,o
это ASCII выход. Не подходит для форматирования бонуса из-за заполнения нулями вместо сокращения.Это простая итерация, за которой следует небольшая перестановка битов, чтобы сделать вывод ASCII. Я нарезаю толстую кишку после последней группы с небольшим взломом. Синтезирует и, кажется, работает для xc3s500e-4ft256-4 на ISE 13.7 lin64.
источник
C 91-126 байт
Моя оригинальная версия, 119 байт.
Лучшая портативная версия для гольфа, 103 байта (спасибо @Dennis за некоторые из этих концепций)
Пояснение: сам алгоритм достаточно прост. Я использовал long, а не unsigned int, потому что он короче. Объявление их на уровне файлов означает, что все предварительно инициализировано нулями.
f
Функция представляет собой простое приращение с переносом , который работает на низких 16 бит каждого слова. Цикл заканчивается, когда он переносится в 129-й бит.Итерация в обратном направлении для printf означает, что мы печатаем адреса в «правильном» порядке, а также проверка на печать новой строки на несколько символов короче.
Это действительно использует некоторые непереносимые конструкции. Лучше всего рассматривать его как диалект K & R языка C, поскольку он использует неявные типы возвращаемых int и не включает stdio.h. И мое использование long было основано на этом - в большинстве современных систем int достаточно, потому что он 32-битный. Вероятно, это может работать без изменений на PDP-11 Unix.
Однако это может быть короче. Если предположить, что мы можем использовать int (либо как тип шире, чем 16 бит, либо как тип точно 16 бит с различными свойствами, которые оказываются истинными во многих системах, таких как дополнение к двум и арифметический ролловер), мы можем избавиться от материал, связанный с использованием долго.
Версия для int шире 16 бит, 97 байт.
Версия для 16-битных систем, 91 байт.
Как ни странно, однако, оригинальный компилятор K & R на самом деле не поддерживал объявление без int (он прекрасно компилируется, но обрабатывает переменные как внешние и, следовательно, неопределенные во время компоновки), поэтому необходимы дополнительные три байта, чтобы изменить объявление на
int*p,a[9];
for всего 94.Кроме того, если предположение, что оно прервано до завершения вывода, было жестким ограничением, мы могли бы удалить проверку конца, сохранив пять байтов.
Бонус: полностью портативная версия ANSI, 126 байт:
Новые строки во всех версиях вставляются для удобства чтения и в местах, где пробелы не требуются, и исключаются из числа байтов, за исключением новой строки после
#include
строки в версии ANSI.Все версии, за исключением версии ANSI, проваливаются в конце main и поэтому могут возвращать ложный код выхода в операционную систему.
источник
a[9];f(int*x){if(++*x>>16)*x=f(x+1);}main(i){for(;!a[8];f(a))for(i=8;i--;)printf(i?"%x:":"%x\n",a[i]);}
i--
проверке состояния.a[0]
и завернитеa[1]
AutoIt3,
142231 байтобъяснение
For $a=0 To 2^32-1
: Итерация 4 раза по 0-2 ^ 32 ((2 ^ 32) ^ 4 = 2 ^ 128) возможных комбинаций.$s=StringFormat("%08x%08x%08x%08x",$a,$b,$c,$d)
: Преобразовать числа в шестнадцатеричную строку длиной 32 (4 * 32).For $j=0 To 8
: Перебрать все 8 разделов строки.ConsoleWrite(StringMid($s,$j*4+1,4)&($j<7?":":""))
: Извлеките следующие 4 символа из строки и добавьте двоеточие (:
) в конце, если мы не достигли последнего раздела, затем выведите все на консольNext
: Конец внутреннего цикла forConsoleWrite(@LF)
: Добавить перевод строки в конце строкиNext
: Конец внешних петельОжидаемый размер вывода: (одна строка (39 байт) + перевод строки) (= 40 байт) * 2 ^ 128 = 1,311 * 10 ^ 16 YB (йоттбайт)
источник
4^64 - 1
?Корица, 16 байтов
Попробуйте онлайн. (TIO ограничивает вывод)
объяснение
g
Режим ставит корицу камедь в режиме генерации . Остальная часть строки распаковывается в это регулярное выражение:Затем он создает генератор всех возможных строк, которые соответствуют регулярному выражению, и перебирает его, распечатывая каждую из них.
Несколько забавно, регулярное выражение для гольфиста
([0-9a-f]{4,4}:){7,7}[0-9a-f]{4,4}
фактически сжимается в более длинную строку, чем приведенное выше.источник
Commodore BASIC 2.0, 339 байт
Чтобы получить шестнадцатеричные цифры в нижнем регистре, эта программа написана в «сдвинутом режиме» (нажмите
<SHIFT>+<C=>
)Простая работа над Commodore 64 была сложной задачей из-за памяти, размера экрана, размера данных и других ограничений. Я рассмотрел реализацию сокращенного представления, но другие ограничения (такие как недокументированная невозможность использования элементов массива в качестве индексов цикла) означали, что это увеличит длину программы примерно на 1000 байтов.
Строка 7 является реализацией
HEX$()
, которой нет в Commodore BASIC 2.0. Я не могу использоватьDEF FN
для этого, потому что они могут только возвращать числа, а не строки. Строка 6 - это подпрограмма, которая применяет ее к группе из четырех цифр, которая была бы значительно короче, если бы функции могли возвращать строки.Строки 2 и 5 представляют собой восемь вложенных циклов, реализованных в виде семи циклов «for» и условного перехода, поскольку восемь циклов «for» в сочетании с двумя «gosub» для распечатки адреса переполнят крошечный стек C64.
C64 может распечатывать около 1,2 адреса в секунду, по оценкам, время выполнения 1,3 * 10 ^ 31 года.
источник
PowerShell (v4),
193 166 162 145103 байтБезмонтичная версия TimmyD на 103 байта:
Предыдущая версия с бонусом в 145 * 0,8 = 116 байт
С помощью TimmyD и Tomkandy , который указывает на это,
0 -eq $false
но([bigint]0) -eq $true
. Так что все мои предыдущие версии не прекратятся.Ранее в 162, перед некоторыми изменениями регулярных выражений:
«Задача, в которой PowerShell должен быть достаточно конкурентоспособным!» - Я, прежде чем я попробовал это.
объяснение
источник
for($g=[bigint]::pow(2,128);$g;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^0+:',''}
for($g=[bigint]::pow(2,120);$g;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^0*:',''}
for($g=[bigint]::pow(2,128);$g-gt0;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^\d*:',''}
Да, первый адрес неверен, но в конце он не повторяется. Также обратите внимание, чтоwhile($i)
по вашему не остановится на нуле -[boolean][bigint]0
оценивается как истина0:
: /)$i=[bigint]::Pow(4,64);while($i-gt0){('{0:X32}'-f($i-=1)-replace'0(?=.{32})'-replace'.{4}(?!$)','$0:')}
на 103 ...AutoIt3, 137 байт
источник
4^64 - 1
?Python 2, 95 байт
Просто проходит через все числа от 0 до 2 ^ 128. Сначала он преобразует текущее число в шестнадцатеричную строку, а затем удаляет то
'0x'
, что дает эта функция. Затем он корректирует строку, чтобы иметь 32 нуля впереди, а затем разбивает ее на группы по четыре. Наконец, он объединяет группы по четыре с двоеточиями, выводит их на печать и добавляет 1 к текущему числу. Имеет дополнительный бонус, что вы можете запустить его на любом значении, если вы его дадите, но ввод не требуется.источник
Haskell 111
С моей собственной функцией последовательности
s
он больше не теряет память, но больше не чувствует себя в гольфе.источник
CBM BASIC v7.0 (166 символов)
Ответ Марка на BASIC 2.0 Commodore 64, в котором отсутствует встроенная команда для печати чисел в шестнадцатеричном формате. Однако, благодаря
HEX$()
функции BASIC 7.0, версия Commodore 128 стала намного короче. Он не помещается в одну логическую строку (которая на C128 ограничена 160 символами), но все еще может вводиться как две отдельные строки в прямом режиме.источник
Руби 75
Это рекурсивное решение, которое принимает каждый префикс и находит все возможные суффиксы. Рекурсивный.
источник
x=->s,n{...};x['',8]
Tcl
341318301источник