Название говорит само за себя. Ваша цель - написать программу, которая формирует прямоугольник символов размером w × h, который можно поворачивать и запускать повторно, чтобы вывести количество выполненных поворотов против часовой стрелки (CCW) на 90 °.
Например, если программа 3 × 2
abc
def
Решил проблему, он первоначально вывел бы 0, и последовательные вращения на 90 ° против часовой стрелки
cf fed da
be cba eb
ad fc
выведет 1, 2 и 3 соответственно.
Использование комментариев делает эту задачу тривиальной в большинстве языков. Например, в Ruby это можно сделать в прямоугольнике 7 × 7:
###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###
Задача состоит в том, чтобы сделать это без каких-либо комментариев.
счет
Ваша оценка w * h, площадь вашего прямоугольника. Новые строки исключены. Другими словами, код-гольф, переводы строк не учитываются.
Оценка для примера Ruby - 49 (хотя, конечно, он недействителен, так как у него есть комментарии).
Примечания
- Ваш код должен быть действительно прямоугольным, без пропущенных символов в конце строк.
- Если вы хотите, вы можете вывести другие допустимые значения «mod 90 °» вместо 0 1 2 3. Так что 8 - это хорошо вместо 0, а -1 - вместо 3 и т. Д.
- Вывод может идти на консоль или в файл.
- Применяются стандартные лазейки.
Я надеюсь, что мой первый вопрос действительно заинтриговывает некоторых людей. Наслаждайтесь!
источник
echo 0;exit;e
в bash разрешен?Ответы:
APL (1x3 = 3)
Это решение использует дополнительное правило, что любой вывод, который является правильным модом 4, работает.
В APL
x!y
- это способ выбораx
элементовy
, обычно известный какbinom(y,x)
илиchoose(y,x)
. Давайте проверим, что каждое вращение дает правильный ответ.0 вращений
Невозможно выбрать 5 элементов из 3, поэтому мы получаем 0, который автоматически печатается.
1 вращение против часовой стрелки
APL с удовольствием оценивает каждую строку, получая номер
3
, оператора!
, а затем номер5
, печатая только последний из них (5
), который равен 1 mod 4.2 вращения против часовой стрелки
Это
binom(5,3)
, что(5*4*3*2*1)/(3*2*1)/(2*1) = 10
, который является 2 мод 4.3 вращения против часовой стрелки
Как и прежде, только последним оцененным значением
3
является принтер.Я на самом деле не знаю APL, поэтому, пожалуйста, скажите мне, если я неправильно понял какое-либо объяснение. Я нашел это методом проб и ошибок как первый язык на этом сайте, который:
Для (5) я пошел вниз по списку двоичных функций APL . Моей первой подходящей операцией было целочисленное деление
/
C и Python 2, но деление APL÷
дает числа с плавающей запятой. Экспонирование заманчиво, но терпит неудачу, потому чтоa
иa^b
имеет тот же паритет, но получаются последовательными вращениями (еслиb=0
, но не тогдаb^a=0
). Булевы операторы, например,<
дают0
и на1
180 градусов друг от друга, что не работает. Наконец, я нашел биномиальный оператор!
и пробовал числа, пока не получил некоторые из этих работ.Спасибо Quincunx за его уверенность, что существует меньшее решение, чем 2x2.
источник
Рубин, 7 × 9 (63)
Немного дольше, чем другое решение, но, по крайней мере, это решение не зависит от неявной печати или нарушения правил. Для всех четырех поворотов полный код анализируется и, кроме некоторого короткого замыкания, выполняется все это. Удивительно, но в коде нет абсолютно никакой симметрии
Это решение основано на том факте, что все еще возможно вызывать
p
функцию (которая используется для печати чисел), даже если переменная с таким именем уже была определена. Например, что-то вродеp p
вызывает функциюp
с переменной вp
качестве аргумента (таким образом, печатая значениеp
).Объяснение некоторых распространенных выражений, используемых в коде:
p
Как упоминалось выше, это либо вызов функции, либо переменная. Когда переменная не определена, это вызывает функциюp
без аргументов, которая ничего не делает и возвращаетnil
.p p
: Печатает переменнуюp
.p|x
: Когдаp
это функция, она идентичнаnil|x
, которая возвращает истину / ложь в зависимости от значенияx
. Еслиp
это целое число, оно побитовое или. В любом случае, это утверждение не имеет побочных эффектов.p=p||x
: Фактически то же самое, что иp||=x
(условное присвоение) с преимуществом синтаксической достоверности и запрета при обращении.Симметричная версия (9 × 10 = 90)
Это самое короткое симметричное решение (C 2, игнорируя числа для печати), которое я мог бы придумать.
Тестовый скрипт
Вот тестовый скрипт для проверки приведенного выше кода (
#
в конце строки были добавлены так, что пробелы не удаляются и удаляются перед выполнением):источник
GolfScript, 4 (2x2)
Печать,
4312
которая является0
(мод 4). Вращения печати3241
(1 мод 4),2134
(2 мод 4) и1423
(3 мод 4).По запросу:
На самом деле существует множество наборов чисел, для которых это работает. Я нашел это с помощью этой программы Python:
Хотя программа выводит
0
s (что, вероятно, не сработает), правильные решения имеют видГде
a∈{4,8}
,b∈{3,7}
,c∈{1,5,9}
,d∈{2,6}
. То(a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}
есть 24 решения.источник
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
n
. Это потому, что четность целого числа равна четности его самой правой цифры, но повороты на 90 градусов должны давать разные четности. Итак,2*2
это минимум для этого подхода.Питон - 23 х 23 = 529
Хорошо, у этого вопроса уже есть победитель, но пока нет решения Python. Вот я и подумал - сильно! - и нашел способ заставить громоздкую
print
команду работать в любом направлении без ошибок при разборе с одного из других направлений.Прорывом стала следующая строчка:
Пока
forward_code
выполняется,backward_code
часть является частью строки и, следовательно, не печатается. Это совсем наоборот при чтении в обратном направлении.Таким образом, в сочетании с еще двумя направлениями и точной настройкой для правильного соответствия всех кавычек я получаю следующее решение:
Изменить: я нашел способ справиться со всеми этими пробелами. ;)
источник
p=print
файл, так как у вас сейчас так много пробелов? (Python 3, конечно)p=print
также длинное. И что еще более важно: вы не можете повторно использоватьp
после поворота кода!Бейсик, 64
Не выиграет, но это все равно. (Проверено на бурундуке Basic )
Примечание:
?
это сокращение дляPRINT
различных диалектов бейсика. Хотя в коде много синтаксических ошибок,END
оператор в первой строке не позволяет интерпретатору увидеть их.источник
END
хотя :)Pyth , 9 символов (3x3)
В Pyth все печатается по умолчанию, если ему не предшествует пробел. Строки после первой строки предназначены для ввода пользователем и не оцениваются в этой программе.
Еще один способ получить 9 символов:
Pyth 1.0.5 , 4 символа
В то время как недавние изменения в pyth усложнили создание двухзначных чисел (изменение, которое я рассматриваю как возврат), более старые версии Pyth имеют простую генерацию двузначных чисел, которая в сочетании с неявной печатью и фактом, что все строки, кроме первой игнорируются, дает следующее решение:
Отпечатки 32,21,14,43.
источник
Befunge, 16
Объяснение: Цифры от,
0
чтобы9
поместить соответствующее число в стек,.
вывести значение из стека и распечатать его как целое число, и@
завершить программу.(проверено здесь )
источник
Пит, 49
Я указал только на то, чтобы использовать желтый и красный цвета, и попытаться сделать его примерно симметричным. При повороте он печатает 0, 1, 2 или 3. Выход из программы в Piet труден и занимает, к сожалению, примерно половину места на картинке.
источник
GNU dc , 6 (3x2)
Я думаю, что это самый короткий ответ, не требующий правила "mod 90 °":
Выходы
0
,1
,2
или3
для каждого вращения.Для
0
,2
и3
вращенийp
просто выскакивает и печатает номер последнего литерал были вытеснены в стек. Для1
поворотаz
толкает текущую глубину стека (1) в стопку, затемp
выталкивает и печатает ее.источник
311\n0p2
, где\n
символ новой строки. Иначе это было бы бессмысленно в контексте dc.GolfScript, 9 (3x3)
Вроде злоупотребления правилами.
}
Происходит закончить программу , если нет соответствия{
, а также содержимого стека печатается в конце программы.источник
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
}
может быть неуравновешенным. Хороший трюк.JavaScript, 4
Когда вы выполняете эту программу (или вращение этой программы) в консоли javaScript, только последняя строка оценивается и отображается в консоли.
Так:
Вот все похожие программы 2x2, которые тоже работают:
Другими словами,
где a находится в [0,4,8], b находится в [3,7], c находится в [1,5,9] и d находится в [2,6]
источник
CJam / GolfScript - 3 * 3
Точка с запятой выводит предыдущее число, поэтому печатается только нижний правый угол.
источник
Ахеуи , 8
Поскольку у Aheui нет буквы, которая помещает 1 в стек, я решил напечатать 0, 5, 2 и 3.
Объяснение: 바 и 반 помещают 0 и 2 соответственно в стек и перемещают курсор вправо на один символ. 뷸 и 뷷 помещают 5 и 3 соответственно в стек и перемещают курсор вниз на два символа. 몽 выскакивает и печатает число в стеке и перемещает курсор вверх на один символ. 희 завершает программу.
источник
JavaScript
(Введено в консоль браузера, оболочку или другой REPL, поэтому результат выводится на печать)
Должен работать на любом другом языке с выражениями, несущественными символами новой строки и автоматической печатью результата.
источник
'2,3\n,0,\n1,0'
.Matlab / Octave -
144100Гольф: 10 х 10 = 100
Альтернативное решение: 15 х 15 = 225
источник
...d....
...i....
...s2...
disp 1..
..3 psid
...4s...
....i...
....d...
..3 psid
. Вам нужно как минимум три точки в начале каждой строки, чтобы обозначить разрыв строки и игнорировать оставшиеся символы.Perl 5x7 (35)
Немного опоздал на вечеринку. Одиночный
-
определяет, какой номер печатается.источник
JavaScript, 3
Это работает ... в базе 7.
Версия Base 9:
объяснение
При запуске в интерактивном режиме, например, из консоли отладки, будет выведено значение последнего оператора / выражения.
4 7 = 4 10 ≣ 0 ( по модулю 4 )
412 7 = 205 10 ≣ 1 ( по модулю 4 )
2 7 = 2 10 ≣ 2 ( по модулю 4 )
214 7 = 109 10 ≣ 3 (мод 4 )
Подобные решения могут быть найдены для любой нечетной базы.
источник
Befunge, 12 (6x2)
Мне удалось немного улучшить существующий ответ Befunge, максимально используя двумерную природу Befunge и располагая путь к коду вертикально в двух направлениях.
Попробуйте онлайн: Начиная с 0 , Вращение 1 , Вращение 2 , Вращение 3 .
источник
Marbelous, 7 * 14 = 98
источник
Argh! / Aargh! (4 * 4 = 16)
Что это было за использование правильного инструмента для работы? Там нет комментариев (на языке в целом).
Все семейство программ (генерируется в J:
((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'
или((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'
)повернут один раз:
повернут дважды:
повернут три раза:
Чтобы объяснить это, может быть лучше взглянуть на «отступ» версию (это также работает во всех поворотах):
Эта версия показывает, что программа состоит из 4 отдельных частей, по одной для каждого отдельного вращения.
h
- установить поток управления влевоp
- распечатать элемент в растре данных / кода под нимq
- выйти из программыисточник
Floater - 9 × 5 = 45
Печать 4, 1, 2 или 3 на консоли.
Обратите внимание, что «Black» является действительной инструкцией (NOP) и является синтаксической. Без этого он не может найти исходную позицию. Таким образом, все позиции в прямоугольнике заняты.
источник
Элемент, 2x3 = 6
Это улучшение по сравнению с наивным решением 3х3,
`
в центре которого стоит цифра с каждой стороны. Случай 0, показанный выше, является наиболее интересным, поскольку*
он используется для умножения 3 на ничто, чтобы получить 0. Кроме этого, это не так сложно.Если вы находите пробел неуклюжим, вы можете заменить его практически любым другим символом, кроме
[]{}`_
.Для справки, вот три других поворота:
источник
Чип, (2х5) 10
*
активирует все соседние элементы: север, восток, юг и запад (источник),~
если не активирован с запада, активирует восточного соседа (NOT-gate) (здесь никогда не активируется)t
прекращает выполнение после печати текущего байта,a
устанавливает бит0x01
выходныхb
наборов бит0x02
выходаe
устанавливает бит0x10
выхода,f
устанавливает бит0x20
выхода,+
если активирован любым соседом, активирует всех остальных соседей (провод)Чип требует либо
-w
флаг (чтобы разрешить выполнение без ввода), либо некоторый ввод для запуска.Отпечатки
0
,1
,2
или3
в ASCII. Если код указывает0x00
на0x03
желаемый, удалитеe
иf
, а затем переместите пространство вверх, чтобы заполнить пробел.источник
Japt , 3 * 1 = 3 байта
Попробуйте онлайн: как есть , повернут один раз , два раза , трижды .
Выходы 0, 5, 2, 11 соответственно.
Переменная
B
содержит значение 11 иNumber.z(other)
является делением по полу (все искали: p). Для многострочного кода последняя строка передается на вывод, который здесь просто является константой.2 * 2 = 4 байта
Попробуйте онлайн: как есть , повернут один раз , два раза , трижды .
Выходы 0, 21, 2, -1 соответственно.
T
содержит 0 иJ
содержит -1.Хитрость заключается в том, что, если два литерала или переменной помещаются рядом, вставляется запятая и вывод является только последним.
Решение 2 * 2 JS работает и в Japt.
источник