줄을 Un 다


29

문자열 조각 목록을 입력하면 원래 문자열을 출력합니다.

각 슬라이스는 슬라이스의 시작 위치 (정수 ≥0)와 슬라이스 자체를 포함하는 길이 2의 목록으로 제공됩니다. 언어가 임의의 유형의 배열을 지원하지 않는 경우 이것을 구조체 또는 이와 유사한 것으로 또는 단순히 숫자, 공백 및 슬라이스로 구성된 문자열로 사용할 수 있습니다.

각 슬라이스의 두 요소 순서는 사용자가 결정합니다. 또한 슬라이스 표현을 길이 2 배열로 사용하기로 선택한 경우 2 차원 배열 또는 단일 평면 배열로 입력 할 수 있습니다. 마지막으로 위치를 나타내는 정수는 0 인덱스 또는 1 인덱스 일 수 있습니다 (여기의 모든 예제는 0 인덱스입니다).

입력은 항상 전체 문자열을 주어진 가장 높은 위치까지 결정하기에 충분합니다. 즉, "구멍"이나 "간격"이 없습니다. 따라서 출력에 추가 후행 또는 선행 문자 (일반적인 선택적 후행 개행 문자 제외)를 포함해서는 안됩니다. 입력은 항상 일관되며 슬라이스가 서로 충돌하지 않습니다.

이것이 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

테스트 사례 :

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 아니요, 특별한 제한은 없습니다.
Doorknob

1
출력 문자열의 길이에 제한이 있습니까?
Mego

@Mego 메모리 / 스토리지에 의해 부과되는 자연적인 한계 외에는 없습니다.
Doorknob

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

파이썬 2, 49 바이트

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

먼저, 오프셋을 공백으로 채워서 문자열을 정렬합니다 (명확성을 위해 밑줄로 표시됨)

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

__CG
PP
_PC

이어서, 용도 mapzip및 공간의 값이 작은 (최소의 인쇄 문자)를 무시하고, 각 컬럼의 최대 소요 None어떤 문자열이 너무 짧으면 어디들.

__CG
PP
_PC

PPCG

마지막으로 트릭을 ''.join사용하여 문자열에 [2::5].


2 :: 5 트릭은 무엇입니까? 그것이 어떻게 문자열에 합류합니까? 매 5 번째 인덱스가 2에서 시작하지 않습니까?
Robert Fraser

@RobertFraser 여기를 참조 하십시오 .
xnor

8

펄, 25

에 +2 추가 -lp

STDIN에서 입력을 가져옵니다. 예 :

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

(^ D 또는 ^ Z로 닫거나 시스템에서 STDIN을 닫는 모든 항목)

slices.pl:

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

널 바이트 대신 v02 바이트 를 절약 하지 x않습니까? ( 앞의 공백을 생략 할 수 있기 때문에 )? 편집 : 흠, 아니요, 시도했을 때 Can't locate object method "x" via package "2"어떤 이유로 든 (또는 첫 번째 줄에있는 숫자가 무엇이든) 있습니다.
msh210

1
C 변수와 같은 이름 만 따옴표로 묶을 수 없습니다. V0는 (때문에 여분의 공간이나이 경우에는 넥타이 따옴표 사이에 \ 0) \ 0을 얻을 수있는 가장 짧은 방법입니다 그래서
톤 Hospel

8

자바 스크립트 (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

하스켈, 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";
?>

각 문자에있는 특정 키를 사용하여 배열에 입력을 쓴 다음 모두 출력한다는 것을 알 수 있습니다.

테스트

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
cat

$a[$f]=$c;$f++;PHP를 모르지만 이것이 될 수 $a[$f++]=c;없습니까?
고양이

Ill try it .. : D
timmyRS

@cat Thx 메이트가 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

파이썬, 91 바이트

고양이 덕분에 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)))

1

파이썬, 119115 바이트

def f(x,s=""):
 x.sort()
 for e in x:
  a=e[0];b=e[1]
  for i,c in enumerate(b):
   if len(s)<=(i+a):s+=c
 return s

테스트 사례

여기에 이미지 설명을 입력하십시오


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 (한 줄 또는 여러 줄에 대한 소싱)에서 작동하지만 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++]));}

이 프로그램은 인덱스 다음에 슬라이스를 각각 한 줄씩 입력합니다.

언 골프 드 :

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

루아, 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"}}다음과 같은 형식의 배열을 입력 한 다음 테이블이 첫 번째 인덱스별로 정렬되고 두 번째 인덱스가 인쇄됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.