Синтаксис без сахара

55

В Хаскеле список обозначений:

[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':[]   
Мастер пшеницы
источник
Будет ли вход когда-либо иметь не-ascii значения? Ваше ограничение на символы, требующие экранирования, требует либо того, чтобы мы знали, какие символы экранирует Haskell, либо предполагает, что ваш список является исчерпывающим.
FryAmTheEggman
@FryAmTheEggman Вы можете предположить, что они находятся в диапазоне ASCII
Wheat Wizard
7
@totallyhuman Это даже не действительный Haskell. Если бы они были, может быть, но приятно, что нет, определенно нет.
Пшеничный волшебник
38
Этот вопрос может быть альтернативно назван «Диета Хаскелла».
Март Хо
1
@cairdcoinheringaahing Нет, "и 'синтаксически разные.
Wheat Wizard

Ответы:

85

Haskell , 26 байтов

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

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

Объяснение:

В неточечной нотации и использовании concatMapвместо =<<этого это становится

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

Для данной строки sмы сопоставляем каждый символ cсо строкой, "'c':"используя showфункцию, которая возвращает строковое представление большинства типов Haskell. Эти строки объединяются и []добавляется финал .

Хотя этот запрос не запрашивается, этот ответ даже работает с правильным экранированием, потому что showзаботится о нем: f "'"доходность "'\\'':[]".

Laikoni
источник
25
Подожди, ты имеешь в виду (++'[':']':[]).((++':':[]).show=<<), нет?
Адам
11
Когда у любого вызова есть ответ на Haskell, я считаю его принципиальным. Это удваивается для этого.
Райан Райх
43

Haskell, 33 28 26 байт

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

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

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

Редактировать: @ Ørjan Йохансен сохранил два байта. Спасибо!

Ними
источник
Я полагаю, что это значит (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Адам
1
Я думаю, что это лучше, чем другой ответ на Haskell (с тем же количеством байтов), потому что он используется :для построения списка ++, хотя оба имеют свою элегантность.
CAD97
4
Это довольно удивительно. Два отдельных подхода с одинаковым количеством байтов на одном языке.
J Аткин
17

JavaScript ES6, 42 40 31 байт

s=>s.replace(/./g,"'$&':")+"[]"

Заменяет каждый символ на '<char>':, затем добавляет []в конец

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

Downgoat
источник
1
Я люблю это о CodeGolf. Никогда не знал о $&.
Стив Беннетт
16

Common Lisp, 50 42 байта

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

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

Уменьшено благодаря комментарию @coredump, с использованием readвместо определения функции.

Renzo
источник
1
Добро пожаловать в PPCG!
Мартин Эндер
2
Лисп! Действительно добро пожаловать :)
Оливье Дюлак
@Renzo Привет, Ренцо, вы могли бы немного его уменьшить, используя анонимную лямбда-форму или просто вызвав read: (format t"~{'~a':~}[]"(coerce(read)'list))(некоторые другие вопросы более строги по отношению к входам и выходам, но здесь все в порядке)
coredump
@coredump, спасибо !, я обновил код.
Ренцо
11

V 11 байт

Í./'&':
A[]

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

Использует регулярное выражение для окружения каждого входного символа, '':а затем Appends []до конца.

nmjcman101
источник
10

C 55 54 53 байта

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}
Говинд Пармар
источник
1
Вы можете удалить место вchar *h
Cyoce
1
puts("[]");Вместо этого вы можете сделать вывод с завершающей строкой, чтобы сохранить несколько байтов.
Критиси Литос
рекурсивный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 минут (буквально), когда это могла быть просто лямбда @. @
Rod
Пустой ввод работает?
Пшеничный волшебник
@WheatWizard О, я использовал пустой-пустой (без новой строки) ввод
Род
Вы можете заменить "[]"с[]
овсом
8

05AB1E , 15 12 11 10 байт

-3 байта благодаря carusocomputing
-1 байту благодаря Adnan
-1 байту благодаря гениальной идее Эрика Аутгольфера

ʒ"'ÿ':"?},

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

ʒ          # 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 секунды ;-)
Цифровая травма
1
@DigitalTrauma Ваше сообщение появилось, когда я нажимал Опубликовать ваш ответ.
Райли
1
Вы можете напечатать глобальный массив вместо того, чтобы заключать в скобки 3 байта. Вы также можете интерполировать строку для другой экономии байтов в общей сложности -3, конечный результат - 12 байтов:vy"'ÿ':"?}¯?
Волшебная урна осьминога
@carusocomputing Я все время использую строковый интерполятор для комплектов тестов, но забываю использовать его в реальном коде. Спасибо!
Райли
@carusocomputing Я думал, что vy"'ÿ':"}¯Jбудет работать для 11, но Jприсоединяется к глобальному массиву, а не весь стек в этой ситуации.
Райли
8

R, 51 байт

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))
дц
источник
1
Отличное решение! Несколько способов сэкономить несколько байтов и по-настоящему избавиться от них. Ввод / вывод по умолчанию позволяет вам просто вернуть анонимную функцию или даже получить ввод из стандартного ввода, последний из которых будет гораздо короче, чем scan(,'')вместо функции.
Джузеппе
Спасибо, я немного новичок с R (и код гольф!), Поэтому еще не совсем понял анонимные функции, хотя я пытался сделать это без «функции» там. сканирование может быть полезным!
дц
ах, ну анонимная функция - это всего лишь та, где вы не назначаете ее переменной, поэтому вы просто отбрасываете ее f<-с начала своего кода
Giuseppe
paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') - 43
Захиро Мор
8

Pyth, 14 10 8 байт

j\:a`MQY

Попробуй это!

-2 байта благодаря @isaacg

Наконец, Pyth хорош в чем-то.

объяснение

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :
KarlKastor
источник
@isaacg Спасибо! Я забыл о, Mи я не знаю, почему я не использовал a. Теперь мы как минимум на 2 байта короче, чем все остальные решения здесь!
КарлКастор
7

Сетчатка, 12

  • 3 байта сохранены благодаря @FryAmTheEggman
,
'$ &':
$
[]

2 этапа:

  • для каждого оставшегося символа поместить ' ':вокруг него
  • добавить []в конец

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

Цифровая травма
источник
Помог парню, которого ты избил, на 4 секунды связал тебя;).
Волшебная Урна Осьминога
Я думал об этом!
CalculatorFeline
6

Python 2 , 48 46 44 37 байт

-2 байта благодаря Роду. -7 байт благодаря Wheat Wizard.

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

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

totallyhuman
источник
1
Немного короче
Волшебник Пшеницы
О, аккуратно. Спасибо!
полностью человек
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 благодаря Erik the 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':"?>[].
user63956
@ 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 байта. Трейлинг ;не нужно считать лямбда-ответами, ;после }не нужно вообще, {а }можно и убрать вокруг цикла for. И вы могли бы сэкономить еще 4 байта в Java 10 изменяющемся как Stringи charв var.
Кевин Круйссен
4

брейкфук, 68 байт

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

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

daniero
источник
Не совсем работает с пустой строкой - вернул мне два недопустимых символа в вашем онлайн-тесте. Очень хорошо, в противном случае.
NoseKnowsAll
@NoseKnowsAll я не могу воспроизвести это; Без ввода я не получаю вывод. Не могли бы вы предоставить обновленную ссылку с этим входом?
Даньеро
Это то, что я получил, когда я запускаю его . При пустом вводе он должен возвращать «[]» без кавычек.
NoseKnowsAll
@NoseKnowsAll Ваша ссылка идет на ввод "hello world" (обновите ссылку, нажав эту ссылку / цепочку), но да, я понимаю, что вы имеете в виду. Я посмотрю на это
Даниеро
1
@NoseKnowsAll Вот и все, я исправил это;)
daniero
3

Brain-Flak , 135 , 131 байт

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

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

+1байт для -cфлага.

Спасибо WheatWizard за удаление очень очевидных NOOP, которые у меня были без причины XD.

DJMcMayhem
источник
@WheatWizard> _> Да, я просто проверял тебя ... Хахаха, спасибо, что указал на это. Я попробую
сыграть
3

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

Сохранено 2 байта благодаря @Laikoni!

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

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

String.translateэто , к сожалению , длинное имя, но 5 байт короче , чем при использовании concat, mapи explode.

musicman523
источник
@ Лайкони спасибо! Я всегда забываю, что операторы имеют более низкий приоритет, чем функции.
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 : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Смотреть онлайн!

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

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

Python 2 , 47 байт

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

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

прут
источник
У меня был такой же подход, но я не разобрался в [1:-1]роли, поэтому она была длиннее, чем у человека. +1
Волшебник Пшеницы
Странно, что тривиальное решение всего на 3 байта длиннее (в Python 3).
г-н Xcoder
2

APL (Dyalog) , 21 19 байтов

'[]',⍨'.'R'''&'':'

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

'[]',⍨ скобки добавлены к

'.' каждый персонаж

⎕R PCRE R заменяется на

'''&'':' цитата, совпадение, цитата и двоеточие

Адам
источник
2

PHP, 39 байт

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

Беги как труба с -F.

Titus
источник
2

Cubix , 27 байтов

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

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

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

Смотреть это беги

Немного отличающийся вариант от ответа Гизеппа . Это помещает двоеточие и кавычку в стек. Затем он проходит по входам, меняя местами и выводя стек. Только входные данные удаляются, а двоеточие и кавычка сохраняются.

Как только достигнут конец ввода, IP немного удивляется кубу, добавляя и выводя скобки. В миксе есть пара избыточных команд.

MickyT
источник