Фігура та земля


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 для перетворення між фігурою та наземною програмою. Просто вставте одне з двох у поле Введення та запустіть програму. Він також підкаже, чи кількість пробілів та пробілів не збігається.

Таблиця лідерів

Відповіді:


20

Желе , 20 байт

Малюнок

“¦ĠȮ“©ụd» Ṃ         

Дев'ять пробілів. Спробуйте в Інтернеті!

Земля

         “ ¦ĠȮ“©ụd»Ṃ

Немає пробілів. Спробуйте в Інтернеті!

Як це працює

По-перше, зауважте, що пробіли не є атомами, тому символи пробілу поза літеральними рядками не впливають на програму жодним чином.

Рядкові літерали використовувати вбудований словник на основі Jellÿ в стиснення рядків для отримання бажаних слів. Стислий буквальний рядок починається з , закінчується »і використовується внутрішньо для створення масиву рядків.

У графічній програмі “¦ĠȮ“©ụd»виходить пара рядків ("фігура", "земля") , і атом вибирає лексикографічний мінімум, тобто "фігура" .

У наземній програмі натомість “ ¦ĠȮ“©ụd»виходить пара рядків ("логічноAbacs", "ground") . Лексикографічний мінімум зараз є "ґрунтовим" , який обирається сумлінно.

В обох випадках інтерпретатор автоматично надрукує останнє повернене значення - тобто вибраний мінімум - STDOUT.


14

Python 2, 53 байти

Замініть ·пробіл в обох відповідях:

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

Друкує figure.

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

Друкує ground.


14

05AB1E , 15 14 байт

Малюнок

 'ŠÂ,'í¶      

Спробуйте в Інтернеті!

Земля

'       ŠÂ,'í¶

Спробуйте в Інтернеті!

Використовує кодування CP-1252 . Зверніть увагу на пробіли. У програмі Рисунок це звичайна програма без помилок. Він розкладає такі слова:

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

Кома друкує спливаючі вікна та друкує figure слово з нового рядка. Оскільки щось було надруковано, вершина стека більше не друкується.

У програмі Ground є деякі помилки, що зручно в цьому випадку. Наступна частина:

'<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

Математика, 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

Хаскелл, 96 94 88 82 77 байт

Перша програма, відбитки "figure":

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

Друга програма, відбитки "ground":

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

Викликає одну з двох інакше постійних функцій


3

Хаскелл, 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

Залізниця , 56 байт

Малюнок

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

На другому рядку є 16 проміжків. Програма закінчується помилкою.

Спробуйте в Інтернеті!

Земля

       
$ 'main' - [рисунок] 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
             }<.<.<.<.<.<.

Спробуйте в Інтернеті!

Пояснення

Ах, минуло колись, коли я востаннє використовував Brian & Chuck. Як коротке нагадування, Брайан і Чак - два екземпляри, схожі на 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.