문자열을 n 조각 (또는 길이 n 조각)으로 분할


11

도전

이 과제에서는 입력 순서에 따라 서로 다른 두 가지 (그러나 관련) 작업을 수행해야합니다.
프로그램은 문자열 s과 정수 n를 입력으로 받고

  • 분할 s길이의 조각으로 n경우 s먼저 다. 필요한 경우 마지막 요소가 더 짧아집니다.
  • 분할 sn하면 동일한 길이의 조각 n먼저 다. 그렇지 않으면 첫 번째 요소 len(s)의 배수가 더 길어집니다.nlen(s) mod n

이 2 개의 입력 만받을 수 있습니다. s숫자 만 포함하지 않습니다.

메모

  • 역 매핑을 사용할 수 있습니다. 그렇게하면 대답에 유의하십시오.
  • s인쇄 가능한 ASCII 문자 만 포함 합니다 (줄 바꿈 없음).
  • 이 두 작업을 직접 해결하는 내장 기능을 사용할 수 없습니다. 다른 모든 내장이 허용됩니다.
  • 동일한 출처에서 두 가지 주장을 모두 취해야합니다.
  • 당신은 순서가 분명한 한 순서를 명확하게 나타내는 순서 목록이나 다른 형식으로 인수를 취할 수 있습니다.
  • 입력을 하나의 문자열 / 스트림으로 가져 와서 널 입력과 같이 유효한 입력이 아닌 문자를 사용하여 분리 할 수 ​​있습니다.
  • n항상 길이 s보다 길거나 0보다 큽니다.
  • 특정 부분과 순서를 명확하게 나타내는 한 결과 목록을 공명 가능한 형식으로 출력 할 수 있습니다.

입력 : programming, 3
11은 3으로 나눌 수 없으므로 마지막 요소에는 2 자만 포함됩니다
. 출력 : ["pro", "gra", "mmi", "ng"]

입력 : 3, programming
11은 3의 배수가 아니므로 처음 두 요소는 하나 더 길어집니다
. ["prog", "ramm", "ing"]

규칙

  • 기능 또는 전체 프로그램이 허용됩니다.
  • 입 / 출력의 기본 규칙 .
  • 표준 허점이 적용됩니다.
  • 이것은 이므로 바이트 수가 가장 적습니다. Tiebreaker는 이전에 제출되었습니다.

테스트 사례

Pyth 프로그램으로 테스트 사례를 생성했습니다 (내장 사용, 유효한 답변 없음). 기본 버전을 제공 한 @FryAmTheEggman에게 감사합니다!

3, helloworld-> [ '지옥', 'owo', 'rld']
helloworld, 3-> [ 'hel', 'low', 'orl', 'd']
1, 프로그래밍-> [ '프로그래밍']
프로그래밍, 1-> [ 'p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, 프로그래밍-> [ 'pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
프로그래밍, 8-> [ 'programm', 'ing']
9, 코드 골프-> [ 'c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
코드 골프, 9-> [ '코드 골프']
4, 133tspeak-> [ '133', 'ts', 'pe', 'ak']
133tspeak, 4-> [ '133t', 'spea', 'k']

행복한 코딩!


이 두 가지 작업을 해결하는 내장 기능을 사용할 수 없습니다. 여기에는 다른 내장 기능이 포함되어 있습니까? 예 를 들어 문자열에서 n 번째 문자를 모두 얻 거나 발생시 분할 됩니까?
Dennis

@Dennis 이것은 이것을 직접 해결하는 내장을 배제하기위한 것입니다. 나는 명확히했다.
Denker

언어가 배열을 지원하지 않으면 어떻게 출력해야합니까? 문자열의 각 결과 사이에 줄 바꿈이 허용됩니까?
Conor O'Brien

또한 입력이 모호한 숫자의 배열 인 언어의 경우 절차는 무엇입니까?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 일어날 수 없습니다. 는 숫자 만 포함하지 않습니다 . 또한 결과 목록을 특정 부분과 물론 여러 줄로 된 출력을 포함 하는 순서명확하게 나타내는 한 공명 가능한 형식으로 출력 할 수 있습니다.
Denker

답변:


3

MATL, 46 26 21 27 29 42 바이트

jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt

온라인으로 사용해보십시오! (최신 버전의 언어로 작동하도록 약간 업데이트 됨)

설명

j           % Explicitly grab the first input as a string
t           % Duplicate
U           % Attempt to convert it to a number
?           % If the conversion to a number was successful
    j       % Explicitly grab the second input as a string
    t       % Duplicate the value
    b       % Bubble-up the first element in the stack
    U       % Convert to a number from a string
    e       % Reshape the string into a nGroup x nPerGroup matrix
    !       % Take the transpose
    t       % Duplicate the result
    n       % Number of characters in the repmat result
    2Gn     % Number of characters in the string
    >?      % If chars in repmat > chars in string
        O   % Zero
        t   % Duplicate 
        (   % Assign the last element to a null character (bug in MATL)
    ]       % End if statement
    t       % Duplicate this matrix
    g       % Convert to a logical matrix
    b       % Bubble-up the original string
    w       % Flip the top two elements
    (       % Assign the non-empty characters to the chars from the input string
}           % Else the string comes first
    i       % Explicitly grab the second input (the number)
    e       % Reshape the characters into an nPerGroup x nGroup 2D array
]           % End of if statement
!           % Take the transpose so it reads left-to-right
2           % Number literal
t           % Duplicate
$X{         % Call num2cell to convert to a cell array
Oc          % Null character
''          % Empty string
Zt          % Replace null chars with empty strings
            % Implicit display of stack contents

일부 목록 요소의 끝에 나타나는 인쇄 할 수없는 것은 무엇입니까? 이들은 입력의 일부가 아니므로 출력의 일부도 아니어야합니다.
Denker

아닌가요 ea는 내장 금지?
FliiFe

아마 교체 XUZN?...에 의해 U?...두 교환 if가지. 또한, 당신은 필요하지 않습니다3$
Luis Mendo

@DenkerAffe 죄송합니다. 지금 수정해야합니다.
Suever

@FliiFe 초기 게시물에 대한 의견을 바탕으로 e문제를 직접 해결하지는 않으므로 금지 된 것으로 간주하지 않습니다.
Suever

4

자바 스크립트 (ES6), 132 바이트

(s,t)=>+t?[...Array(-~(~-s.length/+t))].map((_,i)=>s.substr(i*t,t)):[...Array(s=+s)].map(_=>t.slice(p,p-=~((t.length-p-1)/s--)),p=0)

이것은 아마도 절망적으로 과장된 것입니다.


글쎄, 내 (현재 사망 한) 솔루션은 심하게 엔지니어링되지 않았습니다. +1
edc65

4

JavaScript (Firefox), 88 87 바이트

a=>b=>(s=+b?a:b,i=x=0,l=s.length,[for(c of s)if(r=s.slice(x,x+=+b||l/a+(i++<l%a)|0))r])

(...)("programming")(3)Firefox 30 이상을 사용 하는 것처럼 호출하십시오 .


2

루비, 119 바이트

->x,y{r=[t=0];x.to_s==x ?(r.push x[t...t+=y]while x[t]):x.times{r.push y[t...t+=y.size/x+(r[y.size%x]? 0:1)]};r[1..-1]}

그리고 나는 2 바이트로 1 위를 차지합니다 ...


Ruby의 정규 표현식 객체는 문자열과 동일한 방식으로 값을 주입 할 수 있으므로 x.scan(/.{,#{y}})첫 번째 경우에서 문자열을 분할하는 경우에도 작동합니다. 아니면 내장으로 간주됩니까?
Value Ink

2

AWK, 121 130 128 122 바이트

$1~/^[0-9]+$/{s=1}{a=$(s+1)
b=s?$1:$2
$0=""
for(j=-b;j<=c=length(a);)$0=$0 substr(a,j+=b+s,b+(s=s&&j<c%b*(b+1)?1:0))" "}1

유일한 문제는 첫 번째 항목이 숫자 값으로 시작하는 문자열 인 경우입니다. 이로 인해 AWK문자열이 해당 숫자로, 두 번째 항목이 문자열로 표시됩니다.

OK ... 숫자 문제를 해결했지만 9 바이트를 추가했습니다 :(.

몇 바이트를 절약하기 위해 비트를 재 작업했습니다.

원래 길이로 거의 되돌아갑니다. :)


OK, @DenkerAffe는 일반적으로 작동하도록 수정했으며 결국에는 1 바이트 만 추가했습니다.
Robert Benson

1

하스켈, 131 바이트

import Data.Lists
q(d,m)=splitPlaces$(d+1<$[1..m])++[d,d..]
a#b|all(`elem`['0'..'9'])a=q(divMod(length b)$read a)b|1<2=q(read b,0)a

사용 예 :

*Main> "8" # "programming"
["pr","og","ra","m","m","i","n","g"]
*Main> "programming" # "8"
["programm","ing"]

작동 방식 : 주요 작업은 q숫자 (d,m)와 문자열 쌍을 취하는 도우미 함수에 의해 수행됩니다 s. 먼저 m시간 목록을 작성하고 d+1무한한 다수 d(예 : (1,3)-> [2,2,2,1,1,1,1,1,...])를 만듭니다. 그런 다음 목록에서 지정한 길이의 청크 splitPlaces로 분할 하는 데 사용 됩니다 s. 요소가 부족 splitPlaces하면 중지 s되므로 무한 목록이 좋습니다.

메인 함수 #는 어떤 매개 변수가 숫자 n/ 문자열인지 확인 str하고 또는 더하기 또는를 q사용하여 호출합니다 . (div (length str) n, mod (length str) n)(n, 0)str


0

C # (LINQPAD)-335 바이트

var y=Util.ReadLine().Split(',');int x,j=0;var t=int.TryParse(y[0].Trim(),out x);x=x==0?int.Parse(y[1].Trim()):x;var i=t?y[1].Trim():y[0];var z="";if(!t){while(i.Substring(j).Length>x){z+=i.Substring(j).Length>x?i.Substring(j,x)+", ":"";j+=x;}z+=i.Substring(j);}else z=string.Join(", ",i.Split(x).Select(s=>string.Concat(s)));z.Dump();

입력 판독 부분이 약간의 공간을 차지했습니다. 가장 긴 답변의 승자.

사용법 # 1 :

$ 3, helloworld

>> hell, owo, rld

사용법 # 2 :

$ helloworld, 3

>>hel, low, orl, d

이게 뭐야?
Benjamin Urquhart

0

Pyth, 181 바이트

가장 긴 코드를 바이트 단위로 계산합니다. \ o /

DyGK@G0J:@G1"."1=YJV%lJKW<l@YN.EclJK=YXYN+@YN@YhN=Y.DYhN)FNr%lJK/-lJ%lJK/-lJ%lJKKW<l@YNsclJK=YXYN+@YN@YhN=Y.DYhN))RY)DPG=K@G1=J:@G0"."1=YJV/lJKW<l@YNK=YXYN+@YN@YhN=Y.DYhN))RY).xyQPQ

여기에서보십시오! (온라인 통역사는 버그가있는 것 같습니다. 입력하지 않아야하지만 입력을 표시합니다)

터미널 출력은 다음과 같습니다.

» pyth split.pyth <<<'["helloworld", 3]' 
['hel', 'low', 'orl', 'd']
» pyth split.pyth <<<'[3, "Helloworld"]'
['Hell', 'owo', 'rld']

진심으로, 나는 새로운 접근 방식에 개방되어 있습니다. 나는 파이썬을 처음 사용하기 때문에 아마도 몇 가지 속기를 놓쳤을 것입니다.

내 대답은 자바 스크립트 답변보다 길다는 점에서 대답이 필사적이라고 생각합니다 ...


샘플 입력 및 출력을 제공 할 수 있습니까?
Leaky Nun

헤더 아래의 공식 솔루션에 유의하십시오 testcases. 테스트 케이스는 Pyth에 의해 생성됩니다. 해결책은 .xcsJKcJsK어디 J이며 K두 가지 인수입니다.
Leaky Nun

@KennyLau 온라인 pyth 통역사에 대한 링크를 추가했습니다. 이상하게도 어제하지 않았을 것이라고 확신하는 동안 입력도 출력합니다.
FliiFe

공백을 사용하여 인쇄 금지
Leaky Nun

@KennyLau 공간은 어디입니까?
FliiFe

0

PHP, 114 바이트

[$t,$n,$p]=$argv;for(@+$p?$s=$n:$f=$n*($p=strlen($s=$p)/$n)%$n;$t;)echo$t=substr($s,$a+=$e,$e=$p+($i++<$f)|0),"
";
  • 문자열은 숫자로 시작하지 않아야합니다.
    (교체 +@$pis_numeric($p)수정합니다.)
  • 출력에는 청크 "0"이 포함되지 않아야합니다.
    ( 고정 하기 전에 ~인쇄 가능한 ASCII, ASCII의 경우 삽입 하십시오.)a&$t;
  • 온라인으로 실행 -nr하거나 사용해보십시오 .

0

PowerShell을 , 122 118 바이트

param($a,$b)if($a-is[int]){$a,$b=$b,((($l=$b|% Le*)-($c=$l%$a))/$a)}$a-split("(..{$b})"*$c+"(.{0,$b})"*$a.Length)-ne''

온라인으로 사용해보십시오!

덜 골프 :

param($a,$b)
if($a-is[int]){
    $length=$b|% Length
    $c=$length%$a
    $a,$b=$b,(($length-$c)/$a)  # recalc length and swap
}
$pattern="(..{$b})"*$c+"(.{0,$b})"*$a.Length
$parts=$a -split $pattern       # pattern like '(..{3})(..{3})(.{0,3})(.{0,3})(.{0,3})'
$parts -ne ''                   # output not empty parts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.