Змеи вокруг

12

Вызов

Задача проста: напечатать змею .
Вы получите длину змеи в качестве входных данных.
Змея длиной 2 выглядит так:

==(:)-

Змея длиной 7 выглядит так:

=======(:)-

Другими словами, длина змеи - это количество знаков равенства перед головой .

использование

Допустим, я сделал реализацию C ++ и скомпилировал ее ./getsnake.
Я мог бы запустить это так:

$ ./getsnake 10
==========(:)-

Разъяснения

  • Стандартные лазейки запрещены.
  • Вы можете получить ввод и вывод любым приемлемым способом.
  • Вы можете предположить, что все входные данные являются положительными целыми числами.
  • Вы можете написать функцию вместо обычной программы.
InitializeSahib
источник
8
Оставлять вызов в Песочнице на полчаса бесполезно. Вы получили некоторые отзывы, но обычно лучше оставить их в Песочнице на 24-72 часа. (Кроме того, вы должны либо дополнить часть «Происхождение», либо удалить ее.)
El'endia Starman
Достаточно ли функции или вам нужна полная программа?
бетсег
Достаточно функции @betseg
InitializeSahib
4
Я боюсь, что все ответы My Squiggly Lamp легко переносятся на это.
manatwork
3
Отрицательные целые числа должны заставить змею проглотить себя.
GuitarPicker

Ответы:

18

Гексагония , 33 байта

Не победит, но все равно круто. Может быть в состоянии получить в гольф больше.

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

Golfed:

61}?.$)@$j;(3<./;.}l/.400;5\j;.'\

отформатирован:

    6 1 } ?
   . $ ) @ $
  j ; ( 3 < .
 / ; . } l / .
  4 0 0 ; 5 \
   j ; . ' \
    . . . .

Цветной (Сделано с использованием Hexagony Colorer Тимви )

ты нашел секретный снек!  ======= (:) -

Объяснение:

Цикл, распечатайте «=», пока счетчик не достигнет 0.

    6 1 } ?
   . $ . . $
  . . ( . . .
 / . . } . . .
  . . . ; . .
   . . . ' .
    . . . .

Распечатать "("

    . . . .
   . . . . .
  . . . . . .
 / ; . . . . .
  4 . . . . .
   j . . . .
    . . . .

Распечатать ":"

    . . . .
   . . . . .
  . ; ( 3 < .
 . . . } l / .
  . . . . . .
   . . . . .
    . . . .

Распечатать ")"

    . . . .
   . . . . .
  j . . . . .
 . . . . . . .
  . . . ; 5 \
   . . . . \
    . . . .

Вышеуказанные значения были сгенерированы с использованием простого скрипта Python. Тем не менее, я как бы выбежал из места для "-". Итак, мне пришлось прибегнуть к более продвинутым трюкам.

Когда программа выводит «)», значение ячейки не 41, а 1065. Гексагония просто изменяет значение при печати. Как оказалось, (1065 * 1000 + 4)% 256 = 44, всего в одном от 45, значение ascii для "-". Затем я просто увеличиваю, печатаю и вставляю @ где-нибудь после печати.

    . . . .
   . $ ) @ $
  j . . 3 . .
 / . . } . . .
  4 0 0 . 5 \
   . ; . . \
    . . . .
синий
источник
Как это можно назвать языком программирования, когда .j4 /; is ... Print "(" ??? Какая часть .j4 /; является печатью и какая часть является строкой для печати?
Fogmeister
2
@Fogmeister [Часть 1/2] В Hexagony любой алфавитный символ устанавливает значение текущей ячейки памяти равным значению ascii этого символа. «j» имеет значение ascii, равное 106, так что это то, на что настроена память. Кроме того, числовые символы умножают значение текущей ячейки на 10, а затем добавляют к ней себя (это позволяет легко создавать числа, например 61 в начале.
Синий
3
[Часть 2/2] Итак, j4 устанавливает ячейку памяти в 1064. Когда IP достигает «/», он отражается в «;», который печатает символ ascii, соответствующий текущей ячейке памяти% 256. 1064% 256 = 40, значение ascii для "(". Надеюсь, это ответит на ваш вопрос.
Blue
Благодарю. Да, это так. Я думаю, что это больше язык, чтобы использовать его как способ проверки вашего мозга. Вместо того, чтобы писать программы тогда? Интересный.
Fogmeister
@Fogmeister Существует много эзотерических языков программирования, которые представляют собой больше упражнений на изгиб мозга, чем полезны для выполнения реальной работы, хотя они МОГУТ выполнять настоящую работу, если вы будете стараться изо всех сил.
Спарр
12

Корица, 7 байтов

0000000: 7043 dc95 6d4f ce                        pC..mO.

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

Было бы 6 байтов со старым pсинтаксисом: /

объяснение

Распаковывается p~=~(:)-, pзатем сцена просто читает ввод и повторяет =n раз.

спагетто
источник
Можете ли вы сделать ссылку на спецификацию языка для этого?
Роберт Фрейзер
@RobertFraser В настоящее время у меня нет формальной спецификации или какой-либо документации, но вы можете проверить источник в репозитории GitHub: github.com/quartata/cinnamon-gum
спагетто
12

Брайан и Чак , 31 байт

,{-?>}-):(=?
#}<<.{?_<.<.<.<.<.

Ввод в виде байтового значения , например, input !дает змею длиной 33.

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

Прошло много времени...

объяснение

Быстрый Брайан и Чак учебник для начинающих:

  • Первая строка программы - Брайан, вторая - Чак.
  • Брайан и Чак - два экземпляра, похожих на Брэйнфак. Основная загвоздка в том, что программа Чака - это лента Брайана, и наоборот. Головки магнитных лент / указатели команд начинаются с первой ячейки каждой ленты, а выполнение начинается с Брайана.
  • Что касается команд, есть несколько отличий. Только Брайан может использовать ,(вход), и только Чак может использовать .(выход). В дополнение к <и >есть {и }которые перемещают головку ленты до следующей нулевой ячейки (или в случае {с левым концом ленты, если на пути нет нулевой ячейки). Вместо [...]этого единственный поток управления - ?это переключение управления на другой экземпляр, если текущая ячейка отлична от нуля. Первая выполняемая инструкция в другой ячейке - та, которая следует за условием. И, наконец, _просто псевдоним для нулевых байтов, для удобства.

Теперь код. Брайан начинает с этого:

,{-?

Это считывает ввод в первую ячейку Чака, затем перемещает головку ленты влево {(сейчас ничего не делает) и уменьшает ввод -перед переключением управления для Чака, если значение все еще не равно нулю. Это начинает основной цикл. Затем Чак запускает этот бит:

}<<.{?

Это перемещает головку ленты Брайана до самого конца, перемещает две ячейки слева =и печатает ее перед головкой ленты влево и переключает управление обратно к Брайану. Вот как петли обычно работают в B & C.

Как только входной сигнал уменьшится до нуля, ?лента Брайана ничего не сделает. Затем Брайан выполняет эту часть:

>}-):(=?

):(=Нет-OPS, поэтому фактический код просто >}-?. Мы убираем нулевую ячейку с >, поднимаемся до _с }, уменьшаем ее, чтобы она стала ненулевой , и переключаемся на Чака с ?. Затем запускается последний бит Чака:

<.<.<.<.<.

Это просто печатает пять символов перед Чаком, то есть =(:)-. Обратите внимание, что нам нужно напечатать другой, =так как основной цикл выполняется только N-1для ввода N.

Мартин Эндер
источник
10
Поздравляю на 100k
Безумный
6

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

.+
$*=(:)-

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

Это простая замена регулярных выражений.

Он совпадает с тем, .+который соответствует всему вводу, а затем заменяет его на $*=(;)-.

Это $*уникальная особенность Retina: это специальный оператор повторения символов.

Например, 5$*xстал бы xxxxx.

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

Дрянная Монахиня
источник
5

Python, 21 байт

lambda n:"="*n+"(:)-"

Идео это!

Дрянная Монахиня
источник
Вы можете сократить 3 байта, выполнив:"="*input()+"(:)-"
gowrath
@gowrath Тогда это ничего не будет печатать
Leaky Nun
Он выведет его, если вы в переводчике нет? Оп сказал, что вы можете получить выход любым способом.
Говрат
@gowrath Вы не можете предполагать, что мы находимся в REPL
Leaky Nun
Это общее правило для игры в гольф кода? Новое здесь :)
gowrath
5

Haskell, 25 байт

f n=('='<$[1..n])++"(:)-"

'='<$[1..n]эквивалентно replicate n '='.

Майкл Кляйн
источник
5

Java 8, 52 байта

n->new String(new char[n]).replace("\0","=")+"(:)-";

Тестирование. (Компилировать> Выполнить)

Кредиты .

традиционным способом 61 54 53 байта

7 байтов благодаря Кевину Круйссену.

1 байт благодаря Дому Гастингсу.

n->{String s="";for(;n-->0;)s+="=";return s+"(:)-";};
Дрянная Монахиня
источник
+1 Да, и для традиционного: for(int i=0;i<n;i++)можно играть в гольф for(;n>0;n--), так как в любом случае вам не нужно вводить ничего кроме цикла for.
Кевин Круйссен
@KevinCruijssen Спасибо, отредактировано
Leaky Nun
Тестирование по предоставленной вами ссылке выглядит так, как будто вы можете изменить цикл for на: for(;n-->0;)сохранить еще один байт!
Дом Гастингс
@DomHastings отредактировано с благодарностью
Leaky Nun
4

С, 38

f(n){for(;n--;printf(n?"=":"=(:)-"));}

Попробуйте это на Ideone.

owacoder
источник
1
Не короче, но круче f(n){~-printf(n?"=":"=(:)-")||f(~-n);}.
orlp
f(n){for(;n;printf(n--?"=":"(:)-"));}за -1.
Эрик Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ - Это не выводит голову.
owacoder
@owacoder Ну, C не мой
родной
1
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ И вот почему вы не должны публиковать непроверенные предложения по игре в гольф (особенно, если бы вам потребовалось 5 секунд, чтобы проверить свое предложение по ссылке, указанной в ответе).
Мартин Эндер
4

05AB1E, 10 9 байтов

'=×"ÿ(:)-

объяснение

'=         # push equal-sign
  ×        # repeat input nr of times
   "ÿ(:)-  # interpolate snake body with head as a string
           # implicitly display

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

1 байт сохранен благодаря Аднану.

Emigna
источник
'=×"ÿ(:)-для 9 байтов :). Это использует строковую интерполяцию.
Аднан
1
@Adnan: Ааа, вот что ÿделает :)
Эминья
4

Javascript, 23 байта

n=>"=".repeat(n)+"(:)-"
eithed
источник
1
Я как раз собирался опубликовать именно этот код! Обыграй меня! Имейте upvote
MayorMonty
Сегодня я узнал о функциях стрелок . Спасибо. Не знал, что это было вещь
bobkingof12vs
Как вы называете этот экземпляр функции? Я только что попробовал n(3)и получил Uncaught ReferenceError: n is not definedошибку ...
WallyWest
@WallyWest - попробуйx=n=>"=".repeat(n)+"(:)-"; x(7);
наступил
@eithedog Тогда почему ответ не должен иметь начальный x=и изменен на 25 символов?
WallyWest
4

C #, 28 байт

n=>new string('=',n)+"(:)-";
TheLethalCoder
источник
меня всегда интересуют лямбда-фрагменты. как ты вообще можешь запустить это?
downrep_nation
@downrep_nation принимает int и автоматически возвращает строку, потому что это только один оператор
TheLethalCoder
Ответом должна быть полная программа или функция, а не просто фрагмент. Так что этот ответ кажется неполным.
Разнагул
@raznagul Это анонимная функция, поэтому она завершена
TheLethalCoder
@TheLethalCoder: Может быть, попытка ссылки онлайн поможет понять это. ( csharppad.com )
Разнагул
4

Python , 24 байта.

print"="*input()+"(:)-"

input() получает ввод от пользователя

*при использовании над строками и целым числом создает новую строку, которая состоит из объединенных копий оригинала. Например: "hello "*3выходы hello hello hello.

Умножая =и input(), вы получите строку =длины, которую указывает пользователь.

Использование +соединяет две струны, в нашем случае, наше тело "=…="с нашей головой, "(:)-"чтобы сделать змею.

print выводит результат.

я..
источник
3

GolfScript, 11 10 байт

~"="*"(:)-"

Умножает «=» на ввод и добавляет голову.

-1 благодаря Leaky Nun

NoOneIsHere
источник
3

Mathematica, 21 20 байт

"="~Table~#<>"(:)-"&

Анонимная функция. Принимает число n в качестве входных данных и возвращает змею длины n в качестве выходных данных. "="~Table~#генерирует список {"=", "=", ..., "="}длины n , <>"(:)-"объединяет элементы списка и добавляет "(:)-"к результирующей строке.

LegionMammal978
источник
1
играбельна еще одним байтом:"="~Table~#<>"(:)-"&
LLlAMnYP
3

R, 32 27 байт

Это решение довольно простое, repфункция повторяет первый элемент ( "=") scan()раз, который фактически является вводом пользователя.

a=scan();cat(rep("=",a),"(:)-")

РЕДАКТИРОВАТЬ :

cat(rep("=",scan()),"(:)-")

Чуть короче ответ, используя scan()напрямую.

С другой стороны,

cat(rep("=",scan()),"(:)-",sep="")

для не нарезанной змеи ( 34 байта )

Фредерик
источник
Я бы сказал, что sep=""здесь нужно, иначе ваша змея выглядит как та, что пересекала железную дорогу = = = (:)-.
manatwork
Произведенная здесь змея действительно немного измельчена, но грузчики OP только утверждают, что длина змеи - это число знаков равенства перед головой. sepТем не менее я добавлю примечание;)
Frédéric
3

Пакетная, 68 байтов

@set h=(:)-
@for /l %%i in (1,1,%1)do @call set h==%%h%%
@echo %h%
Нил
источник
2

Perl 6 ,  16 15  12 байт

{"{'='x$_}(:)-"}
{'='x$_~'(:)-'}
'='x*~'(:)-'

Объяснение:

'=' x * # 「=」 string repeated by the only parameter 「*」
~        # concatenated with
'(:)-'   # the head

Использование:

# store it in the lexical namespace
my &snake = '='x*~'(:)-';

put snake 10;

# put ^5 .map: &snake;
put ^5 .map: '='x*~'(:)-';
==========(:)-
(:)- =(:)- ==(:)- ===(:)- ====(:)- =====(:)-
Брэд Гилберт b2gills
источник
2

JAISBaL , 9 байт

t=*Qb(:)-

Подробный:

# \# enable verbose parsing #\
push1 =        \# push = onto the stack #\
mul            \# multiply the top two values of the stack #\
popout         \# pop the top value of a stack and print it #\
print4 (:)-    \# print (:)- #\

Протестировано с помощью JAISBaL-0.0.7 (скомпилированный файл .jar был только что передан , но источник был на git некоторое время)

Сократовский феникс
источник
Используйте #перед именем языка, чтобы оно выглядело как у всех остальных.
Майкл Кляйн
@MichaelKlein хорошо
сократовский феникс
2

PowerShell v2 +, 19 байт

'='*$args[0]+'(:)-'

Полная программа. Принимает ввод $args[0], использует умножение строк для построения тела, а затем конкатенацию строк для закрепления на голове.

PS C:\Tools\Scripts\golfing> .\snakes-all-around.ps1 7
=======(:)-

PS C:\Tools\Scripts\golfing> .\snakes-all-around.ps1 77
=============================================================================(:)-
AdmBorkBork
источник
Слава вам, я добрался до 26:"$("="*[int]$args[0])(:)-"
Chirishman
2

C, 46 45 43 байтов

сэкономил 2 байта благодаря owacoder! сэкономил 3 байта благодаря rici!

f(n){while(4-printf("=\0(:)-"+2*!n--));}

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

betseg
источник
3
Таинственный -->оператор снова наносит удар.
Утренняя монахиня
@LeakyNun 46-байтовая версия была без оператора go, чем я запомнил оператор go;)
betseg
1
Вы можете удалить >0и сохранить два байта.
owacoder
Немного короче:f(n){while(4-printf("=\0(:)-"+2*!n--));}
Ричи
2

Чеддер, 15 байт (неконкурентный)

n->'='*n+'(:)-'

Простой ответ.

Деймос
источник
1

К, 17 байт

{,[x#"=";"(:)-"]}

Пример;

f:{,[x#"=";"(:)-"]}
-1(f'!10);          /print out the result of calling f where x is 0 1 2 3 4 5....
(:)-
=(:)-
==(:)-
===(:)-
====(:)-
=====(:)-
======(:)-
=======(:)-
========(:)-
=========(:)-

Объяснение;

{}                 /function x is implicit and is an int
x#"="              /take (#) x of "=" --> so 3#"=" gives "==="
,[x#"=";"(:)-"]    /comma is a join that takes 2 args --> ,[x;y] gives the concatination of x and y --> "a","abc" is the same as ,["a";"abc"] and gives "aabc"
Chromozorz
источник
Что такое -1(... );?
адам
Сохраните байт:{(x#"="),"(:)-"}
Adám
Спасибо Адам. -1 Печать на консоль. -1 "Привет"; напечатает Привет
Chromozorz
Но не является ли печать неявной?
адам
Да, но он включает двойные кавычки ... "==== (:) -" вместо; ===== (
:)
1

Perl, 16 + 1 ( -pфлаг) = 17 байт

$_="="x$_."(:)-"

Необходимо -pпометить, поэтому запустите с:

perl -pe '$_="="x$_."(:)-"'
папа
источник
1

Befunge-98, 24 байта

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

'=&:00pk:00gk,"-):("4k,@
owacoder
источник
1

Matlab / Octave, 22 байта

@(n)[~(1:n)+61 '(:)-']

Это анонимная функция.

Попробуйте это на Ideone .

объяснение

Предположим n= 5.

1:nпроизводит вектор - строку [1 2 3 4 5].

~(1:n)отрицает каждую запись, поэтому она дает [0 0 0 0 0].

...+61добавляет 61к каждой записи, так что дает [61 61 61 61 61]. 61это значение ASCII символа =.

[... '(:)-']объединяет это со строкой '(:)-'. Это автоматически преобразуется [61 61 61 61 61]в строку '====='перед объединением.

Луис Мендо
источник