Sayısal liste dönüştürücüsü oluşturma


20

Bir sayı listesini (vektör, dizi ...) bir programdan diğerine kopyalayıp yapıştırmak istediğinizde bundan nefret etmeyin, ancak sayılara sahip olduğunuz format, ihtiyacınız olan formatla eşleşmiyor ?

Örneğin, MATLAB'da boşlukla ayrılmış bir listeniz olabilir:

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

Python'da, bu listeyi geçerli bir giriş yapmak için virgül eklemeniz gerekir, bu nedenle bu listeyi

[1, 2, 3, 4, 5]

çalışması için. C ++ 'da aşağıdakine benzer bir şey isteyebilirsiniz:

{16,2,77,29}

ve bunun gibi.

Herkesin hayatını kolaylaştırmak için, herhangi bir formatta * yer alan ve belirtilen başka bir formatta bir liste çıkaran bir liste dönüştürücü oluşturalım.

Geçerli parantezler:

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

Geçerli sınırlayıcılar:

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. 

Girişte, sayılar arasında herhangi bir sayıda boşluk olabilir, ancak çıkışın sıfır boşluk ( sınırlayıcı olarak kullanılıyorsa ,veya ;kullanılıyorsa) veya tek boşluk (boşlukla sınırlandırılmışsa) olmasını seçebilirsiniz .

Giriş listesine ek olarak, çıktı biçimini tanımlayan bir dize (veya iki karakter) olacaktır. Biçim dizesi ilk açılış braket tipi olacaktır (sadece), [, (, <, {veya (sonuncusu hiçbir çevreleyen braket olduğunda kullanılan tek alandır). Dirsek tipi ayırıcı tipi ile takip edilecek ,, ;ya da (son bir tek boşluk). İki giriş formatı karakteri yukarıda açıklanan sırayla tek bir bağımsız değişken (dize veya art arda iki karakter) olarak alınmalıdır.

Biçim dizelerine bazı örnekler:

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

Kurallar:

  • Çıktının önde gelen boşlukları olamaz
  • Çıktının sonunda boşluklar ve yeni satır olabilir
    • Çıktı sadece sayı listesi olmalı , değil ans =veya benzeri olmalıdır
  • Giriş, tamsayı veya ondalık sayıların (hem pozitif hem de negatif (ve sıfır)) bir listesi ve iki karakterden oluşan bir dize olacaktır
    • Giriş yalnızca tamsayılardan oluşuyorsa , çıktı listesinde yalnızca tamsayılar olmalıdır. Giriş listesi tamsayılardan ve ondalık sayılardan oluşuyorsa, tüm çıkış numaraları ondalık sayılar olabilir. (Tamsayıları tamsayı olarak tutmak isteğe bağlıdır)
    • Desteklenmesi gereken ondalık noktadan sonraki maksimum basamak sayısı 3'tür.
    • Girdi iki bağımsız değişken olacaktır. Yani sayılar bir bağımsız değişkendir ve biçim dizesi tek bir bağımsız değişkendir.
  • Kod bir program veya işlev olabilir
  • Giriş işlev bağımsız değişkeni veya STDIN olabilir

Bazı örnekler:

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]

Bayttaki en kısa kod kazanır. Her zaman olduğu gibi, kazanan, mücadelenin yayınlandığı günden bir hafta sonra seçilecektir. Daha sonra gönderilen cevaplar mevcut kazanandan daha kısasa yine de kazanabilir.


Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) her dil için en kısa çözüm listesi ve b) genel bir lider panosu olarak cevaplardan katalog oluşturur.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını snippet'te görünecek bir bağlantı da yapabilirsiniz:

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


Sondaki ve öndeki boşluklara izin veriliyor mu?
overactor

@overactor, ilk iki kurala bakın. Öncü boşluk boş değil, sondaki sorun yok.
Stewie Griffin

Girişi ters sırada alabilir miyiz? (önce sınırlayıcılar, ikinci liste)
Martin Ender

@ MartinBüttner, evet. Önce liste olması gerektiği belirtilmedi, bu yüzden seçebilirsiniz.
Stewie Griffin

J _negatif elementleri belirtmek için kullanır . :(
Zgarb

Yanıtlar:


1

CJam, 27 bayt

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

Burada deneyin.

açıklama

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

Anonim bir işlev olarak

Düzenleme: 2 bayt kaydedilen thx @ user81655 (ve 5 tane daha gözden geçirme)

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

Test snippet'i

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 bayt

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

Burada test edin.

İlk satırdaki formatı ve ikinci satırdaki listeyi bekler.

açıklama

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 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

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

Nasıl çalıştığına dair bir açıklama ekleyebilir misiniz?
Shelvacu

1
@Shel İşte.
Jakube

5

PowerShell, 108 , 100 95 85 bayt

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

(önceki sürümler için düzeltme geçmişine bakın)

Kaldırarak başka bir 15 bayt golfed $bve $sdeğişkenler ve iç ipte parens değişen.

Bu, girdiyi iki dize olarak alır ve bunları saklar $ive $zsonra yeni bir çıktı dizesi oluştururuz. İç parens -splits $ibir regex ile daha sonra sadece rakam seçmek için -jointekrar bir araya istenen sınırlayıcısıyla s. Bunu, sınırlayıcı girişinin ilk karakteriyle (örneğin, [) birleştiririz ve ilk karakterin ASCII değerine ve bazı formülasyon hilelerine dayalı olarak bir dizeye indeksleme ile kapatırız. Dış .Trim()kısım, önde gelen veya arkadaki boşlukları kaldırır.


Kapanış parantez ifadenizi "]})>"["[{(< ".IndexOf($b[0])]benzer bir şeyle değiştirebileceğinizi düşünüyorum ' }) >]'[($b[0]-32)%6]. ($b[0]-32)%6Verir 0,2,4,5,1, kapanış braket dizesine endeksi için kullanabileceğiniz ayraç karakteri, açma ' }) >]'. Daha kısa bir "formül" olabilir, ancak bu yeterince iyi görünüyor.
Danko Durbić

@ DankoDurbić Mükemmel! ASCII değerlerine dayanan doğru çıktı karakterini seçmek için biraz matematik bulmaya çalışıyordum, ancak doğru formülü bulamadım. Yan yana durarak takılmaya devam ettim (), ama diğer köşeli parantezler arasında bir karakter var, bu yüzden indeksleme ile gittim. Teşekkürler!
AdmBorkBork

Operatör String.Replace()yerine kullanmak -replacesize başka bir 2 bayt daha satın alacaktı (bir karakter sınıfından kaçmaya veya tanımlamaya gerek yok [])
Mathias R. Jessen

@ MathiasR.Jessen Burada bir şey eksik olmadıkça, .Replace('[]{}()<>;,',' ')tek tek karakterleri yakalamayacak, bunun yerine mevcut olmayan sembolik bütünle eşleşmeye çalışacağız. Bir .NET çağrısı içeren ve bunun yerine kodu uzatacak olan Regex.Replace'i kullanmamız gerekir [regex]::.
AdmBorkBork

@TessellatingHeckler Teşekkürler! Bunun -ne''yerine kullanarak başka bir bayt golf |?{$_}.
AdmBorkBork

4

Python 2, 96 bayt

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

Çağrı yap:

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

Çıktı:

[-1.3,3.4,4,5.55555555]

2

JavaScript (ES6), 82 92 116 92 bayt

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

Anonim bir işlev, şu şekilde çalıştırın

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

Bu muhtemelen daha fazla golf olabilir ..

Ungolfed

(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] -> ">"
)

Sanırım bir liste değil, bir dize olarak almak zorunda.
overactor

Tamamen bu yanlış: The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters. Düzeltildi, teşekkürler
Bassdrop Cumberwubwubwub

2

Mathematica, 108 bayt

Dizgi metin olarak yorumlanmadıkça, Mathematica genellikle dize girişleri ile beceriksizdir.

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

açıklama

StringCases[t,NumberString]sayı dizelerinin listesini döndürür.

Riffleayırıcıları sayılar arasına ekler.

/.Thread[c@"[ {<(" -> c@"] }>)"]) sol "braket" i sağ braketle değiştirir.

<>ekinin biçimidir StringJoin. Alt ipleri birbirine yapıştırır.


2

Matlab, 85 bayt

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

Örnek kullanım:

>> @(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

Julia, 95 bayt

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)

Bu, fiki dizeyi kabul eden ve bir dize döndüren bir işlevdir .

Ungolfed:

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

1

Bash + GNU Araçları, 90

b=${2:0:1}
echo $b`sed "s/[][{}()<>]//g;s/[,; ]\+/${2:1}/g"<<<"$1"``tr '[{(<' ']})>'<<<$b`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.