Синтаксис без цукру


55

У Haskell список позначень:

[a,b,c]

Це просто синтаксичний цукор для:

a:b:c:[]

І рядкове позначення:

"abc"

Це просто синтаксичний цукор для:

['a','b','c']

Це означає, що рядок:

"abc"

Це те саме, що:

'a':'b':'c':[]

Завдання

З огляду на рядок, слід вивести те, як виглядатиме десинтаксированная версія у Haskell.

Правила

  • Ви отримаєте рядок будь-яким дійсним методом введення, ви повинні вивести рядок, що закінчується :[]кожним символом, із входу, оточеного 'та розділеного :. Порожній рядок повинен виводитись [].

  • Ви можете припустити, що ви не отримаєте жодних символів, які потребують переходу (наприклад ', нові рядки, вкладки ...) і що введення буде в діапазоні ascii для друку

  • Це ви повинні прагнути мінімізувати кількість байтів вашої відповіді

Випробування

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   

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

@FryAmTheEggman Ви можете припустити, що вони перебувають у діапазоні ascii
Wheat Wizard

7
@totallyhuman Це навіть не дійсний Haskell. Якби вони були, можливо, але приємними вони не є, однозначно ні.
Пшеничний майстер

38
Це питання можна альтернативно назвати "Дієта Хаскелл".
Березень Ho

1
@cairdcoinheringaahing Ні, "і 'синтаксично різні.
Пшеничний майстер

Відповіді:


85

Haskell , 26 байт

(++"[]").((++":").show=<<)

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

Пояснення:

У неточковому позначенні та використанні concatMapзамість цього =<<це стає

f s = concatMap(\c-> show c ++ ":")s ++ "[]"

Давши рядок s, ми відображаємо кожну таблицю cна рядок "'c':"за допомогою showфункції, яка повертає рядкове представлення більшості типів Haskell. Ці рядки з'єднані і []додається фінал .

Хоча ця відповідь не вимагається, ця відповідь навіть працює з належним втечею, тому що showпіклується про неї: f "'"врожайність "'\\'':[]".


25
Почекай хвилинку, ти маєш на увазі (++'[':']':[]).((++':':[]).show=<<), ні?
Adám

11
Коли будь-який виклик має відповідь Haskell, я його схвалюю з принципу. Це подвійно для цього.
Райан Райх

43

Haskell, 33 28 26 байт

foldr((.(':':)).shows)"[]"

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

foldзадану функцію pointfree справа на вхідний рядок, починаючи з []. Функція полягає у тому, щоб: показати char як Haskell char, тобто оточити 'та поєднати з результатом поки що після того, як поставити :перед ним.

Редагувати: @ Ørjan Johansen врятував два байти. Дякую!


Я гадаю, це означає (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám

1
Я думаю, що це перевершує іншу відповідь Haskell (при тому ж байті) завдяки використанню :для створення списку, а не тим ++, що обидва мають свою елегантність.
CAD97

4
Це досить дивовижно. Два окремих підходи, які мають однаковий байт, рахуються однією і тією ж мовою.
Дж. Аткін



16

Лист звичайний, 50 42 байти

(format t"~{'~a':~}[]"(coerce(read)'list))

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

Зменшено завдяки коментарю @coredump, використовуючи readзамість визначення функції.


1
Ласкаво просимо до PPCG!
Мартін Ендер

2
Лисп! Ласкаво просимо :)
Олів'є Дулак

@ Renzo Привіт Ренцо, ви можете трохи зменшити його, скориставшись анонімною лямбда-формою, або просто зателефонувавши до прочитаного: (format t"~{'~a':~}[]"(coerce(read)'list))(деякі інші питання суворіші введення та виходи wrt, але тут це нормально)
coredump

@coredump, дякую !, я оновив код.
Ренцо


10

C, 55 54 53 байт

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}

1
ви можете прибрати простір уchar *h
Cyoce

1
Ви можете puts("[]");замість цього зробити висновок із заднім рядком, щоб зберегти кілька байт.
Kritixi Lithos

рекурсивнаs(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2

8

Python 3 , 41 38 36 байт

-2 байти завдяки ов

print(*map(repr,input()),[],sep=':')

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


Упс ... Забув, що *mapіснує ...
Містер Xcoder

Мені спантеличено порожнє input()протягом останніх 20 хвилин (буквально), коли це може бути просто лямбда @. @
Род


@WheatWizard о, я використовував введення порожній-порожній (без нового рядка)
стрижень

Ви можете замінити "[]"на[]
ovs

8

05AB1E , 15 12 11 10 байт

-3 байти завдяки carusocomputing
-1 byte завдяки Adnan
-1 byte завдяки геніальній ідеї Erik Outgolfer

ʒ"'ÿ':"?},

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

ʒ          # Filter out every character that the following code doesn't return 1 for
 "'ÿ':"?   #   Print the string 'ÿ': with ÿ replaced by this character
        }  # End for
         , # No character returned 1 so an empty array is left on the stack. Print that

Мабуть, я побив тебе за 4 секунди ;-)
Digital Trauma

1
@DigitalTrauma Зі свого боку вискочив, коли я натискав Опублікувати свою відповідь.
Райлі

1
Ви можете надрукувати глобальний масив замість натискання на дужки з 3 байтами. Ви також можете інтерполювати рядок для іншої економії байтів на загальну суму -3, кінцевий результат 12-байт:vy"'ÿ':"?}¯?
Чарівний восьминіг Урна

@carusocomputing Я весь час використовую рядковий інтерполятор для тестових наборів, але забудьте використовувати його у фактичному коді. Дякую!
Райлі

@carusocomputing Я думав, що vy"'ÿ':"}¯Jбуде працювати 11, але Jприєднується до глобального масиву, а не до всього стека в цій ситуації.
Райлі

8

R, 51 байт

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))

1
Приємне рішення! Кілька способів ви можете зберегти кілька байт і дійсно зменшити це. за замовчуванням введення-виведення дозволяє просто повернути анонімну функцію або навіть взяти вхід від stdin, остання з яких буде набагато коротше, використовуючи scan(,'')замість функції.
Джузеппе

Дякую, я трохи новачок з R (і кодом гольф!), Тому ще не зовсім зрозумів анонімні функції в ньому, хоча я намагався це зробити без "функції". сканування може бути корисним!
tc

ах, анонімна функція - це лише та функція, де ви не присвоюєте її змінній, тому ви просто відкинете її f<-від початку коду
Джузеппе

paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') є 43
Zahiro Mor

8

Pyth, 14 10 8 байт

j\:a`MQY

Спробуйте це!

-2 байти завдяки @isaacg

Нарешті, піт добре в чомусь.

пояснення

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :

@isaacg Дякую! Я забув Mі не знаю, чому не користувався a. Тепер ми принаймні на 2 байти коротші за всі інші рішення тут!
КарлКастор


7

Сітківка, 12

  • 3 байти збережено завдяки @FryAmTheEggman
.
'$ &':
$
[]

2 етапи:

  • для кожного символу, що залишився ' ':навколо
  • додати []до кінця

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


Допомогла хлопцеві, якого ти побив за 4 секунди, зв'язав тебе;).
Чарівний восьминога Урна

Я думав про це!
CalculatorFeline

6

Python 2 , 48 46 44 37 байт

-2 байти завдяки Роду. -7 байт завдяки пшеничному майстру.

lambda s:':'.join(map(repr,s)+['[]'])

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



О, акуратне. Дякую!
totalhuman

1
Один коротший як lambda s:':'.join(map(repr,[*s,[]]))або lambda s:':'.join(map(repr,s))+":[]".
xnor

@xnor Другий приклад, який ви наводите, схоже, не працює для порожнього випадку. (оригінальна відповідь виглядала дуже схожою на цю, але багато заплатили, щоб прикрити порожній рядок)
Wheat Wizard


6

JavaScript (ES6), 36 байт

s=>s?`'${[...s].join`':'`}':[]`:"[]"

Спробуй це

f=
s=>s?`'${[...s].join`':'`}':[]`:"[]"
oninput=_=>o.innerText=f(i.value);o.innerText=f(i.value="abc")
<input id=i><pre id=o>


5

Желе ,  11 10  8 байт

-1 байт завдяки Крістіану (видаліть конкатенацію ;та використовуйте замість неї неявну друк)

+0 байт (зафіксовано для красного випадку порожнього рядка - раніше повної програми ŒṘ€j”:“:[]:)

-2 завдяки Ерік Outgolfer (використання pзамість ;€так ”:ефективно довжина 1; використовувати , Ø[так як він став скороченням для ⁾[])

ŒṘ€p”:Ø[

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

Повна програма, що друкує результат (як посилання повертає список списків символів).

... але чи є спосіб зберегти за допомогою STDIN?

Як?

ŒṘ€p”:Ø[ - Main link: list of characters, s  e.g. "Hey"
ŒṘ€      - Python representation for €ach    [["'",'H',"'"],["'",'e',"'"],["'",'y',"'"]]
    ”:   - literal character = ':'
   p     - Cartesian product                 [["'",'H',"'",':'],["'",'e',"'",':'],["'",'y',"'",':']]
         - implicit print (no newline): 'H':'e':'y':
      Ø[ - literal list of characters        ['[',']']
         - implicit print (no newline): []

4

PHP , 41 байт

<?=preg_filter("#.#","'$0':",$argn)."[]";

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


4 байта коротше: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
користувач63956

@ user63956 це не потрібен додатковий <?варіант, з яким параметром його потрібно запустити? Скористайтеся власним підходом, я б сказав, щоб домовитись про те, що Тит зробив щось подібне тим часом
Йорг Гюльсерманн

Це працює з -Rпрапором. Теги можна закрити навіть у таких конструкціях, як eval()і create_function().
user63956

4

Perl 5 , 22 байти

19 байт коду + -pпрапор.

s/./'$&':/g;$\="[]"

Або, по тій же ByteCount, s/./'$&':/g;s/$/[]/.

Досить прямо вперед: s/./'$&':/gоточіть кожного символу лапками і додайте :після. $\друкується неявно після кожного друку, тому встановивши його для []виведення остаточного [].

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


4

Java (OpenJDK 8) ,86 83 76 байт

-3 байти завдяки @KevinCruijssen
-7 байт завдяки @FlorianSchaetz

s->{String b="";for(char c:s.toCharArray()){b+="'"+c+"':";};return b+"[]";};

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


Можна скинути 4 байти. Поздовжній ;не повинен враховуватися для лямбда - відповідей, то ;після того , як }не потрібно взагалі, і , {і }можуть бути видалені навколо для петлі. І ви можете зберегти ще 4 байти на Java 10, змінюючи і на, Stringі charна var.
Кевін Кройсейсен

4

мозковий ебать, 68 байт

+[-->+[<]>-]>>,[<.>.<.>>-[>+<+++++++++]>+.[-]<<,]-[+[+<]>>+]<+++.++.

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


Не зовсім працює з порожньою рядком - повернув мені два недійсних символи у вашому онлайн-тесті. Дуже приємно, інакше.
NoseKnowsВсі

@NoseKnowsAll я, здається, не можу це повторити; Без введення я не отримую вихід. Чи можете ви надати оновлене посилання з цим входом?
daniero

Ось що я отримав, коли запускаю :. З порожнім входом він повинен повертатися "[]" без лапок.
NoseKnowsВсі

@NoseKnowsAll Ваше посилання переходить до входу "привіт світ" (отримуйте оновлене посилання натисканням на цю посилання / кнопку ланцюга), але так, я розумію, що ви маєте на увазі. Я
розберуся

1
@NoseKnowsAll Там ви йдете, я це виправив;)
daniero

3

Мозг-Флак , 135 , 131 байт

{({}<>)<>}(((((((()()()()()){})){}{}())){}{})[()()])<>{<>(((((((()()()){}()){}){}()){})[(((()()()){})){}{}()])<>)({}<({}<>)>)<>}<>

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

+1байт для -cпрапора.

Завдяки WheatWizard за видалення дуже очевидних NOOP, які я не мав XD.


@WheatWizard> _> Так, я тільки тестував тебе ... Ха-ха-ха, дякую, що вказав на це. Я спробую пізніше взяти участь у гольфі, але додам, що тепер
DJMcMayhem

3

Стандартний ML , 52 50 байт

Збережено 2 байти завдяки @Laikoni!

fn s=>String.translate(fn c=>"'"^str c^"':")s^"[]"

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

String.translateце , до жаль , довге ім'я, але 5 байт коротше , ніж при використанні concat, mapі explode.


@Laikoni дякую! Я завжди забуваю, що оператори мають нижчий пріоритет, ніж функції.
musicman523

3

Cubix , 31 29 байт

uo@[)o'U);!A?ro;o;o;os:'/u:''

Aтакож можуть бути заміщені i; намагаючись з'ясувати, чи є хороший спосіб вичавити з цього ще один байт. -2 байти завдяки MickyT! Також перевершив MickyT !

Підходить для куба 3x3x3:

      u o @
      [ ) o
      ' U )
; ! A ? r o ; o ; o ; o
s : ' / u : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Дивіться його в Інтернеті!

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


Ви можете зберегти пару байтів, використовуючи пару кроків для останнього дужки. Це дозволяє трохи стиснути нижній рядокuo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT

2

Python 2 , 47 байт

lambda a:`list(a)+[[]]`.replace(', ',':')[1:-1]

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


У мене був такий самий підхід, але я не [1:-1]з'ясував цю частину, тому вона була довшою, ніж абсолютнолюдська. +1
Пшеничний майстер

Дивно, що тривіальне рішення просто на 3 байти довше (в Python 3).
Містер Xcoder



2

PHP, 39 байт

<?while(~$c=$argn[$i++])echo"'$c':"?>[]

Виконати як труба з -F.



2

Cubix , 27 байт

uosW?U.iv":'"^soso;os@o[]'/

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

      u o s
      W ? U
      . i v
" : ' " ^ s o s o ; o s
@ o [ ] ' / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Дивіться, як це працює

Трохи інший варіант від відповіді Гізєппе . Це ставить двокрапку і цитату на стек. Потім він проходить через вхід, змінюючи та виводячи стек. Записується лише вхід, а двокрапка і цитата зберігаються.

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

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