Напишите прямоугольную программу, в которой будет показано, сколько раз она была повернута


63

Название говорит само за себя. Ваша цель - написать программу, которая формирует прямоугольник символов размером 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 и т. Д.
  • Вывод может идти на консоль или в файл.
  • Применяются стандартные лазейки.

Я надеюсь, что мой первый вопрос действительно заинтриговывает некоторых людей. Наслаждайтесь!


1
Чтобы быть более точным в том, что такое комментарий, является ли комментарий каким-либо недооцененным кодом? Непарсированный код?
Исаак

Я имею в виду, что ни один из традиционных «символов комментариев» вашего языка не должен появляться ни в одной из 4 повернутых версий. Так что для C ++ две косые черты рядом друг с другом не должны появляться, хотя одну можно использовать отдельно. Аналогично с / *. Я надеюсь, что это проясняет.
Увлечения Кэлвина

А как насчет языков, в которых нет символов комментария?
Исаак

Так код как echo 0;exit;eв bash разрешен?
jimmy23013

Если нет возможности комментировать, вам не нужно беспокоиться. @ user23013 Это хорошо.
Увлечения Кэлвина

Ответы:


43

APL (1x3 = 3)

5!3

Это решение использует дополнительное правило, что любой вывод, который является правильным модом 4, работает.

В APL x!y- это способ выбора xэлементов y, обычно известный как binom(y,x)или choose(y,x). Давайте проверим, что каждое вращение дает правильный ответ.

0 вращений

5!3

Невозможно выбрать 5 элементов из 3, поэтому мы получаем 0, который автоматически печатается.

1 вращение против часовой стрелки

3
!
5

APL с удовольствием оценивает каждую строку, получая номер 3, оператора !, а затем номер 5, печатая только последний из них ( 5), который равен 1 mod 4.

2 вращения против часовой стрелки

3!5

Это binom(5,3), что (5*4*3*2*1)/(3*2*1)/(2*1) = 10, который является 2 мод 4.

3 вращения против часовой стрелки

5
!
3

Как и прежде, только последним оцененным значением 3является принтер.

Я на самом деле не знаю APL, поэтому, пожалуйста, скажите мне, если я неправильно понял какое-либо объяснение. Я нашел это методом проб и ошибок как первый язык на этом сайте, который:

  1. Автоматически печатает результат выражения
  2. Учитывая несколько строк выражений, выводит только последнее
  3. Нет проблем с оператором, стоящим один на линии
  4. Берет операторы инфикса
  5. Имеет односимвольный арифметический двоичный оператор, который является асимметричным (aRb! = BRa) и достаточно гибким, чтобы возвращать различные числа.

Для (5) я пошел вниз по списку двоичных функций APL . Моей первой подходящей операцией было целочисленное деление /C и Python 2, но деление APL ÷дает числа с плавающей запятой. Экспонирование заманчиво, но терпит неудачу, потому что aи a^bимеет тот же паритет, но получаются последовательными вращениями (если b=0, но не тогда b^a=0). Булевы операторы, например, <дают 0и на 1180 градусов друг от друга, что не работает. Наконец, я нашел биномиальный оператор !и пробовал числа, пока не получил некоторые из этих работ.

Спасибо Quincunx за его уверенность, что существует меньшее решение, чем 2x2.


6
Чувак, приятно видеть ответ, который использует неэзотерический язык и побеждает .
Стюарт П. Бентли

Я принял это как ответ, так как он самый короткий по моим правилам, но я хочу сделать ответ Вентеро ( codegolf.stackexchange.com/a/33162/26997 ) очень достойным упоминанием. Это следует истинной сути проблемы.
Увлечения Кельвина

Это также работает в J в точной форме, которую вы дали.
ɐɔıʇǝɥʇuʎs

На самом деле, не печатает ли APL 3 и 5 в повороте на 90 °?
FUZxxl

@FUZxxl Я думаю, что это работает только в ngn / apl.
Адам

40

Рубин, 7 × 9 (63)

 30;p  
0||p=p 
0|0;p;p
;p;p|p;
p=p ||0
;p   p;
2||p =p
 00;1  
     p 

Немного дольше, чем другое решение, но, по крайней мере, это решение не зависит от неявной печати или нарушения правил. Для всех четырех поворотов полный код анализируется и, кроме некоторого короткого замыкания, выполняется все это. Удивительно, но в коде нет абсолютно никакой симметрии

Это решение основано на том факте, что все еще возможно вызывать 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)

    p    

  0 * 0  
  00100  
  0||2* p
p *0||0  
  00300  
  0 * 0  

    p    

Это самое короткое симметричное решение (C 2, игнорируя числа для печати), которое я мог бы придумать.

Тестовый скрипт

Вот тестовый скрипт для проверки приведенного выше кода ( #в конце строки были добавлены так, что пробелы не удаляются и удаляются перед выполнением):

rotate=->s{s.split($/).map{|i|i.chars.reverse}.transpose.map(&:join).join($/)}

s=<<EOD.gsub(?#,"")
 30;p  #
0||p=p #
0|0;p;p#
;p;p|p;#
p=p ||0#
;p   p;#
2||p =p#
 00;1  #
     p #
EOD


puts ">>> 0°"
eval s
puts ">>> 90°"
eval rotate[s]
puts ">>> 180°"
eval rotate[rotate[s]]
puts ">>> 270°"
eval rotate[rotate[rotate[s]]]

10
Это может быть не самое короткое, но это именно тот вид запутанного блеска, который я искал: D
Увлечения Кэлвина

1
@ Calvin'sHobbies Соответствует ли это ограничению "Ваш код должен быть прямоугольным без пропущенных символов в конце строк"?
Джошуа Тейлор

@JoshuaTaylor Это прямоугольник, некоторые строки просто дополнены пробелами (что, на мой взгляд, является символом). Если по какой-либо причине это не будет соответствовать ограничению, я мог бы вместо этого дополнить строки точкой с запятой ...
Ventero

@ Ventero Я, конечно, надеюсь, что это законно; Я просто пытаюсь понять, что имелось в виду в вопросе.
Джошуа Тейлор

1
@Ventero Заполнение пробелами (или что-то еще, кроме комментариев и новых строк) просто отлично.
Увлечения Келвина

33

GolfScript, 4 (2x2)

43
12

Печать, 4312которая является 0(мод 4). Вращения печати 3241(1 мод 4), 2134(2 мод 4) и 1423(3 мод 4).

По запросу:

Если вы хотите, вы можете вывести другие допустимые значения «mod 90 °» вместо 0 1 2 3. Так что 8 - это хорошо вместо 0, а -1 - вместо 3 и т. Д.

На самом деле существует множество наборов чисел, для которых это работает. Я нашел это с помощью этой программы Python:

def f(a,b,c,d):
    return int("%i%i%i%i"%(a,b,c,d))
for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                candidate = f(a,b,c,d) % 4 == 0
                candidate &= f(b,d,a,c) % 4 == 1
                candidate &= f(d,c,b,a) % 4 == 2
                candidate &= f(c,a,d,b) % 4 == 3
                if candidate:
                    print("%i, %i, %i, %i"%(a,b,c,d))

Хотя программа выводит 0s (что, вероятно, не сработает), правильные решения имеют вид

ab
cd

Где 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 решения.


7
Очень умно. Я честно думал, что дополнительное правило было безобидным.
Увлечения Кэлвина

4
@ Все отмечают, что это не самая маленькая из возможных программ. Возможно 2x1, и это наименьшее возможное. Так что приступай к работе!
Джастин

1
@isaacgYour score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
подземный

2
@Quincunx Хорошо, тогда отправь это!
Томсминг

1
Предполагая, что язык здесь просто печатает последнее число, которое он оценивает, я не верю, что решение 1 * n (одно число) существует для любого n. Это потому, что четность целого числа равна четности его самой правой цифры, но повороты на 90 градусов должны давать разные четности. Итак, 2*2это минимум для этого подхода.
xnor

30

Питон - 23 х 23 = 529

Хорошо, у этого вопроса уже есть победитель, но пока нет решения Python. Вот я и подумал - сильно! - и нашел способ заставить громоздкую printкоманду работать в любом направлении без ошибок при разборе с одного из других направлений.

Прорывом стала следующая строчка:

'"\'';forward_code;"';backward_code;""\'"''

Пока forward_codeвыполняется, backward_codeчасть является частью строки и, следовательно, не печатается. Это совсем наоборот при чтении в обратном направлении.

Таким образом, в сочетании с еще двумя направлениями и точной настройкой для правильного соответствия всех кавычек я получаю следующее решение:

''"''""''"''"''"'"''""'
"  ""                 "
"  \\                 "
'"\'';print 1;"'""\'"''
'"\''"';3 tnirp;""\'"''
"  ;""                "
"  p'                 "
'  r;                 '
'  i2                 '
"  n                  "
"  tt                 "
'   n                 '
'  4i                 '
"  ;r     .-=<>=-.    "
' \"p    /__----__\   '
"  ';'  |/ (')(') \|  "
"  ""    \   __   /   "
'  ""    .`--__--`.   '
"  \\   /    :|    \  "
'  ''  (_)   :|   (_) '
'  ""    |___:|____|  '
"  ''    |_________|  "
''"''""''"''"''"'"''""'

Изменить: я нашел способ справиться со всеми этими пробелами. ;)


Есть ли способ также вставить p=printфайл, так как у вас сейчас так много пробелов? (Python 3, конечно)
Исаак

@isaacg: я так не думаю. Определение p=printтакже длинное. И что еще более важно: вы не можете повторно использовать pпосле поворота кода!
Фалько

Я полагаю, вы правы. Это два плохо, хотя.
Исаак

12
Номинация: Награда за лучшее использование пробелов.
Примо

24

Бейсик, 64

Не выиграет, но это все равно. (Проверено на бурундуке Basic )

?0:END:?
:::::::1
D:::::::
N::::::E
E::::::N
:::::::D
3:::::::
?:DNE:2?

Примечание: ?это сокращение для PRINTразличных диалектов бейсика. Хотя в коде много синтаксических ошибок, ENDоператор в первой строке не позволяет интерпретатору увидеть их.


1
На самом деле, ваши оценки 64 и 16 соответственно. Новые строки не учитываются. Кроме того, почему бы не разделить ответ?
Джастин

Ох, пропустил этот бит. Я бы разделил ответы, если бы они не занимали совместное последнее место. Похоже, в этом нет особого смысла :-)
брезгливый оссифраж

Ты больше не последний :-)
Джастин

Я бы дал вам бонусные баллы за хорошее количество символов. Фактический +1 для творческого использования ENDхотя :)
CompuChip

21

Pyth , 9 символов (3x3)

0 1

3 2

В Pyth все печатается по умолчанию, если ему не предшествует пробел. Строки после первой строки предназначены для ввода пользователем и не оцениваются в этой программе.

Еще один способ получить 9 символов:

"0"
3 1
"2"

Pyth 1.0.5 , 4 символа

В то время как недавние изменения в pyth усложнили создание двухзначных чисел (изменение, которое я рассматриваю как возврат), более старые версии Pyth имеют простую генерацию двузначных чисел, которая в сочетании с неявной печатью и фактом, что все строки, кроме первой игнорируются, дает следующее решение:

32
41

Отпечатки 32,21,14,43.


Ну, это просто весело. +1
seequ

Черт, я надеялся, что это было не так просто. Вам не хватает 3 символов в средней строке, но я предполагаю, что это из-за автоматического форматирования здесь.
Увлечения Кэлвина

@ Calvin'sHobbies Извините, я вижу. Это сломало мои конечные пробелы.
Исаак

@Quincunx О, я пропустил эту часть оценки. Спасибо за исправления.
Исаак

18

Befunge, 16

0.@1
@@@.
.@@@
3@.2

Объяснение: Цифры от, 0чтобы 9поместить соответствующее число в стек, .вывести значение из стека и распечатать его как целое число, и @завершить программу.

(проверено здесь )


Разве это не выводит число раз, когда оно было повернуто против часовой стрелки?
Seequ

@TheRare Да. Оно делает. Это то, что он должен делать.
Джастин

1
Я, кажется, совершенно слепой. Имейте +1 из-за этого.
Seequ

Befunge !!! Тем не менее, мой любимый язык во все времена, вечно, так всегда!
Штеффен

16

Пит, 49

Программа Пиет

Я указал только на то, чтобы использовать желтый и красный цвета, и попытаться сделать его примерно симметричным. При повороте он печатает 0, 1, 2 или 3. Выход из программы в Piet труден и занимает, к сожалению, примерно половину места на картинке.


1
Похоже, правильный инструмент для работы.
Роберт Фрейзер

О_о, я плакал, узнав об этом языке программирования! Прямо сейчас. Красивый. Во многих отношениях! Спасибо!
Штеффен

15

GNU dc , 6 (3x2)

Я думаю, что это самый короткий ответ, не требующий правила "mod 90 °":

3z1
0p2

Выходы 0, 1, 2или 3для каждого вращения.

Для 0, 2и 3вращений pпросто выскакивает и печатает номер последнего литерал были вытеснены в стек. Для 1поворота zтолкает текущую глубину стека (1) в стопку, затем pвыталкивает и печатает ее.


1
Так что 311 / 0p2 тоже подойдет?
Нил

@Neil Да, хорошо. Хотя это не влияет на счет в гольфе :)
Digital Trauma

Это влияет на счет в гольфе, но отрицательно, так как переводы строк не учитываются, а косые черты.
М.Херцкамп,

@ M.Herzkamp Я предположил, что Нил имел в виду 311\n0p2, где \nсимвол новой строки. Иначе это было бы бессмысленно в контексте dc.
Цифровая травма

10

GolfScript, 9 (3x3)

0}1
} }
3}2

Вроде злоупотребления правилами. }Происходит закончить программу , если нет соответствия {, а также содержимого стека печатается в конце программы.


Не забывайте считать символ новой строки.
Исаак

2
@isaacgYour score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
подземный

Я не знал, что это }может быть неуравновешенным. Хороший трюк.
Питер Тейлор

9

JavaScript, 4

03
12

Когда вы выполняете эту программу (или вращение этой программы) в консоли javaScript, только последняя строка оценивается и отображается в консоли.

Так:

12 modulo 4 == 0
01 modulo 4 == 1
30 modulo 4 == 2
23 modulo 4 == 3

Вот все похожие программы 2x2, которые тоже работают:

03
12

03
16

03
52

03
56

03
92

03
96

07
12

07
16

07
52

07
56

07
92

07
96

43
12

43
16

43
52

43
56

43
92

43
96

47
12

47
16

47
52

47
56

47
92

47
96

83
12

83
16

83
52

83
56

83
92

83
96

87
12

87
16

87
52

87
56

87
92

87
96

Другими словами,

ab
cd

где a находится в [0,4,8], b находится в [3,7], c находится в [1,5,9] и d находится в [2,6]


8

CJam / GolfScript - 3 * 3

2;3
;7;
1;0

Точка с запятой выводит предыдущее число, поэтому печатается только нижний правый угол.


6

Ахеуи , 8

바몽희뷸
뷷희몽반

Поскольку у Aheui нет буквы, которая помещает 1 в стек, я решил напечатать 0, 5, 2 и 3.

Объяснение: 바 и 반 помещают 0 и 2 соответственно в стек и перемещают курсор вправо на один символ. 뷸 и 뷷 помещают 5 и 3 соответственно в стек и перемещают курсор вниз на два символа. 몽 выскакивает и печатает число в стеке и перемещает курсор вверх на один символ. 희 завершает программу.


5

JavaScript

(Введено в консоль браузера, оболочку или другой REPL, поэтому результат выводится на печать)

1+2
-3-
4+5

Должен работать на любом другом языке с выражениями, несущественными символами новой строки и автоматической печатью результата.


2
Мне нравится идея, стоящая за этим, но не всегда ли печатать 1 (мод 4)?
zennehoy

2
Более простой вариант может быть '2,3\n,0,\n1,0'.
Кин

Это дает разные результаты при повороте. @ Кори, это умно! Я слишком привык работать на языке без оператора запятой.
августа

@ lrn Да, это дает разные результаты, но это не требование. Программа должна печатать 0 (мод 4), когда не повернуто, и 1, 2 или 3 (мод 4), когда повернуто соответствующее количество раз ...
zennehoy

Второе примечание оригинального плаката допускает любые значения для повернутых версий, если они различны.
ЛРН

5

Matlab / Octave - 144 100

Гольф: 10 х 10 = 100

....d.....
....i.....
....s.....
... p2 ...
disp  1...
...3  psid
... 4p ...
.....s....
.....i....
.....d....

Альтернативное решение: 15 х 15 = 225

.......d.......
.......i.......
.......s.......
...    p    ...
...         ...
...    4    ...
...    .    ...
disp 1...3 psid
...    .    ...
...    2    ...
...         ...
...    p    ...
.......s.......
.......i.......
.......d.......

Можно ли уменьшить первое решение до размера 8x8, если вертикальные и горизонтальные операторы «disp» разделяют букву «p»? ...d.... ...i.... ...s2... disp 1.. ..3 psid ...4s... ....i... ....d...
AMK

@AMK: К сожалению, это приводит к синтаксической ошибке в строке ..3 psid. Вам нужно как минимум три точки в начале каждой строки, чтобы обозначить разрыв строки и игнорировать оставшиеся символы.
Фалько

5

Perl 5x7 (35)

1+p+t+1
-print+
1+i+i+1
+tnirp+
1+t+p+1

Немного опоздал на вечеринку. Одиночный -определяет, какой номер печатается.


4

JavaScript, 3

2
1
4

Это работает ... в базе 7.

Версия Base 9:

2
7
0

объяснение

При запуске в интерактивном режиме, например, из консоли отладки, будет выведено значение последнего оператора / выражения.

4 7 = 4 100 ( по модулю 4 )
412 7 = 205 101 ( по модулю 4 )
2 7 = 2 102 ( по модулю 4 )
214 7 = 109 103 (мод 4 )

Подобные решения могут быть найдены для любой нечетной базы.


Это было помечено, но я не понимаю вопрос или ответ, поэтому мне пришлось пропустить его. Было бы хорошо, если бы downvoters оставили комментарий, объясняющий их downvotes.
Рейнболт

@Rusher Я подозреваю, что они не поняли базовый 7 бит.
Примо


2

Marbelous, 7 * 14 = 98

.. \/ \/ .. ..
.. 31 \\ 32 \/
\/ \\ \/ \\ \/
\/ 30 \\ 33 ..
.. .. \/ \/ ..

Ожидаете ли вы, что каждая клетка останется неповрежденной при вращении?
Спарр

2

Argh! / Aargh! (4 * 4 = 16)

Что это было за использование правильного инструмента для работы? Там нет комментариев (на языке в целом).

Все семейство программ (генерируется в J: ((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'или ((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph')

hpqh
q01p
p32q
hqph

повернут один раз:

hpqh
q12p
p03q
hqph

повернут дважды:

hpqh
q23p
p10q
hqph

повернут три раза:

hpqh
q30p
p21q
hqph

Чтобы объяснить это, может быть лучше взглянуть на «отступ» версию (это также работает во всех поворотах):

hhpq h
  0  h
q   1p
p3   q
h  2  
h qphh

Эта версия показывает, что программа состоит из 4 отдельных частей, по одной для каждого отдельного вращения.

  • h - установить поток управления влево

  • p - распечатать элемент в растре данных / кода под ним

  • q - выйти из программы


2

Floater - 9 × 5 = 45

введите описание изображения здесь

Печать 4, 1, 2 или 3 на консоли.

Обратите внимание, что «Black» является действительной инструкцией (NOP) и является синтаксической. Без этого он не может найти исходную позицию. Таким образом, все позиции в прямоугольнике заняты.


1

Элемент, 2x3 = 6

1*
`2
3 

Это улучшение по сравнению с наивным решением 3х3, `в центре которого стоит цифра с каждой стороны. Случай 0, показанный выше, является наиболее интересным, поскольку *он используется для умножения 3 на ничто, чтобы получить 0. Кроме этого, это не так сложно.

Если вы находите пробел неуклюжим, вы можете заменить его практически любым другим символом, кроме []{}`_.

Для справки, вот три других поворота:

case 1
*2 
1`3

case 2
 3
2`
*1

case 3
3`1
 2*

0

Чип, (2х5) 10

b~
+a
~t
e*
 f

*активирует все соседние элементы: север, восток, юг и запад (источник),
~если не активирован с запада, активирует восточного соседа (NOT-gate) (здесь никогда не активируется)
tпрекращает выполнение после печати текущего байта,
aустанавливает бит 0x01выходных
bнаборов бит 0x02выхода
eустанавливает бит 0x10выхода,
fустанавливает бит 0x20выхода,
+если активирован любым соседом, активирует всех остальных соседей (провод)

Чип требует либо -wфлаг (чтобы разрешить выполнение без ввода), либо некоторый ввод для запуска.

Отпечатки 0, 1, 2или 3в ASCII. Если код указывает 0x00на 0x03желаемый, удалите eи f, а затем переместите пространство вверх, чтобы заполнить пробел.


0

Japt , 3 * 1 = 3 байта

5zB

Попробуйте онлайн: как есть , повернут один раз , два раза , трижды .

Выходы 0, 5, 2, 11 соответственно.

Переменная Bсодержит значение 11 и Number.z(other)является делением по полу (все искали: p). Для многострочного кода последняя строка передается на вывод, который здесь просто является константой.


2 * 2 = 4 байта

2J
1T

Попробуйте онлайн: как есть , повернут один раз , два раза , трижды .

Выходы 0, 21, 2, -1 соответственно.

Tсодержит 0 и Jсодержит -1.

Хитрость заключается в том, что, если два литерала или переменной помещаются рядом, вставляется запятая и вывод является только последним.

Решение 2 * 2 JS работает и в Japt.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.