Зробіть перетворювач числового списку


20

Ви не ненавидите це, коли ви хочете скопіювати та вставити список номерів (вектор, масив ...) з однієї програми в іншу, але формат, на якому є номери, не відповідає формату, який вам потрібен ?

Наприклад, у MATLAB у вас може бути розділений пробілом такий список:

[1 2 3 4 5]    (you can also have it comma separated, but that's not the point)

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

[1, 2, 3, 4, 5]

щоб змусити його працювати. У мові C ++ ви хочете щось подібне:

{16,2,77,29}

і так далі.

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

Дійсні дужки:

[list]
{list}
(list)
<list>
list      (no surrounding brackets)

Дійсні роздільники:

a,b,c
a;b;c
a b c
a,  b,  c       <-- Several spaces. Must only be supported as input.
a;     b; c     <-- Several spaces. Must only be supported as input.
a   b   c       <-- Several spaces. Must only be supported as input. 

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

Окрім списку введення, буде рядок (або два символи), який визначає вихідний формат. Рядок формату першої буде типом відкриває дужки (тільки), [, (, <, {або (останній з яких є єдиним простір використовується , коли немає навколишнього дужки). Тип дужки буде супроводжуватися типом роздільника ,, ;або (останній - це єдиний пробіл). Два символи вхідного формату слід сприймати як один аргумент (рядок або два послідовних символи) у порядку, описаному вище.

Деякі приклади рядків формату:

[,    <-- Output format:   [a,b,c]
{;    <-- Output format:   {a;b;c}
      <-- Two spaces, output list has format:   a b c   

Правила:

  • На виході не може бути провідних пробілів
  • Вихід може мати пробіли та новий рядок
    • Висновок повинен тільки бути список номерів, які не ans =або аналогічних
  • Вхідним записом буде список цілих чи десяткових чисел (як позитивних, так і від’ємних (і нульових)) та рядок з двох символів
    • Якщо вхід складається з лише цілих чисел, у списку вихідних даних мають бути лише цілі числа. Якщо вхідний список складається з цілих чисел і десяткових чисел, всі вихідні числа можуть бути десятковими числами. (Необов’язково зберігати цілі числа як цілі числа)
    • Максимальна кількість цифр після десяткової крапки, яку необхідно підтримувати, становить 3.
    • Вхідними даними будуть два аргументи. Тобто числа є одним аргументом, а рядок формату - єдиним аргументом.
  • Код може бути програмою або функцією
  • Вхід може бути аргументом функції або STDIN

Деякі приклади:

1 2 3 4
[,
[1,2,3,4]

<1;  2;  3>
 ;    <-- Space + semicolon
1;2;3
not valid:  1.000;2.000;3.000   (Input is only integers => Output must be integers)

{-1.3, 3.4, 4, 5.55555555}
[,
[-1.300,3.400,4.000,5.556]  (5.555 is also valid. Rounding is optional)
also valid: [-1.3,3.4,4,5.55555555]

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


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

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат - це сума двох файлів або ви хочете окремо перерахувати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

## Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Чи дозволено тривалість та пробіл пробілів?
суперактор

@overactor, див. перші два правила. Провідна пробіл не в порядку, трейлінг в порядку.
Стюі Гріффін

Чи можемо ми взяти вхід у зворотному порядку? (роздільники перший, список другий)
Мартін Ендер

@ MartinBüttner, так. Не вказано, що спочатку він повинен бути у списку, тож ви можете вибрати.
Стюі Гріффін

J використовується _для позначення негативних елементів. :(
Zgarb

Відповіді:


1

CJam, 27 байт

l)l_5ms`-SerS%*\S-_o_'(#(f-

Спробуйте тут.

Пояснення

l      e# Read the format string.
)      e# Extract the separator.
l_     e# Read the list.
5ms`   e# Get a string that contains -.0123456789.
-      e# Get the characters in the list that are not in the string.
Ser    e# Replace those characters with spaces.
S%     e# Split by those characters, with duplicates removed.
*      e# Join with the separator.
\S-    e# Remove spaces (if any) from the left bracket.
_o     e# Output a copy of that character before the stack.
_'(#   e# Find '( in the left bracket string.
(      e# Get -1 if '( is the first character, and -2 if it doesn't exist.
f-     e# Subtract the number from every character in the left bracket string,
          making a right bracket.

8

JavaScript (ES6), 75 82

Як анонімна функція

Редагувати: 2 байти збережено thx @ user81655 (і ще 5 лише переглядаючи його)

(l,[a,b])=>a.trim()+l.match(/[-\d.]+/g).join(b)+']})> '['[{(< '.indexOf(a)]

Фрагмент тесту

F=(l,[a,b])=>a.trim()+l.match(/[-\d.]+/g).join(b)+']})> '['[{(< '.indexOf(a)]

// Test
console.log=x=>O.innerHTML+=x+'\n'
// default test suite
t=[['1 2 3 4','[,'],['<1;  2;  3>',' ;'],['{-1.3, 3.4, 4, 5.55555555}','[,']]
t.forEach(t=>console.log(t[0]+' *'+t[1]+'* '+F(t[0],t[1])))
function test() { console.log(P1.value+' *'+P2.value+'* '+F(P1.value,P2.value)) }
#P1 { width: 10em }
#P2 { width: 2em }
P1<input id=P1>
P2<input id=P2>
<button onclick="test()">-></button>
<pre id=O></pre>


6

CJam, 35 34 байт

l(S-l"{[<(,}]>);":BSerS%@*1$B5/~er

Тестуйте це тут.

Очікує формат у першому рядку та список у другому.

Пояснення

l   e# Read the format line.
(   e# Pull off the first character, which is the opening bracket.
S-  e# Set complement with a space, which leaves brackets unchanged and turns a space
    e# into an empty string.
l   e# Read the list.
"{[<(,}]>);":B
    e# Push this string which contains all the characters in the list we want to ignore.
Ser e# Replace each occurrence of one of them with a space.
S%  e# Split the string around runs of spaces, to get the numbers.
@   e# Pull up the the delimiter string.
*   e# Join the numbers in the list with that character.
1$  e# Copy the opening bracket (which may be an empty string).
B5/ e# Push B again and split it into chunks of 5: ["{[<(," "}]>);"]
~   e# Unwrap the array to leave both chunks on the stack.
er  e# Use them for transliteration, to turn the opening bracket into a closing one.

5

Pyth, 33 байти

rjjezrXwJ"<>[]  {}(),;"d7@c6JChz6

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Пояснення:

J"<>[]  {}(),;"  assign this string to J

rjjezrXwJd7@c6JChz6   implicit: z = first input string, e.g. "[;"
       w              read another string from input (the list of numbers)
      X Jd            replace every char of ^ that appears in J with a space
     r    7           parse ^ (the string of numbers and spaces) into a list
  jez                 put z[1] (the separator symbol) between the numbers
            c6J       split J into 6 pieces ["<>", "[]", "  ", "{}", "()", ",;"]
               Chz    ASCII-value of z[0] (opening bracket symbol)
           @          take the correspondent (mod 6) brackets from the list
 j                    and put the numbers between these brackets
r                 7   remove leading and trailing spaces

Чи можете ви додати пояснення, як це працює?
Шельваку

1
@Shel Ось ти.
Якубе

5

PowerShell, 108 100 95 85 байт

$i,$z=$args;($z[0]+($i-split'[^\d.-]+'-ne''-join$z[1])+' }) >]'[($z[0]-32)%6]).Trim()

(див. історію версій для попередніх версій)

Golfed ще 15 байт шляху видалення $bі $sзмінні і зміни дужки на внутрішній рядку.

Це сприймає дані як два рядки і зберігає їх у, $iа $zпотім ми конструюємо новий вихідний рядок. Внутрішній парен -splits $iз регулярним виразом для вибору лише числових цифр, а потім -joinназад разом із запитаним роздільником. Ми пов'язуємо це з першим символом введення роздільника (наприклад, [) і закриваємо його індексуванням у рядок на основі значення ASCII першого символу та деяких хитрощів формулювання. Зовнішня .Trim()частина видаляє будь-які провідні чи задні простори.


Я думаю, ви могли б замінити вираз, що завершує дужку, "]})>"["[{(< ".IndexOf($b[0])]чимось подібним ' }) >]'[($b[0]-32)%6]. ($b[0]-32)%6Дає вам 0,2,4,5,1для відкриття символів кронштейна, які можна використовувати в якості індексу в рядок закриття дужки ' }) >]'. Можливо, існує коротша "формула", але це здається досить гарним.
Данько Дурбич

@ DankoDurbić Відмінно! Я намагався придумати деяку математику, щоб вибрати правильний вихідний символ на основі значень ASCII, але я не зміг знайти правильну формулу. Мене постійно відштовхували від ()того, що я знаходився поруч, але інші дужки мають характер між собою, тому я пішов з індексуванням. Спасибі!
AdmBorkBork

Використання String.Replace()замість -replaceоператора купило б вам ще 2 байти (не потрібно бігти чи визначати клас символів [])
Матіас Р. Єссен

@ MathiasR.Jessen Якщо я чогось тут .Replace('[]{}()<>;,',' ')не пропускаю, не вдасться спіймати окремих персонажів, а натомість намагаюся відповідати символічному цілому, яке не існує. Нам потрібно використовувати Regex.Replace , який включає [regex]::виклик .NET і замість цього подовжить код.
AdmBorkBork

@TessellatingHeckler Дякую! Я -ne''замість цього використовував ще один байт |?{$_}.
AdmBorkBork

4

Python 2, 96 байт

import re
lambda(a,(b,c)):(b+c.join(re.findall('[-\d\.]+',a))+'])>} '['[(<{ '.index(b)]).strip()

Телефонуйте як:

f(('{-1.3, 3.4, ,4, 5.55555555}','[,'))

Вихід:

[-1.3,3.4,4,5.55555555]

2

JavaScript (ES6), 82 92 116 92 байт

(a,b)=>(c=a.match(/-?\d+(\.\d+)?/g).join(b[1]),d=b[0],d<"'"?c:d+c+"]}>)"["[{<(".indexOf(d)])

Анонімна функція, запустіть її так

((a,b)=>(c=a.match(/-?\d+(\.\d+)?/g).join(b[1]),d=b[0],d<"'"?c:d+c+"]}>)"["[{<(".indexOf(d)]))("{1;  2;3;   4}","<;")

Це, ймовірно, може бути далі для гольфу ..

Безумовно

(a,b)=>(                             // "{1;  2;3;   4}", "<;"
    c=a.match(/-?\d+(\.\d+)?/g)      // regex to match decimals
    .join(b[1]),                     // c -> "1;2;3;4"
    d=b[0],                          // d -> "<"
    d<"'" ?                          // if d is smaller than ' then ...
        c :                          // return just "1;2;3;4"
        d + c +                      // "<" + "1;2;3;4" + ...
        "]}>)" [ "[{<(".indexOf(d) ] // "]}>)"[2] -> ">"
)

Я думаю, що ви повинні приймати як рядок, а не список.
суперактор

Абсолютно неправильно це: The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters. Виправлено це, спасибі
Bassdrop Cumberwubwubwub

2

Математика, 108 байт

Математика, як правило, незграбна зі введеннями рядків, якщо лише рядки не повинні інтерпретуватися як текст.

c=Characters;t_~f~p_:=({b,s}=c@p;b<>Riffle[StringCases[t,NumberString],s]<>(b/.Thread[c@"[ {<(" -> c@"] }>)"]))

Пояснення

StringCases[t,NumberString]повертає список рядків чисел.

Riffleвставляє роздільники між числами.

/.Thread[c@"[ {<(" -> c@"] }>)"]) замінює ліву "дужку" правою дужкою.

<>- це форма інфіксації StringJoin. Він склеює міжряддя.


2

Матлаб, 85 байт

@(s,x)[x(1) strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)) x(1)+(x(1)~=32)+(x(1)~=40)]

Приклад використання:

>> @(s,x)[x(1) strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)) x(1)+(x(1)~=32)+(x(1)~=40)]
ans = 
    @(s,x)[x(1),strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)),x(1)+(x(1)~=32)+(x(1)~=40)]

>> ans('1 2.4 -3 -444.555 5', '[,')
ans =
[1,2.4,-3,-444.555,5]

1

Джулія, 95 байт

f(l,s)=(x=s[1]<33?"":s[1:1])*join(matchall(r"[\d.-]+",l),s[2])*string(x>""?s[1]+(s[1]<41?1:2):x)

Це функція, fяка приймає два рядки і повертає рядок.

Безголівки:

function f{T<:AbstractString}(l::T, s::T)
    # Extract the numbers from the input list
    n = matchall(r"[\d.-]+", l)

    # Join them back into a string separated by given separator
    j = join(n, s[2])

    # Set the opening bracket type as the empty string unless
    # the given bracket type is not a space
    x = s[1] < 33 ? "" : s[1:1]

    # Get the closing bracket type by adding 1 or 2 to the ASCII
    # value of the opening bracket unless it's an empty string
    c = string(x > "" ? s[1] + (s[1] < 41 ? 1 : 2) : x)

    # Put it all together and return
    return x * j * c
end

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