3 분할!


16

문자열이 주어지면 _끝 부분 에 패딩 하여 세 개의 문자 그룹으로 나눕니다 .

관련 이지만 여전히 다릅니다.


샘플 I / O :

  • 'abcde' -> 'abc', 'de_'

  • '1234' -> '123', '4__'

  • '' -> [] or falsey value

  • 'Three spree!' -> 'Thr', 'ee ', 'spr', 'ee!'

  • 6MB 문자열

이것은 이므로 가장 적은 바이트가 이길 것입니다!

편집 : 마지막으로 출력이 무제한 입니다.


10
왜 빈 문자열이 특별한 경우입니까? 패딩에 사용할 캐릭터를 선택할 수 있습니까?
얽히고 설킨 Shaggy

12
따라서 작업은 실제로 다음과 같습니다 . 문자열이 주어지면 거짓 값을 빈 값으로 반환하고 그렇지 않으면 값을 세 그룹으로 나누고 필요한 경우 밑줄로 채 웁니다 . 관련이없는 두 가지 작업 (문자열 길이 확인 및 분할)이 이상하게 보입니다.
Adám

15
피해야 할 사항 : 예외적 인 경우 . 이 경우 빈 문자열은 빈 배열 또는 이와 동등한 값을 반환해야하며 잘못된 값이 아닙니다.
Jo King

6
정적으로 유형이 많은 언어는 함수에서 하나 이상의 유형을 반환 할 수 없습니다
무지의 구현

4
@manassehkatz 예, 그러나 해당 언어 로만 제공 됩니다. 일부 언어에서는 솔루션을 훨씬 더 복잡하거나 불가능하게 만듭니다 (예 : 정적으로 유형이 지정된 언어).
Jo King

답변:



8

파이썬 3, 58 47 34 바이트

다른 사람이 더 잘할 수 있다고 확신 합니다. 다른 사람이 더 잘했습니다. -11 -24 바이트의 Jo King에게 감사 합니다!

출력은 제한이 없으며 터플 지옥에 오신 것을 환영합니다. 빈 입력에서 빈 목록 ( falsy )을 리턴 합니다.

lambda x:[*zip(*[iter(x+"__")]*3)]

TIO




4

APL + WIN 36 24 22 바이트

출력이 이제 제한이 해제되고 APL + WIN에서 작동하도록 수정 된 @ Adám의 첫 번째 주석의 코드를 사용하고 두 번째 주석과 함께 2를 더한 결과 12 바이트가 저장되었습니다. 감사.

(⌈(↑⍴s)÷3)3⍴(s←⎕),'__'

문자열을 입력하라는 메시지를 표시하고 결과를 nx3 배열로 출력합니다.

온라인으로 사용해보십시오! Dyalog Classic 제공


@아담. 가장 오른쪽에 APL + WIN에서 도메인 오류가 발생 함
Graham

에 실패 ''? 나는 OP (어떤 이상한 이유로) 결과가 0(어떤 등급이든 ) 필요하다고 생각합니다 .
Adám

1
@ Adám 0 x 3 배열을 생성합니다. OP는 이제 널 입력에 대해 "거짓"을 원하는 것으로 보입니다. 사양을 계속 변경 하면서이 시점에서 절을하고 대답을 그대로 남겨 두겠습니다! 개선해 주셔서 감사합니다.
Graham



3

Japt , 8 바이트

빈 문자열을 특수한 경우 +1 바이트 패딩 문자를 선택할 수 있으면 2를 절약 할 수 있습니다.

©ò3 ú'_3

시도 해봐

©ò3 ú'_3     :Implicit input of string
©            :Logical AND with
 ò3          :Split into chunks of 3
    ú'_3     :Right pad each with "_" to length 3


2

CJam , 11 바이트

q'_3*+3/);p

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

빈 입력의 경우 빈 문자열을 제공하며 이는 잘못된 것입니다.

작동 원리

q     e# Read input as a string
'_    e# Push char '_'
3*    e# String formed by that char repeated 3 times
+     e# Concatenate to input string
3/    e# Split in groups of 3, the last of which may be shorter. Gives array of strings
);    e# Detach last string from the array and delete it
p     e# Print string representation of the array

2

레티 나 0.8.2 , 10 바이트

$
__
!`...

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

$
__

_마지막 그룹을 채울 필요가있는 경우을 두 개 추가하십시오 .

!`...

가능한 많은 세 그룹을 일치시켜 개수가 아닌 일치 자체를 출력합니다. (Retina 1에서는이 L대신에 사용 !됩니다.)




1

젤리 , 9 바이트

s3o€“___”

문자 목록을 허용하는 모나드 링크 문자 목록을 생성합니다 (빈 입력은 빈 출력을 생성 함).

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

어떻게?

s3o€“___” - Link: list of characters
s3        - split into chunks of three
   €      - for each chunk:
  o       -   OR (vectorises):
    “___” -     list of characters = ['_', '_', '_']

주 :
(가) 빈 입력의 가장자리 사건을 처리하기 위해에만 필요합니다.
전체 프로그램은 후행을 떨어 뜨릴 수 있지만 여기서는 전체 프로그램의 인쇄 동작이 모든 것을 분쇄하므로 그렇게 할 수 없습니다.


동등한 9 :

o3ÐƤ“___”

시도 해봐


대안 9 :

;“___”s3Ṗ

시도 해봐



1

자바 10 116 113 바이트

s->{s+="__";int l=s.length()/3,i=l;var r=new String[l];for(;i-->0;)r[i]=s.substring(i*3,i*3+3);return l<1?0>1:r;}

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

아니면 104 101 바이트 빈 배열이 아닌 경우, false출력으로서 허용된다 ..

s->{s+="__";int l=s.length()/3;var r=new String[l];for(;l-->0;)r[l]=s.substring(l*3,l*3+3);return r;}

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

설명:

s->{                             // Method with String as both parameter and return-type
  s+="__";                       //  Append two "_" to the input-String
  int l=s.length()/3;            //  Get the length, integer-divided by 3
  var r=new String[l];           //  Create a string-array with that many parts
  for(;l-->0;)                   //  Loop `l` in the range (l, 0]:
    r[l]=                        //   Set the `l`'th value of the array to:
         s.substring(l*3,l*3+3); //   Get the substring of size 3 from index `l*3` from `s`
  return r;}                     //  Return the array

이제 빈 배열이 허용됩니다
Benjamin Urquhart

1

루비, 73 42 바이트

a=gets
a.length!=0?a.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}:'falsey value'

편집 : 잘못된 값은 필요하지 않은 것처럼 보입니다.

gets.scan(/.{1,3}/).map{|s|(s+'_'*3)[0,3]}

1
최대 패딩은 2 자이므로 '_'*2리터럴 '__'이 더 짧을 수 있습니다. 그러나 패딩을 미리 추가하면 3 자보다 짧은 조각과 간단히 일치하지 않습니다 puts"#{gets}__".scan /.../. (명시적인 인쇄가 irb없는 것으로 간주 되지 않음에 유의하십시오 ruby.)
manatwork





1

배쉬 , 90 바이트

이것은 전통적인 Bourne 쉘과 * nix 명령 (내가 만든 하나의 버전은 205 바이트로 끝남)이 아닌 Bash 기능을 사용합니다. 나는 문자열에 두 개의 _ 문자를 추가하는 회피를 사용하여 속였습니다.

c=;read a;a=${a}__;while (($(echo ${#a})>2));do b=${a:0:3};c=$c\ $b;a=${a#$b};done;echo $c

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



1

GNU sed , 27 바이트

s:$:__:
s:...:& :g
s: _*$::

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

sed는 잘못된 값을 의미하지 않기 때문에 빈 문자열 입력과 관련하여 약간 까다로워집니다. 이 문제를 처리하기 위해 제출 한 내용을 확인하는 두 가지 규칙 해석 방법을 제공합니다.


ㅏ. 본질적으로 후행 줄 바꿈이 아니라 입력으로 아무것도 제공하지 않습니다 (6MB 파일을 포함한 모든 예제의 경우와 동일).

용법:

echo -n ""|sed -f script

출력 : sed는 입력없이 스크립트를 실행하지 않기 때문에 아무것도 인쇄되지 않습니다.


비. sed가 고유 한 문자열 인 잘못된 값으로 간주 될 수 있습니다. 즉, 입력이 빈 문자열 인 경우에만 반환됩니다.

용법:

echo ""|sed -f script

산출:

__

첫 번째 해석은 의도 된 규칙과 가장 비슷하다고 생각하기 때문에 훨씬 더 첫 번째 해석을 선호하지만 마지막 TIO 링크를 사용하여 스크립트를 실행하면 도움이됩니다.




0

첨부 , 34 23 바이트

PadRight&"_"&3=>@Chop&3

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

설명 (오래됨)

{On[#_-1,PadRight&"_"&3,_]}@Chop&3
                           @Chop&3    chop the input string into groups of 3s
{On[#_-1               ,_]}           on the last group
        ,PadRight                         pad it
                     &3                   to length three
                 &"_"                     with underscores

마지막 요소 대신 모든 요소를 채워서 저장 하시겠습니까 ?
얽히고 설킨 Shaggy

@Shaggy 좋은 지적! 나는 그것으로 볼 것이다
코너 오브라이언에게

0

, 10 바이트

E⪪S³…⁺ι__³

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

  S         Input string
 ⪪ ³        Split into groups of up to 3 characters
E           Map over each group
      ι     Current group
     ⁺      Concatenated with
       __   Literal `__`
    …    ³  Moulded to length 3
            Each group implicitly printed on its own line


0

Befunge-93 , 30 29 바이트

~:1+%,~:1+!"`"*+,~:1+!"`"*+,,

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

빈 입력에 대해서는 아무것도 출력하지 않으며, 그렇지 않으면 길이가 3 인 문자열을 NUL 문자로 구분하여 출력합니다.

설명:

~ 입력 문자를 스택으로 푸시
 : 1+ 중복 입력 및 추가 1
    스택 및 푸시 결과의 % Modulo 상위 2 값
                                입력이 -1 (스트림 끝) 인 경우 -1 % 0-> 정지를 계산하십시오.
                                그렇지 않으면 input % (input + 1)-> input 계산
     , 팝 및 출력 문자
      ~ 입력 문자를 스택으로 푸시
       : 1+! 중복 된 입력, 1 추가 및 논리 NOT 수행
           "`"* 96 곱하기 ( '`'에 대한 ASCII 코드)
                                NOT의 결과에 따라 96 또는 0을 반환합니다.
               + 스택에서 상위 2 개의 값을 추가하고 결과를 푸시
                                입력이 -1 (스트림 끝) 인 경우 -1 + 96 = 95 또는 '_'의 ASCII 코드를 누릅니다.
                                그렇지 않으면 입력 +0을 푸시합니다
                , 팝 및 출력 문자
                 ~ : 1 +! "`"* +, 세 번째 문자를 처리하기 위해 다시 같은 블록
                            , NUL 문자를 출력하십시오 (스택이 비어 있으므로 스택에서 팝하면 0이 반환됩니다)

명령 포인터는 끝에 줄 바꿈되어 전체 라인을 반복합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.