Обычно говорят, что «Делать X без Y» может быть ловушкой для начинающих, пишущих задачи ( источник ). Тем не менее, я дерзкий и думаю , что я могу определенно сделать X без Ys. Случайным образом. О да, это будет хорошо.
Задача: Учитывая нечетное целое число, n
большее или равное 1, выведите ex длины стороны, n
состоящей из случайных печатаемых символов ascii без "y" и "Y", и пробел. Все разрешенные символы должны иметь ненулевую вероятность появления, но не обязательно одинаковую. Это код-гольф, поэтому выигрывает самый короткий код в байтах. Вы должны, однако, рандомизировать каждый символ - то есть, стойки бывшего не должны быть равны, если только случайно.
Символы появляются
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Построение бывшего
Длина стороны 1:
x
Длина стороны 3:
x x
x
x x
Длина стороны 5:
x x
x x
x
x x
x x
и т.п.
Пример выходов
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Пример реализации
Вам не нужно обрабатывать неверные данные.
!
к~
SANsy
иY
y
и然
.Ответы:
Pyth,
28272625 байтТестирование.
источник
~
персонажа, потому что диапазон не включает его. Вы можете исправить это, изменив~
код в буквальном символе DEL.Рубин, 102 байта
Array#sample
не делает повторений для выборки из набора символов, но это нормально, потому что распределение символов не должно быть абсолютно равномерным! Рекурсивная функция, возвращает массив строк.Попробуйте онлайн!
источник
На самом деле, 62 байта
Это одна из самых длинных на самом деле программ, которые я когда-либо писал.
Попробуйте онлайн!
Объяснение:
Часть 1 : настройка списка персонажей
Попробуйте онлайн!
Часть 2 : построение логического массива для X
Попробуйте онлайн!
Часть 3 : выбор случайных символов
Попробуйте онлайн!
источник
Mathematica, 146 байт
Анонимная функция. Принимает число в качестве ввода и возвращает строку в качестве вывода.
источник
Python 2, 171 байт
Гарантируется выбор случайных символов с одинаковой вероятностью.
Попробуйте это здесь: Ideone Link
РЕДАКТИРОВАТЬ: Спасибо Морган Трепп за исправления.
источник
from random import*
экономит 2 байта. Вы также можете соединить первые две строкиj
цикла точкой с запятой, чтобы сохранить несколько байтов. (Также я верюZ
и у{
меня больше шансов на появление, чем у некоторых других писем, не то, чтобы это имело значение для вопроса)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 байтовЭто прямая реализация создания квадратного символа за символом. Если символ находится по диагонали : используйте случайный символ, иначе : используйте пробел. Это также использует подстановку регулярных выражений и случайное int для генерации не- Yсимволов:
Пояснение [Старый]
Обновить
import*
- Спасибо @KevinLauисточник
randint
Вероятно, короче для ваших целей, плюсfrom random import*
. Кроме того, удалите часть этого ненужного пробела.[i,33][i in(89,121)]
работает вместо того, чтобы нуждаться в многословной троице в вашейf
функции! Также посмотрите, можете ли вы удалить пробел, который находится сразу после вашихprint
утвержденийre.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
экономит 6 байтов по... if ... else ...
конструкции.Дьялог АПЛ , 35 байт
⎕
запросить номер⍳
1 через эту∘.=⍨
таблицу числового равенства (т. е. диагональ имеет 1с)(⊢∨⌽)
ИЛИ ее зеркальное отображение (дает обе диагонали)95×
умножить на 95, а?
между диагоналями - от 1 до 95, rand - от 0 до 1 для остальных⌊
этажей до чтобы избавиться от числа с плавающей запятой,(⊢+∊∘57 89)
добавьте единицу к элементам, которые являются членами {57,89} (Yy - 32),32+
добавьте 32, чтобы сделать 0 в пробелах, а другие числа в нужном диапазоне⎕UCS
преобразовать в текстTryAPL !
источник
Python 2.7, 205 байт:
Попробуйте онлайн! (Ideone)
источник
MATL , 28 байт
Попробуйте онлайн!
Все разрешенные символы имеют одинаковую вероятность появления. Работает даже для ввода.
источник
C, 154 байта (или 119 без котельной пластины)
Или 119 байт как функция
X(h)
сsrand(time(0))
заботой о другом месте:Сломать:
источник
машинный код x86, 70 байт
Мой исполняемый код разобран:
Это функция, которая получает размер X в ecx и указатель на выходной буфер в edx.
Он заполняет выходной буфер последовательно байтами. Есть
2 * n - 1
итерации (равные количеству непробельных символов для вывода). На каждой итерации выполняется следующее:Преобразование из случайного числа в случайный символ не примечательно:
Интересной частью является подсчет количества мест. Он должен генерировать следующие числа (пример для N = 9):
Числа взяты поочередно из двух арифметических прогрессий. Первый идет вниз с шагом -2, а второй идет вверх с шагом 1. Когда первая прогрессия достигает -1 (в середине X), возникает сбой (-1 удаляется), а затем прогрессии меняют направление.
Прогрессии сохраняются в регистрах
ebx
иedx
- старшие частиbh
иdh
сохраняют текущий номер, а младшие -bl
иdl
сохраняют шаг. Чтобы чередовать прогрессии, код меняет регистры сxchg
.Когда прогрессия достигает -1 (вокруг
mylab
метки), она увеличивает оба регистра, переключая шаги с-2, 1
на-1, 2
. Это также меняет роли регистров, а затем меняет верхние части регистров.В конце функции хранится нулевой байт, указывающий конец строки.
источник
Луа, 277 байт
Ну ... Луа оооочень хорошо манипулирует струнами: D. Первый раз мне пришлось использовать
local
в заявлении! Я мог бы сохранить некоторые байты, используя Lua 5.1 вместо 5.3, потому что они перенесли глобальную функциюunpack
в объектtable
на Lua 5.2. Но я предпочитаю придерживаться последней версии, которую я имею :).Определяет функцию, которая должна вызываться с одним параметром (второй используется в целях рекурсии) и возвращает строку.
Ungolfed
источник
JavaScript (ES6),
137131125 байтГде
\n
представляет буквальный символ новой строки. Редактировать: 1 байт сохранен путем перемещения' '
внутриString.fromCharCode
выражения. Сэкономил 5 байтов, сделав мою генерацию случайных символов неоднородной; выражениеr+72&95
равно нулю для значений, которые отображаются наY
иy
и!
генерируется на их месте. Сэкономила 4 байта, когда поняла, что при распространенииString.fromCharCode
избегать необходимостиjoin
. Сохранено 2 байта, украдя трюк у @ edc65.источник
PowerShell v2 +, 112 байт
Читает ввод из командной строки.
Для каждой строки создается массив пробелов, правильные индексы заполняются символами, извлеченными из функции
f
, затем массив char объединяется для вывода в виде одной строки.источник
[char]
приведение за пределыRandom
и перевернув-join
оператор, чтобы он был унарным оператором ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
PowerShell эквивалентом лямбды и используя call-оператор&
для его вызова. Следующее составляет 103 байта -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, перемещая[char]
бросание быть[char[]]
литы на$a
(замену' '
для32
в процессе), и перемещения$z
определения «s в Паренсе в первый раз , это называется. До 99 (Woo! Sub-100!) -Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
$a
определение в скобки при первом его использовании. Теперь до 98 -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
думаю, я остановлюсь здесь ;-) хе-хеMATLAB, 86 байт
Некоторые примеры:
источник
changem
! Отличное имя!Пип , 33 байта
32 байта кода, +1 для
-l
флага. Как ни странно, код начинается сY
и заканчиваетсяy
...Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
Строит сетку соответствующего размера; заменяет элементы на диагонали случайным не-y символом, а все остальные элементы - пробелом.
источник
php, 135 байт
Довольно простой подход использует str_pad для создания строки пробелов требуемой длины, заменяет необходимые символы случайными, а затем заменяет любые Y (без учета регистра) на X и выводит строку.
Создает 2n + 3 уведомления, но, как обычно, это нормально.
источник
Emacs Lisp, 269 байт
Не подвергнутый изменению и слегка измененный:
источник
JavaScript (ES6), 128
131Редактировать 3 байта, сохраненные thx @Neil
Такой громоздкий, наверное, не самый лучший подход. Бонус - работает с нечетным или четным вводом.
источник
r+7&31
дает тот же результат, что и(r&31)-25
.C 268 байт
Позвоните
f()
с размеромx
чтобы нарисовать.источник
srand
внутри своих функций, они не могут полагаться на глобальное состояние. Однако вы можете добиться гораздо более короткой программы с двумя вложенными циклами и использованием символа возврата. Общее решение может выглядеть следующим образом , но я думаю, что использование конкретного варианта Windowsclock
будет правильным.gcc version 4.8.1
для Windows , иgcc version 5.3.0
для Cygwin это не работает ... (на IdeOne Works)Матрицы , 79 байтов (не конкурирующие)
Matricks выделяется как начало создания x и всех случайных значений, но проваливается, когда дело доходит до условных выражений ...
Я отметил это как неконкурентоспособное, потому что мне пришлось исправить несколько ошибок и заставить все новые функции работать после того, как эта проблема была опубликована.
Бежать с
python matricks.py x.txt [[]] <input> --asciiprint
Объяснение:
Это также поддерживает четные числа.
источник
Python 2,
204191183 байтаХорошо, конкуренция Python здесь становится жесткой. Вот моя попытка побрить как можно больше байтов.
К настоящему времени я застрял(хорошо, снова застрял).Кредиты @NonlinearFruit для выбора случайных символов.
183-байтовая версия:
Попробуйте онлайн! (Ideone)
Главное изменение - переписать условное
как
который экономит 7 байтов.
191 байтовая версия:
Попробуйте онлайн! (Ideone)
Основные изменения пути выбираются случайные символы и некоторый код перегруппировка , такие как
s=input();i=s;
статьs=i=input();
, удаляяr=range
задание , как он больше не нужен , и вызывающиеabs
непосредственно , как это приводит к меньшему количеству байт коды.Превышение предыдущего кратчайшего ответа в Python на 1 байт!@Р. Подход Kap используется для генерации случайных символов. Каждая итерация цикла while выводит строку ex.204-байтовая версия :
Попробуйте онлайн! (Ideone)
Беззвучная версия, чтобы понять, как это работает:
Было трудно справиться с 1-символьным регистром!
источник
SmileBASIC, 97 байт
Вместо того, чтобы рассчитывать количество пробелов между каждым символом или чем-то, я решил просто напечатать во всех местах, где
X==Y
илиX+Y==Size+1
.Генератор случайных символов просто добавляет 1, если он генерирует
y
илиY
,z
и , таким образомZ
, немного чаще, чем обычно.источник
PHP, 100 байт
принимает входные данные из аргумента командной строки; беги с
-nr
.комбинированный цикл печатает символы в зависимости от положения
сломать
источник