문자열을 스프링


11

샌드 박스 게시물은 여기에 있습니다 .

문자열을 "스프링"하는 함수 나 프로그램을 만듭니다.

  • 입력은 Stdin의 문자열이거나 가장 가까운 대안입니다.
  • 입력은 인쇄 가능한 ASCII 및 / 또는 공백 만 포함합니다
  • 출력은 Stdout 또는 가장 가까운 대안입니다
  • 후행 줄 바꿈과 공백은 허용됩니다

문자열을 스프링하는 방법

  1. 필요한만큼 문자열을 많은 ASCII 스프링 코일로 포맷
  2. 코일을 가장 가까운 코일까지 공란으로 채 웁니다
  3. 코일 주위의 스프링을 따라 문자를 읽으십시오.

이것은 ASCII 스프링 코일입니다.

#
# ####
 #    #
# ####
#

를 Where #들 문자열의 문자입니다

예를 들면 다음과 같습니다.

abcdefghijklmnopqrstuvwxyz

된다

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

를 Where .의 가시성에 대한 공백을 대체합니다.

그런 다음 ASCII 스프링을 따라 아래로 루프 주위에서 문자열을 다시 읽은 다음 gu두 번 누르십시오 .

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

...기부:

abgjklmhfedcginopuxyz vtsrquw (후행 공백으로)

테스트 사례

(후행 공백을 강조하기 위해 따옴표가 추가됨-IO 측면에서 무시하십시오)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

출력 길이는 항상 스프링 코일 길이 인 15의 배수입니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


코일을 따라 패턴을 따르는 것이 훨씬 더 어려울 것 같습니다.
Magic Octopus Urn

@ carusocomputing 당신은 그 반대를 의미합니까?
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376 내가 작성한 도전을 이해하지 못했다는 것이 밝혀졌습니다.
Magic Octopus Urn

답변:


2

젤리 , 26 바이트

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

TryItOnline!

어떻게?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print

5

파이썬 (2), 104 (102) 98 바이트

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

댓글 도움 주셔서 감사합니다!

https://tio.run/#2VDVy

기발한:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')

당신은 input()형식으로 입력하고 사용할 수 있습니다 "<stuff>".
HyperNeutrino

위대한 첫 골프! Alex L.이 지적했듯이 입력을 따옴표로 묶을 수 있습니다. lambda프로그램 대신 익명 기능을 제공하기 위해 a 를 사용할 수도 있습니다 . 이 방법은 종종 더 짧습니다 .
xnor

IndexError를 사용하여 빈 문자열 테스트 사례에 실패합니다. 나는 당신이 13에서 14로 변경하고 최종 값을 내 놓아야한다고 생각합니다 (Jelly 답변과 매우 유사).
Jonathan Allan

... 변경 +13+14+1+(len(t)%14>0)그것을 할 것이지만, 짧은 방법이 있어야합니다.
Jonathan Allan

3

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

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

16 진 문자열은 @ETHproductions에서 뻔뻔스럽게 도난당했습니다.


@ETHproductions 감사합니다.
Neil

훌륭합니다!
dodov

코드 조각으로 입력 할 때 결과를 볼 수있는 방법이 좋습니다.
MildlyMilquetoast


2

자바 스크립트 (ES7) 144 143 141 114 104 103 바이트

10B 절약을위한 ETHProductions에게 감사합니다!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

산출

abgjklmhfedcginopuxyz vtsrquw 

아주 좋아요 배열을 16 진 문자열 +('0x'+whatever)로 변환하고이를 숫자로 변환 하여 사용하여 일부 바이트를 절약 할 수 있습니다 .(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions

영리한 트릭. 나는 이미 배열을 작성하는 다른 방법을 생각하고 있었지만 아무것도 만들 수 없었습니다. 16 진수를 먼저 넣은 다음 곱셈을하면 공간이 불필요 해 지므로 여전히 단축 할 수 있습니다.
Luke

'0x'+'...'[c%15]-0+(c/15|0)*14괄호 한 쌍을 구할 수도 있습니다 :-)
ETHproductions

네가 옳아. 추가되었습니다.
Luke

2

펄 6 , 61 바이트

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

작동 원리

기본 구조는 다음과 같습니다.

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

각 14 자 세그먼트로 색인을 작성하는 데 사용되는 표현식 "abgjklmhfedcgin".ords X- 97은 다음과 같습니다.

  1. 하드 코딩 된 문자열을 가져옵니다 abgjklmhfedcgin.
  2. 코드 포인트를 얻으십시오 : 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. 각 숫자에서 97을 빼십시오 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13.

펄 6 , 64 바이트

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

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

작동 원리

기본 구조는 다음과 같습니다.

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

위와 같은 인덱스이지만 .flat어쨌든 호출 하기 때문에 중첩 된 (그러나 1 바이트 더 짧은) 표현식을 사용할 수 있습니다 0,1,6,9..12,7,5...2,6,8,13.

(사소한 것처럼 보이지만 실제로 는 버그 인 Rakudo Perl 6의 구문 분석 특성에 의존합니다 . 버그 를 이용하지 않고 작성하려면 버그 주위에 parens를 추가해야합니다 5...2.)


2

Befunge-93, 97 바이트

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

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

이것은 다양한 구성 요소가 강조된 소스 코드의 분석입니다.

실행 경로가 강조 표시된 소스 코드

*메인 루프는 오른쪽에서 왼쪽으로 실행되어 놀이터의 오른쪽으로 감싸집니다. 여기에서 stdin에서 첫 번째 문자를 읽고 EOF 인 경우 종료합니다.
*다음 섹션에서는 수식을 사용하여 EOF 문자를 공백으로 변환합니다 c = c + 31*!(c+1). 첫 번째 반복에는 적용되지 않지만 후속 패스에서 발생할 수 있습니다.
*문자의 사본이 임시 메모리에 저장되고 4 행 ( *) 의 표에서 현재 색인 조회가 수행되어 문자의 출력 여부를 판별합니다.
*캐릭터를 출력해야 할 경우 왼쪽 분기를 사용합니다. 다음에 발생할 스왑을 취소하기 위해 스왑을 수행 한 다음 0을 눌러 분기를 오른쪽으로 강제합니다.
*캐릭터가 출력되지 않았다면 인덱스 카운터 아래의 스택으로 스왑합니다 (왼쪽 분기에서 취소되는 스왑). 두 경우 모두 현재 색인 오프셋에서 문자를 메모리에 저장하고 색인을 증가
*시킨 다음 13보다 큰지 확인합니다. 그렇지 않으면 stdin에서 다음 문자를 읽고 내부 루프를 반복합니다.
*만약 그렇다면, 우리는 14 문자 세트를 완성했을 것입니다. 7은 출력되었고 ( abgjklm) 7은 스택에 남아 있습니다 ( cdefhin). 우리는 드롭 마지막 두, 출력, 나머지 5 ( hfedc), 다음 검색하고 출력 특별한 경우 g, i그리고 n메모리에서.
*그리고 그것은 우리를 메인 루프의 시작으로 되돌려 놓습니다. 여기서 우리는 다음 14 문자에 대해 프로세스를 다시 반복합니다.


좋은 설명, 잘
했음

1

Mathematica, 77 72 바이트

5 바이트를 절약 한 JungHwan Min에게 감사합니다!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

이름이없는 함수는 문자 목록을 입력으로 사용하고 문자 목록을 반환합니다. Partition[#,14,14,{1,1}," "]입력을 길이 14의 서브리스트로 나누고 필요한 경우 공백으로 채 웁니다. LetterNumber@"abgjklmhfedcgin"는로 평가되며 {1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}, 이는 각 길이 14 하위 목록의 순서를 나타냅니다 (7 번째 요소를 적절하게 반복). 그런 다음 [[;;,...]]모든 길이 14 하위 목록의 요소를 순서대로 가져와 Join@@함께 답을 결합합니다.

이전 제출 :

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&

1
LetterNumber@"abgjklmhfedcgin"목록을 압축하는 더 짧은 방법입니다. 또한 바이트 ;;All저장하는 대신 .
JungHwan Min

좋은 제안!
Greg Martin


0

PHP, 94 바이트

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

명령 행 인수를 14 바이트 청크로 나누고 변환 문자열을 하위 문자열의 인덱스로 반복합니다. 로 실행하십시오 php -nr '<code>' <string>.

??빈 문자열 ( "유효하지 않은"인덱스의 경우)도 null로 허용 한다는 것을 알게되어 기뻤습니다 .


0

루비, 83 바이트

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

첫 번째 아이디어는 16 진수를 사용했지만 ord-48은 다른 바이트를 절약합니다 (Throx의 대답에서 도난).

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