文字列を切り取ります


29

文字列のスライスのリストの入力を指定すると、元の文字列が出力されます。

各スライスは、長さ2のリストとして与えられます。これには、スライスの開始位置(整数≥0)とスライス自体が含まれます。ご使用の言語が任意の型の配列をサポートしていない場合、これを構造体または類似物、または単に数字、スペース、そしてスライスからなる文字列としてとることもできます。

各スライスの2つの要素の順序はユーザー次第です。さらに、スライスの表現を長さ2の配列として使用することを選択した場合、2次元配列または単一のフラット配列として入力を受け取ることができます。最後に、位置を表す整数は、インデックスがゼロまたは1のいずれかです(ここでの例はすべてインデックスがゼロです)。

入力は常に、指定された最高位置まで文字列全体を決定するのに十分です。つまり、「穴」や「ギャップ」はありません。したがって、出力には余分な末尾または先頭の文字を含めることはできません(通常のオプションの末尾の改行以外)。入力は常に一貫しており、スライスが互いに競合することはありません。

これはであるため、バイト単位の最短コードが優先されます。

テストケース:

In                                                Out
-----------------------------------------------------------
[[2, "CG"], [0, "PP"], [1, "PC"]]               | PPCG
[[0, "foobarbaz"]]                              | foobarbaz
[[0, "foobar"], [6, "baz"]]                     | foobarbaz
[[2, "ob"], [5, "rba"], [0, "fooba"], [8, "z"]] | foobarbaz
[[0, "fo"], [0, "fooba"], [0, "foobarbaz"]]     | foobarbaz

文字列に含まれる文字に制限はありますか?
GamrCorps

@GamrCorpsいいえ、特別な制限はありません。
ドアノブ

1
出力文字列の長さに制限はありますか?
メゴ

@Megoメモリ/ストレージによって課される自然な制限を除いて、なし。
ドアノブ

1
ハ!これは私のテキストエディタのアンドゥメカニズムです
。D– slebetman

回答:


5

ゼリー、10 9バイト

Ḣ0ẋ;Fµ€o/

オンラインでお試しください!

使い方

Ḣ0ẋ;Fµ€o/  Main link. Input: A (list of pairs)

     µ€    Convert the chain to the left into a link, and apply it to each pair.
Ḣ          Pop the first element.
 0ẋ        Yield a list of that many zeroes.
   ;F      Concatenate the list of zeroes with the popped, flattened pair.
       o/  Reduce the generated lists by logical OR.
           Since all characters are truthy, this overwrites zeroes with characters,
           but never characters with zeroes.

14

Python 2、49バイト

lambda l:`map(max,*[' '*n+s for n,s in l])`[2::5]

最初に、オフセットをスペースで埋めることで文字列を整列します(明確にするためにアンダースコアとして表示)

[[2, "CG"], [0, "PP"], [1, "PC"]] 

__CG
PP
_PC

次に、mapto zipを使用して各列の最大値を取得します。これは、スペース(印刷可能な最小文字)の小さい値と、None文字列が短すぎるs を無視します。

__CG
PP
_PC

PPCG

最後に、トリック''.joinを使用して文字列に[2::5]


2 :: 5トリックは何ですか?それはどのように文字列を結合しますか?5番目のインデックスごとに2から始まるのではないでしょうか?
ロバートフレイザー

@RobertFraserこちらをご覧ください
xnor

8

Perl、25

に+2を追加 -lp

STDINから入力を取得します。たとえば

perl -lp slices.pl
2 CG
0 PP
1 PC

(^ Dまたは^ ZまたはシステムのSTDINを閉じるもので閉じます)

slices.pl

/ /;$r|=v0 x$`.$'}{*_=r

nullバイトv0は2バイト節約するのではありませんか(の前のスペースを省略することもできるためx)?編集:うーん、いや、それを試してみたところ、Can't locate object method "x" via package "2"何らかの理由で(または最初の行にある数字は何でも)手に入れた。
msh210

1
C変数などの名前のみがリテラルを引用符で囲むことができません。したがって、v0は\ 0を取得する最短の方法です(この場合、余分なスペースがあるため、タイの引用符の間は\ 0です)
Ton Hospel

8

JavaScript(ES6)、61バイト

a=>a.map(([o,s])=>[...s].map(c=>r[o++]=c),r=[])&&r.join``

編集:@ edc65のおかげで4バイトを保存しました。


a => a.map(([o、s])=> [... s] .map(c => r [o ++] = c)、r = [])&& r.join``は4バイトを節約します
edc65

7

Haskell、57バイト

import Data.List
map snd.sort.nub.(>>= \(n,s)->zip[n..]s)

使用例:

*Main> map snd.sort.nub.(>>= \(n,s)->zip[n..]s) $ [(2,"CG"),(0,"PP"),(1,"PC")]
"PPCG"

仕組み:(index,letter)すべてのスライスのすべての文字のペアを作成し、単一のリストに連結し、重複を削除し、インデックスでソートし、インデックスを削除します。


4

MATL、15バイト

''i"@Y:Y:tn:b+(

で動作する現在のバージョン(13.0.0)言語/コンパイラの。

入力は中括弧と一重引用符で囲みます。(MATLAB / MATLの中括弧は、セル配列を定義します。セル配列は、任意の、場合によっては異なるタイプのコンテンツを持つことができるリストです。)テストケースは次のとおりです。

{{2, 'CG'}, {0, 'PP'} {1, 'PC'}}
{{0, 'foobarbaz'}}
{{0, 'foobar'}, {6, 'baz'}}
{{2, 'ob'}, {5, 'rba'}, {0, 'fooba'}, {8, 'z'}}
{{0, 'fo'}, {0, 'fooba'}, {0, 'foobarbaz'}}

オンラインでお試しください!

''      % push empty string. This will be filled with the slices to produce the result
i       % take input: cell array of cell arrays. For example: {{0, 'foobar'}, {6, 'baz'}}
"       % for each (1st-level) cell
  @     %   push that cell. Example: {{0, 'foobar'}}
  Y:    %   unpack (1st-level) cell, i.e. push its contents. Example: {0, 'foobar'}
  Y:    %   unpack (2nd-level) cell array: gives number and substring. Example: 0, 'foobar'
  tn:   %   duplicate substring and generate vector [1,2,...,n], where n is length of
        %   current substring (in the example: 6)
  b+    %   add input number that tells the position of that substring within the whole
        %   string (in the example: 0; so this gives [1,2,...,6] again)
  (     %   assign substring to the total string, overwriting if necessary. Note that
        %   MATL uses 1-indexing
        % end for each
        % implicit display

1
この答えは素晴らしいです!
コナーオブライエン

3

DUP、14バイト

[0[$;$][,1+]#]

Try it here.

匿名ラムダ。使用法:

2"CG"0"PP"1"PC"[0[$;$][,1+]#]!

注:DUPには実際には配列がないため、この入力形式で問題ないことを願っています。

説明

まあ、DUPの文字列の理解は...興味深いです。文字列は一連の数値変数として保存され、各変数は文字列からの文字コードを保持します。2"CG"2をスタックにプッシュし、2から始まるインデックスで文字列を作成するような動作が行われます。

これらのインデックスは実際には変数であるため、上書きできます。それが、入力が実際に行っていることです:オーバーライドです!Stepこのためのより良いアイデアを得るために、通訳サイトを押してみてください。この後、スライスされていない文字列を取得します。

これが出力の出番です。

[            ] {lambda}
 0             {push 0 to the stack as accumulator}
  [   ][   ]#  {while loop}
   $;$         {duplicate, get var at TOS value, see if that var is defined}
        ,1+    {if so, output charcode at TOS and increment accumulator}

DUP!

2

PHP、146文字

注:ユーザー入力を評価することは常に良い考えです。

ゴルフ

<?$a=[];$f=0;eval("\$b={$argv[1]};");foreach($b as$d){$f=$d[0];$e=str_split($d[1]);foreach($e as$c){$a[$f++]=$c;}}ksort($a);echo join('',$a)."\n";

非ゴルフ

<?php
$array = array();
$p = 0;
eval("\$input = {$argv[1]};");
foreach($input as $item)
{
    $p = $item[0];
    $str = str_split($item[1]);
    foreach($str as $part)
    {
        $array[$p++] = $part;
    }
}
ksort($array);
echo join('', $array)."\n";
?>

各charが持つ特定のキーを使用して入力を配列に書き込み、それをすべて出力していることがわかります。

テスト

php unslice.php '[[0, "foobar"], [6, "baz"]]' -> foobarbaz

php unslice.php '[[2, "CG"], [0, "PP"], [1, "PC"]]' -> PPCG

php shorten.php unslice.php->スクリプトを107文字短縮しました。:D


Evalingユーザ入力は、良いアイデアことはありません D:コードゴルフはワーストプラクティスについてです」

$a[$f]=$c;$f++;PHPはわかりませんが、これはできません$a[$f++]=c;か?


@cat Thx mate、3文字短くしました。:D
timmyRS

1

真剣に、48バイト

,`i@;l(;)+(x@#@k`M;`i@X@M`MMu' *╗`iZi`M`i╜T╗`MX╜

真剣に ひも操作ひどく悪い。

オンラインでお試しください!

説明:

,`i@;l(;)+(x@#@k`M;`i@X@M`MMu' *╗`iZi`M`i╜T╗`MX╜
,                                                 get input
 `              `M;                               perform the first map and dupe
                   `     `MM                      perform the second map, get max element
                            u' *╗                 increment, make string of that many spaces, save in reg 0
                                 `   `M           third map
                                       `    `M    fourth map
                                              X╜  discard and push register 0

マップ1:

i@;l(;)+(x@#@k
i@;l            flatten, swap, dupe string, get length
    (;)+(       make stack [start, end, str]
         x@#@k  push range(start, end), explode string, make list of stack

マップ2:

i@X@M
i@X     flatten, swap, discard (discard the string)
   @M   swap, max (take maximum element from range)

マップ3:

iZi  flatten, zip, flatten (make list of [index, char] pairs)

マップ4:

i╜T╗  flatten, push reg 0, set element, push to reg 0

一言で言えば、このプログラムはnスペースを含む文字列を作成します。ここでn、文字列は入力に基づいた最小の長さです。各スライスの各文字の結果文字列のインデックスを決定し、そのインデックスの結果文字列の文字をその文字に設定します。


1

Python、91バイト。

catのおかげで1バイト節約されました。

少し長いです。もう少しゴルフをします。

def f(x):r={j+i:q for(i,s)in x for j,q in enumerate(s)};return"".join(map(r.get,sorted(r)))


0

CJam、26バイト

q~{~0c*\+}%{.{s\s|}}*e_0c-

オンラインでお試しください!。フォームの入力を受け取ります[["CG"2]["PP"0]["PC"1]]

説明:

q~           Read and eval input

{~0c*\+}%    Convert input strings into workable format
{      }%     Map onto each input
 ~            Evaluate
  0c          Null character
    *\+       Multiply by input number and concat to string

{.{s\s|}}*   Combine strings
{       }*    Fold array
 .{    }       Vectorize, apply block to corresponding elements of arrays
   s\s         Convert elements to strings
      |        Set Union

e_0c-        Remove null characters

0

R、181バイト

n=nchar;m=matrix(scan(,'raw'),ncol=2,byrow=T);w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))));for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''));cat("",w,sep="")

改行あり:

n=nchar
m=matrix(scan(,'raw'),ncol=2,byrow=T)
w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))))
for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''))
cat("",w,sep="")

R Gui(単一行1、または複数行1のソース)で機能しますが、ideoneでは機能しません。例:

> n=nchar;m=matrix(scan(,'raw'),ncol=2,byrow=T);w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))));for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''));cat("",w,sep="")
1: 2 ob 5 rba 0 fooba 8 z
9: 
Read 8 items
foobarbaz

入力方法に関する注意:

または、数字、スペース、およびスライスで構成される単純な文字列。

この種の入力で仕様のこの部分に準拠していると仮定します。複数の行で指定できますが、入力を終了する空白行がある限り、これは影響を与えません。

+1を削除して1ベースのインデックスを使用すると、2文字を節約できると思いますが、チャレンジ入力から始めました。


0

C、110バイト

c,i,j;char s[99];main(){while(~scanf("%i ",&i))for(;(c=getchar())>10;s[i++]=c);for(;s[j]>10;putchar(s[j++]));}

このプログラムは、それぞれ1行の入力でインデックスの後にスライスを取得します。

ゴルフをしていない:

c,i,j;char s[99];

main(){
    while(~scanf("%i ",&i))
        for(;(c=getchar())>10;s[i++]=c);
    for(;s[j]>10;putchar(s[j++]));
}

ideone.comでテストする


0

Lua、113バイト

z=loadstring("return "..io.read())()table.sort(z,function(a,b)return a[1]<b[1]end)for a=1,#z do print(z[a][2])end

これはおそらく、私が書いたより安全なコードの一部です。アイデアはシンプルです。ユーザーは次のようにフォーマットされた配列を入力{{1, "1"}, {3, "3"}, {2, "2"}}します。その後、テーブルは最初のインデックスでソートされ、2番目のインデックスが印刷されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.