Змії все навколо


12

Виклик

Завдання проста: надрукуйте змію .
Ви отримаєте довжину змії в якості входу.
Змія довжиною 2 виглядає приблизно так:

==(:)-

Змія довжиною 7 виглядає приблизно так:

=======(:)-

Іншими словами, довжина змії - це скільки рівних знаків перед головою .

Використання

Скажімо, я зробив реалізацію C ++ і компілював її ./getsnake.
Я міг би це запустити так:

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

Роз'яснення

  • Стандартні лазівки заборонені.
  • Ви можете отримати вхід і вихід будь-яким прийнятним способом.
  • Ви можете припустити, що всі наведені входи є натуральними числами.
  • Ви можете написати функцію замість звичайної програми.

8
Нібито залишати виклик у пісочниці лише на півгодини. Ви отримали певний відгук, але зазвичай краще залишити його в пісочниці на 24-72 години. (Крім того, ви повинні або м'якоть частину "Походження", або видалити її.)
El'endia Starman

Чи достатньо функцій або ви хочете повноцінної програми?
betseg

Функції @betseg достатньо
InitializeSahib

4
Я боюся, що всі відповіді на Мою лампочку з легкістю для цього легко переносити.
манатура

3
Негативні цілі числа повинні змусити змію проковтнути себе.
GuitarPicker

Відповіді:


18

Шестикутник , 33 байти

Не виграю, але все одно круто. Можливо, ви зможете отримати більше гольфу.

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

Гольф:

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

Відформатовано:

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

Кольорові (зроблені за допомогою шестигранника Colour Timwi )

Ви знайшли да таємний снік!  ======= (:) -

Пояснення:

Цикл, роздрукуйте "=", поки лічильник не досягне 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 /; це ... Друк "(" ??? Яка частина .j4 /; це друк і яка частина - це рядок для друку? "
Fogmeister

2
@Fogmeister [Частина 1/2] У Гексагонії будь-який алфавітний символ встановлює значення поточної комірки пам'яті на значення ascii цього символу. "j" має значення ascii 106, тому для цього встановлено пам'ять. Також і числові символи множать значення поточної комірки на 10, а потім додають до неї (це дозволяє легко будувати числа, як, наприклад, 61 на початку.
Синій

3
[Частина 2/2] Отже, j4 встановлює комірку пам'яті 1064. Коли IP досягає "/", він відображається в ";", який виводить символ ascii, відповідний поточній комірці пам'яті% 256. 1064% 256 = 40, значення ascii для "(". Сподіваюсь, це відповідає на ваше запитання.
Синій

Дякую. Так, це так. Я думаю, що це скоріше мова, яка використовується як спосіб тестування вашого мозку. Замість того, щоб тоді писати програми? Цікаво.
Fogmeister

@Fogmeister Є багато мов програмування езотерики, які більше вправляють мозок, ніж корисні для виконання справжньої роботи, хоча вони МОЖУТЬ робити справжню роботу, якщо постаратися досить.
Спарр

12

Кориця гумка, 7 байт

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

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

Було б 6 байт зі старим pсинтаксисом: /

Пояснення

Декомпресуючи на p~=~(:)-, pетап потім просто зчитує введення та повторює =n разів.


Чи можете ви зв’язатись з мовними специфікаціями для цього?
Роберт Фрейзер

@RobertFraser не мають формальної специфікації або який - або документації в даний час, але ви можете перевірити джерело на GitHub репо: github.com/quartata/cinnamon-gum
в spaghetto

12

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

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

Введіть у вигляді значення байта , так, наприклад, введення !дає змію довжиною 33.

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

Пройшло багато часу...

Пояснення

Швидкий ґрунтовник Brian & Chuck:

  • Перший рядок програми - Брайан, другий - Чак.
  • Брайан і Чак - два екземпляри, схожі на Brainfuck. Основна уловка полягає в тому, що програма Чак - це стрічка Брайана і навпаки. Головки стрічки / покажчики інструкцій починаються на першій комірці кожної стрічки, а виконання починається на Брайані.
  • Щодо команд, то тут є кілька відмінностей. Тільки Брайан може використовувати ,(введення), а тільки Чак може використовувати .(виводити). Крім того <і >існує , {і }які переміщують головку стрічки до наступної нульовий осередку (або в разі {з лівим кінцем стрічки , якщо не нульовий осередки на шляху). Замість [...]цього єдиний керуючий потік - це той, ?який перемикає управління на інший екземпляр, якщо поточна комірка не дорівнює нулю. Перша виконана інструкція на іншій комірці - це після умови. І нарешті, _це лише псевдонім для нульових байтів, для зручності.

Тепер код. Брайан починає з цього:

,{-?

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

}<<.{?

Це переміщує головку стрічки на Брайана до самого кінця, переміщує дві клітинки вліво на =та виводить її перед головкою стрічки до кінця вліво і перемикає управління назад на Брайана. Це, як правило, петлі працюють в B&C.

Після того, як вхід зменшиться до нуля, ?стрічка Брайана нічого не зробить. Потім Брайан виконує цю частину:

>}-):(=?

Не ):(=існує, тому власне код справедливий >}-?. Ми відсуваємо нульову комірку за допомогою >, переходимо до _с }, зменшуємо її, щоб зробити її не нульовою, і переходимо до Чука ?. Потім виконується останній біт на Чак:

<.<.<.<.<.

Це просто друкує п’ять символів перед Чак, тобто =(:)-. Зауважте, що нам потрібно друкувати інше, =оскільки основний цикл виконується лише N-1для введення разів N.


10
Поздоровлення на 100 к.
Insane


6

Сітківка , 10 байт

.+
$*=(:)-

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

Це проста заміна регулярного виразка.

Він відповідає тому, .+що відповідає всій інформації, а потім замінює його $*=(;)-.

Це $*особливість, унікальна для Retina: це спеціальний оператор для повторення символів.

Наприклад, 5$*xстане xxxxx.

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


5

Пітон, 21 байт

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

Ідей це!


Ви можете вирізати 3 байти, виконавши:"="*input()+"(:)-"
gowrath

@gowrath Тоді нічого не буде надруковано
Leaky Nun

Він виведе його, якщо ви перекладача немає? Оп сказала, що ви можете отримати вихід будь-яким способом.
gowrath

@gowrath Ви не можете припустити, що ми в REPL
Leaky Nun

Це загальне правило для кодового гольфу? Нові тут :)
gowrath


5

Java 8, 52 байти

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

Тестовий набір.(Компілювати> Виконати)

Кредити .

традиційний шлях, 61 54 53 байт

7 байт завдяки Kevin Cruijssen.

1 байт завдяки Дому Гастінгсу.

n->{String s="";for(;n-->0;)s+="=";return s+"(:)-";};

+1 О, і для традиційного: for(int i=0;i<n;i++)можна пограти в гольф for(;n>0;n--), тому що вам не потрібен вхід для нічого іншого, крім for-loop.
Кевін Кройсейсен

@KevinCruijssen Спасибі, відредаговано
Leaky Nun

Тестування за наданим вами посиланням виглядає так, що ви можете змінити цикл for на: for(;n-->0;)зберегти ще один байт!
Дом Гастінгс

@DomHastings відредаговано з подякою
Leaky Nun


4

С, 38

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

Спробуйте це на ideone.


1
Не коротше, але крутіше : f(n){~-printf(n?"=":"=(:)-")||f(~-n);}.
orlp

f(n){for(;n;printf(n--?"=":"(:)-"));}за -1.
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ - Це не виводить голову.
овакодер

@owacoder Ну, C - це не моя основна мова ...
Erik the Outgolfer

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 байт збережено завдяки Аднану.


'=×"ÿ(:)-за 9 байт :). Для цього використовується рядкова інтерполяція.
Аднан

1
@Adnan: Ааа, так це і ÿробиться :)
Emigna

4

Javascript, 23 байти

n=>"=".repeat(n)+"(:)-"

1
Я збирався опублікувати саме той код! Бий мене до цього! Запропонувати заявку
мер міста Монті

Сьогодні я дізнався про функції стрілок . Дякую. Не знав, що це - річ
bobkingof12vs

Як ви називаєте цей екземпляр функції? Я щойно спробував n(3)і отримав Uncaught ReferenceError: n is not definedпомилку ...
WallyWest

@WallyWest - спробуйтеx=n=>"=".repeat(n)+"(:)-"; x(7);
eithed

@eithedog Тоді чи не повинні відповіді бути початковими x=та змінені на 25 знаків?
WallyWest

4

C #, 28 байт

n=>new string('=',n)+"(:)-";

Мене завжди цікавлять фрагменти лямбда. як ти можеш це навіть запустити?
downrep_nation

@downrep_nation він бере int і автоматично повертає рядок, оскільки це лише одне твердження
TheLethalCoder

Відповідь має бути повною програмою чи функцією, а не лише фрагментом. Тож ця відповідь здається неповною.
raznagul

@raznagul Це анонімна функція, тому вона завершена
TheLethalCoder

@TheLethalCoder: Можливо, спробувати онлайн-посилання допоможе зрозуміти це. ( csharppad.com )
raznagul

4

Пітон , 24 байти.

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

input() отримує дані від користувача

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

Помноживши =і input(), ви отримаєте рядок= довжини, який вказує користувач.

Використання + з'єднує дві струни, в цьому випадку наше тіло "=…="з головою,"(:)-" щоб зробити змію.

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


3

GolfScript, 11 10 байт

~"="*"(:)-"

Помножує "=" на введення та додає голову.

-1 завдяки Leaky Nun


3

Математика, 21 20 байт

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

Анонімна функція. Візьме число n як вхід і поверне змію довжиною n як вихід. "="~Table~#генерує список {"=", "=", ..., "="}довжини n та <>"(:)-"об'єднує елементи списку та додає "(:)-"до отриманого рядка.


1
гольфується ще одним байтом:"="~Table~#<>"(:)-"&
LLlAMnYP

3

R, 32 27 байт

Це рішення досить просте, repфункція повторює раз перший елемент ( "=") scan(), що насправді є входом користувача.

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

Редагувати :

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

Трохи коротша відповідь, scan()безпосередньо використовуючи .

Крім того,

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

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


Я б сказав , що sep=""тут потрібно, в іншому випадку ваша змія виглядає як той , який прохідного залізницю: = = = (:)-.
манатурка

Змія, вироблена тут, насправді трохи подрібнена, але в заявах ОП зазначено лише, що довжина змії - це кількість рівних знаків перед головою. Я додамо все-таки sepяк бічну ноту;)
Фредерік

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*~'(:)-';
==========(:)-
(:)- =(:)- ==(:)- ===(:)- ====(:)- =====(:)-

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
=============================================================================(:)-

Кудо вам, я дістався аж 26:"$("="*[int]$args[0])(:)-"
Киришман

2

C, 46 45 43 байт

збережено 2 байти завдяки owacoder! збережено 3 байти завдяки rici!

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

Спробуйте це на Ideone!


3
Таємничий -->оператор знову вражає.
Leaky Nun

@LeakyNun 46-байтна версія була без переходу до оператора, ніж я згадав про перехід до оператора;)
betseg

1
Ви можете видалити >0та зберегти два байти.
owacoder

Трохи коротше:f(n){while(4-printf("=\0(:)-"+2*!n--));}
rici

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"

Що таке -1(... );?
Adám

Збережіть байт:{(x#"="),"(:)-"}
Adám

Спасибі Адам. -1 Друкується на консолі. -1 "Привіт"; надрукує Hello
Chromozorz

Але чи не друк неявний?
Adám

Так, але він включає подвійні лапки ... "==== (:) -", а не; ===== (
:)

1

Perl, 16 + 1 ( -pпрапор) = 17 байт

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

Потребує -pпрапор, тому працювати з:

perl -pe '$_="="x$_."(:)-"'


1

Befunge-98, 24 байти

Бере числовий ввід від користувача, після чого надрукує змію.

'=&:00pk:00gk,"-):("4k,@

1

Матлаб / Октава, 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]в рядок '====='перед конкатенацією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.