Рисунок и земля


32

фигура и земля
Источник: Википедия

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

  1. Напишите программу, которая не принимает никаких данных и печатает строку figure. Единственными разрешенными пробельными символами в вашей программе являются пробелы (кодовая точка 0x20) и новые строки (возврат каретки, 0x0D, перевод строки, 0x0A или их комбинация).
  2. Игнорируя символы новой строки, количество пробелов (кодовая точка 0x20) и непробельных символов должно быть одинаковым. Например, это будет действительная программа (на гипотетическом языке):

    ab c 
       d
    e f
    

    Обратите внимание, что в первой строке есть пробел.

  3. Если вы поменяете местами n- й пробел с n -ным непробельным символом, программа должна groundвместо этого напечатать . Для приведенного выше примера программа будет выглядеть так:

      a b
    cde 
     f 
    

    Обратите внимание, что на второй и третьей строках есть пробелы.

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

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

Это , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.

Вспомогательный скрипт

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

Leaderboard

Ответы:


20

Желе , 20 байт

фигура

“¦ĠȮ“©ụd» Ṃ         

Девять концевых пробелов. Попробуйте онлайн!

земля

         “ ¦ĠȮ“©ụd»Ṃ

Нет пробелов. Попробуйте онлайн!

Как это работает

Во-первых, обратите внимание, что пробелы не являются атомами, поэтому пробельные символы вне строковых литералов никак не влияют на программу.

Строковые литералы используют встроенное в словарь сжатие строк на основе словаря для получения нужных слов. Сжатый строковый литерал начинается с , заканчивается »и используется внутри для создания массива строк.

В фигурном программе, “¦ĠȮ“©ụd»дает строку пару ( «рисунок», «землю») , а атом выбирает лексикографические минимальную, т.е. «цифру» .

В наземной программе вместо этого “ ¦ĠȮ“©ụd»выдает пару строк («логически Abacs», «земля») . Лексикографический минимум теперь «наземный» , который выбирает покорно.

В обоих случаях интерпретатор автоматически печатает последнее возвращаемое значение, т. Е. Выбранный минимум, в STDOUT.


14

Python 2, 53 байта

Замените ·пробелом в обоих ответах:

····················
print'······figureground'[6:12]#

Печать figure.

print'figureground'[
······6:12]#····················

Печать ground.


14

05AB1E , 15 14 байтов

фигура

 'ŠÂ,'í¶      

Попробуйте онлайн!

земля

'       ŠÂ,'í¶

Попробуйте онлайн!

Использует кодировку CP-1252 . Обратите внимание на конечные пробелы. В программе Figure это обычная программа без ошибок. Распаковывает следующие слова:

'ŠÂ  ->  figure
'í¶  ->  ground

Запятая печатает всплывает и печатает figureслово с новой строки. Поскольку что-то было напечатано, верхняя часть стопки больше не печатается.

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

'<space>

помещает пробел на вершину стека. ŠВращает стек, который имеет арность 3 . В стеке только один элемент и нет входных данных, так что это дает исключение, очищая стек. ÂРазветвляется в верхней части стеки, но имеет ту же историю, что и циклический сдвиг оператор. Так что в основном ,команда ничего не печатает.

Это означает, что программа будет по-прежнему выводить вершину стека, который есть 'í¶. В результате чего ground.


9

Сетчатка , 31 байт

Рисунок:

|       
фигура
 | земля
      

Основание:

 | цифра

|       
земля

Рисунок и Земля . Обе программы требуют, чтобы STDIN оставалось пустым, чтобы быть действительными программами фигуры или наземными.


9

Pyth, 30 байт

фигура

"figure" "ground              

14 конечных пробелов.

Тест

земля

Нет пробелов

        "       figure""ground

Тест

Как это работает

Скорее всего, пробел подавляет печать в Pyth, в то время как строковые литералы без закрытия "неявно закрываются.

Поэтому первая программа состоит из двух строк, "figure"и "ground ". Первая строка неявно печатается, а печать второй подавляется, то есть просто figureпечатается.

Вторая программа состоит из двух строк, " figure"и "ground". Печать первой подавляется, а вторая печатается неявно, то есть просто groundпечатается.


6

MATL , 37 байт

Первая программа

'figure'         
%x'ground'         

Каждая строка имеет 9 пробелов.

Попробуйте онлайн!

Вторая программа

    'figure'%
      x'ground'

Здесь нет траловых мест.

Попробуйте онлайн!

объяснение

Ничего страшного ...

  • Пробелы и переводы строк между операторами игнорируются MATL.
  • % является символом комментария, который игнорирует остальную часть строки.
  • x удаляет вершину стека.
  • Стек неявно печатается в конце программы.

6

Java, 180 байт

Заменить .пробелом.

Отпечатки "фигура":

class
A{public
static
void
main(String[]a){System.out.println(
//"ground"
//
.....
........
......
....
...................................
..
........
..........
....
"figure");}}

Отпечатки "земля":

.....
........
......
....
...................................
..........
..
class
A{public
static
void
main(String[]a){System.out.println(
//
"ground"
//"figure"
);}}
............


4

Mathematica, 50 34 байта

Использует среду REPL. (Добавление Print[]оболочки с равным количеством пробелов увеличит количество байтов на 14.) Две программы

01figure+0 1ground                

(с 16 пробелами) и

          0       1figure+01ground

Ключевым моментом здесь является то, что Mathematica рассматривает объединение цифр без пробелов как одно число, но промежуточные пробелы интерпретируются как соседнее умножение, так же как и объединение чисел и имен произвольных переменных. Итак, первое выражение оценивается 1*figure+0*1*groundкак figure: второе выражение оценивается 0*1*figure+1*groundкак ground.


4

PHP, 44 42 байта

рисунок: (16 пробелов, 5 пробелов между цифрой &;)

echo''?ground:figure     ;                 

площадка: (20 ведущих мест)

                     echo' '?ground:figure;

Довольно просто на самом деле, работает, потому что ''обманчив и ' 'правдив. Используйте как:

php -r "echo''?ground:figure     ;                "
php -r "                    echo' '?ground:figure;"

редактирование: 2 ретроспективно очевидных байта сохранены благодаря Мартину Эндеру


3

Haskell, 96 94 88 82 77 байт

Первая программа, печать "figure":

main              =          putStr$idid"ground"
idid    _          ="figure"

Вторая программа, печать "ground":

    main=putStr$id id"ground"                   
    idid _="figure"         

Вызывает одну из двух функций с разными именами


3

Haskell, 88 65 байт

main=putStr
...........--
.."figure"..........
--"ground"........

а также

...........
main=putStr..
--........"figure"--
.........."ground"

.указывает на пробел Просто --жонглирование комментариями (-> ).


3

Python 2, 52 байта

........................
print"figure"
an
d
"ground"

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

Базовая версия просто использует andдля печати второй строки.


Альтернативные (более длинные) попытки:

.......
print(#"ground")#
"figure")...................


print"figure"""and"ground"
.............
.............

3

JavaScript (ES6), 56 байт

alert('figure'
                //&&'ground'
           )
              
alert('figure'//            
&&'ground') 

На рисунке нет пробелов.


Я считаю 56 байт для каждой программы, если только новые строки не учитываются. Я сомневаюсь, что это станет немного короче.
ETHproductions

@ETHproductions Тьфу, вот что происходит, когда вы подсчитываете байты вручную :-(
Нил

2

Rail , 56 байтов

фигура

$'main'
 -[figure]o                
-          [ground]o

На второй строке 16 пробелов. Программа завершается с ошибкой.

Попробуйте онлайн!

земля

       
$ 'main' - [figure] o
 - [земля] о         

В первой строке 7 пробелов, а в последней строке 9 пробелов. Эта программа также завершается с ошибкой.

Попробуйте онлайн!

объяснение

Rail ищет строку, начинающуюся с (обозначение регулярного выражения), \$.*'main'чтобы найти точку входа. Поезд (указатель инструкций) начинает $движение с юго-востока. Вещи, которые не достижимы поездом, могут быть полностью проигнорированы для программы. Это включает в себя все, что находится на одной линии с точкой входа. Поскольку -юго-восток от $поезда сразу поворачивает на восток, обе программы просто сводятся к:

 -[figure]o
 -[ground]o

[...]обозначает строковый литерал и oпечатает его. Обычно вам нужно #завершить рельс, но если вы пропустите его, программа все равно завершится (но жалуется на STDERR, что поезд разбился).


2

> <> , 39 байт

Использование ·для представления пространства.

фигура

v·
"·dnuo
e·
r·
u·
g··
i··
f···
"·
>·o·

Попробуйте онлайн!

земля

·v
·"····
·d
·n
·u
·oe
·ru
·gif
·"
·>·o

Попробуйте онлайн!

Обе программы завершаются с ошибкой.

объяснение

При написании кода вертикально, я был в состоянии повторно использовать gи rмежду обоими решениями, а также цитаты и >и oдля выходного контура.

В обоих случаях единственный исполняемый бит - это столбец ниже v, который помещает буквы нужного слова в стек в обратном порядке. Затем >перенаправляет указатель инструкции вправо, где он проходит по циклу o, печатая символы, пока стек не станет пустым.


Я только начал работать над своей>> версией, а потом наткнулся на вашу. Мне очень нравится идея вашей вертикальной работы (у меня это очень 'нормально').
Тил пеликан

@Tealpelican Я не придумал это, пока не разработал ответ Fission. До этого мое лучшее решение> <> было 42 байта: !__|"druong">o<"figure"(где _пробелы, а оставшиеся пробелы просто идут в конце строки).
Мартин Эндер

Моя самая короткая текущая версия такова: ## "de nr uu og ri GF"> o! ~ ~! <## Что довольно смешно, тоже 42 байта! Мои предыдущие версии имели проверку ошибок, но могли уменьшить только до 53 байт.
Чирок пеликан

2

Деление , 37 байт

Использование ·для представления пространства.

фигура

D·
"···
f··
i··
g·
u·
r·
e·ound
"·
;·

Попробуйте онлайн!

земля

·D
·"fi
·gu
·re
·o
·u
·n
·d····
·"
·;

Попробуйте онлайн!

объяснение

Работает в основном так же, как мой>> ответ (хотя я действительно нашел его первым). Единственное отличие состоит в том, "что в Fission печатаются символы немедленно, поэтому слова не пишутся вверх ногами и почему нам нужно только завершить программу ;в конце.


1

сетчатый, 46 байтов

                      "ground""figure"" "?$$o;

Попробуйте онлайн! Это печатает ground.

"ground""figure"""?$$o                 ;      

Попробуйте онлайн! Это печатает figure.

земля

Соответствующий код:

"ground""figure"" "?$$o;
................          push these two strings
                " "?$     pop " " off (since " " is truthy, `?` executes `$`)
                     $    pop TOS ("figure")
                      o;  output and terminate

фигура

Соответствующий код:

"ground""figure"""?$$o;
................         push these two strings
                ""?$     doesn't activate
                    $    pop ""
                     o;  output and terminate

1

Брайан и Чак , 55 53 байта

фигура

erugif?dnuorg             
}<.<.<.<.<.<.             

В каждой строке 13 пробелов.

Попробуйте онлайн!

земля

             erugif?dnuorg
             }<.<.<.<.<.<.

Попробуйте онлайн!

объяснение

Ах, прошло много времени с тех пор, как я в последний раз использовал Брайана и Чака. В качестве краткого напоминания, Брайан и Чак - два экземпляра, похожих на Brainfuck, которые используют исходный код друг друга в качестве ленты. Только Чак может использовать команду печати ., ?условно переключаться между двумя экземплярами, и }это как [>]в Brainfuck. Неизвестные команды просто игнорируются.

Поскольку пробелы в начале программ игнорируются, две программы практически идентичны. Единственное отличие заключается в том, что после команды переключения ?указатель инструкции перемещается перед выполнением следующей команды. Следовательно, первая команда на ленте Чака всегда пропускается. Таким образом, единственное реальное отличие состоит в том, что наземная программа выполняет, }а программа-фигура - нет. Вот как работает код:

?   Switch control to Chuck.
}   GROUND PROGRAM ONLY: Move the tape head on Brian to the end of the tape.
<.  Move the tape head left and print the character there.
... Do the same another five times to print the remainder of the string.

0

WinDbg, 74 байта

земля

                      ea2000000"      groundfigure";;;da       2000006  L6

фигура

ea2000000"groundfigure          ";;;da                  2000006       L6  

Рисунок имеет 2 пробела. Я чувствую, что по крайней мере 2 или 4 байта должны быть пригодными для игры в гольф ...

Он работает, записывая строку в память и показывая 6 символов из нее. Символы в строке переупорядочены, поэтому показанные символы изменяются между программами:

* Ground:
ea 2000000 "      groundfigure";     * Write string "      groundfigure" starting at 2000000
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, from 2000006, ie- ground

* Figure:
ea 2000000 "groundfigure          "; * Write string "groundfigure          " to memory
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, ie- figure

Выход:

0:000>                       ea2000000"      groundfigure";;;da       2000006  L6
02000006  "ground"
0:000> ea2000000"groundfigure          ";;;da                  2000006       L6  
02000006  "figure"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.