빈칸 채우기 구성


18

문자열에 특정 함수 집합이 있다고 가정 해 봅시다. 이러한 함수는 공백이나 madlib를 채우는 것과 비슷합니다. 단 하나의 입력 만 사용하고 모든 공백을 채우는 데 사용합니다. 예를 들어 다음과 같은 함수가있을 수 있습니다.

I went to the ____ store and bought ____ today.

이 함수를 문자열에 적용 cheese하면 결과는 다음과 같습니다.

I went to the cheese store and bought cheese today.

이러한 함수는 비어 있지 않은 문자열 목록으로 나타낼 수 있습니다. 여기서 공백은 단순히 문자열 사이의 간격입니다. 예를 들어 위의 함수는 다음과 같습니다.

["I went to the ", " store and bought ", " today."]

이 표현에는 이러한 종류의 모든 기능에 대해 하나의 표현 만 있고 각 표현에 대해 하나의 기능 만 있습니다.

정말 깔끔한 것은 그러한 기능 세트가 구성으로 닫혀 있다는 것입니다. 다시 말해, 우리 기능 중 두 가지의 구성은 항상 이러한 기능 중 하나입니다. 예를 들어 위에서 함수를 작성하면

["blue ", ""]

( blue입력 앞에 붙는 함수 ) 함수는 다음과 같습니다.

["I went to the blue ", " store and bought blue ", " today."]

이것들은 조금 더 복잡해질 수 있습니다. 예를 들어 첫 번째 함수를

["big ", " and ", ""]

결과는

["I went to the big ", " and ", " store and bought big ", "and", " today."]

직무

비어 있지 않은 문자열 목록으로 설명 된대로 두 가지 기능을 수행하고 그 구성을 비어 있지 않은 문자열 목록으로 출력해야합니다.

이 문제를 해결하기 위해 목록은 중복을 허용하는 순서가 지정된 컨테이너 일 수 있으며 문자열은 기본 문자열 유형, 문자 목록 또는 정수 목록 일 수 있습니다.

이것은 응답이 적은 바이트로 더 나은 바이트 단위로 점수가 매겨지는 것입니다.

테스트 사례

["","xy"] ["ab",""] -> ["ab","xy"]
["x","y","z"] ["a","b"] -> ["xa","bya","bz"]
["xy"] ["ab"] -> ["xy"]
["","",""] ["a",""] -> ["a","a",""]
["x",""] ["","",""] -> ["x","",""]
["x","y","z"] ["a","b","c"] -> ["xa","b","cya","b","cz"]
["x","x","x"] ["a"] -> ["xaxax"]
["w","x","y","z"] ["ab","cd","e"] -> ["wab","cd","exab","cd","eyab","cd","ez"]

1
인쇄 할 수없는 ASCII 문자가 입력에 사용 된 경우 (대답에 따라 SOH, TAB 또는 LF) 3 개의 기존 답변이 현재 모두 실패합니다. 따라서 입력이 인쇄 가능한 ASCII로 제한되는지 여부를 실제로 결정해야한다고 생각합니다.
Arnauld

@Arnauld Ok 지금은 제한이 없으며 변경해야 할 이유를 보지 못했습니다.
밀 마법사

2
@KevinCruijssen 광산은 0이 아니므로 유효합니다. 운이 좋은 언어 기능.
Jonathan Allan

1
@ SriotchilismO'Zaic My 05AB1E이 (가) 개행으로 가입 / 분류되었습니다. JavaScript 및 Haskell 답변은 탭으로 결합 / 분할되고 인쇄 할 수없는 문자``(SOH)로 C # 답변이므로 모두 유효하지 않습니다. 그래도 Perl 5를 충분히 알지 못합니다. 하나가 유효 할 수 있습니다.
Kevin Cruijssen

3
@Roman 입력에 문자가 나타나지 않는다고 가정하여 구분자로 사용할 수는 없습니다. 실제로 문제를 해결해야합니다.
밀 마법사

답변:


11

젤리 , 6 바이트

j0j@ṣ0

오른쪽첫 번째 함수 표현 과 왼쪽두 번째 함수 표현을 받아 들여 결과 함수 표현을 생성하는 2 진 링크 . 각 함수 표현은 문자 목록의 목록입니다 (Jelly에는 다른 문자열이 없습니다).

온라인으로 사용해보십시오! (전체 프로그램 인수는 Python 표기법으로 제공되며 문자열은 목록이됩니다. 바닥 글은 링크의 출력을 Python으로 표시합니다.)

다음은 입력과 같이 링크의 출력을 다시 포맷 하는 테스트 스위트 입니다.

어떻게?

Jelly의 혼합 유형 목록을 활용하여 정수 0을 자리 표시 자로 사용하여 전체 표현 도메인 (문자 목록)을 사용할 수 있습니다.

j0j@ṣ0 - Link: b, a        e.g.    b = [['a','b'],['c','d'],['e']]
       -                   ...and  a = [['w'],['x'],['y'],['z']]
                             (i.e. test-case ["w","x","y","z"] ["ab","cd","e"])
j0     - join b with zeros         ['a','b',0,'c','d',0,'e']    
  j@   - join a with that          ['w','a','b',0,'c','d',0,'e','x','a','b',0,'c','d',0,'e','y','a','b',0,'c','d',0,'e','z']
    ṣ0 - split at zeros            [['w','a','b'],['c','d'],['e','x','a','b'],['c','d'],['e','y','a','b'],['c','d'],['e','z']
                             (i.e.: ["wab","cd","exab","cd","eyab","cd","ez"])

Jelly의 혼합 목록 (깊이 또는 모양이 포함 된 목록 포함)을 처리해야하는 경우이 8 분의 1을 사용할 수 있습니다 j,©⁹jœṣ®.



5

Python 3.8 (시험판) ,  60  58 바이트

lambda a,b:(v:='&'.join(a+b)+'$').join(b).join(a).split(v)

이름없는 문자열의 두 목록을 받아들이는 기능, a그리고 b문자열의 목록을 반환합니다.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

먼저 구분자 문자열을 형성합니다.이 문자열 va또는 안에 없습니다 b. 그런 다음 문자열 b을의 사본과 결합하여 문자열을 형성합니다 v. 그런 다음 문자열 a을 해당 복사본과 결합하여 문자열을 형성 합니다. 마지막으로 해당 문자열을 인스턴스로 분할하여 문자열 v목록을 제공합니다.

보장하는 v것이 아니 a거나 b우리는 또한 v모든 줄 이 동일 a하고 b동일한 경우에 우리가 일찍 분열하지 않도록해야합니다 . 이를 위해 v두 목록의 모든 문자열을 문자열 인스턴스 (여기 '&')와 결합하고 다른 문자 (여기 '$')를 추가하여 구성 합니다. 입력의 모든 문자열이 선택한 문자와 같을 수 있으므로 격리 중 하나를 수행하는 것만으로는 충분하지 않습니다.


&필요한 곳에 입력 예를 들어 주 시겠습니까? 사용 ''.join(a+b)+'$'이 충분하지 않습니까?
밀 마법사

시간이 걸렸지 만 ['$','$'] ['$','$']하나가 될 것입니다.
밀 마법사

예, 모든 문자열이 선택한 '$'문자와 같고 결과가 둘 이상의 문자열이 될 경우 초기 분할을 피하기 위해 다른 문자가 필요합니다.
Jonathan Allan

2

05AB1E , 4 15 19 9 11 바이트

«TýR©ý¹sý®¡

Jelly 답변과 달리 05AB1E의 string "0", integer 0및 float 0.0는 모두 (어느 정도) 동일하므로 정수로 나누거나 결합 할 수 없습니다. 이것이 우리가 해결 방법으로 +15 바이트를 가진 이유입니다. 지금 9 바이트로 골프를 쳤습니다. 2 개의 버그를 찾은 @JonathanAllan 에게 감사합니다 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

«            # Merge the two (implicit) input-lists together
 Tý          # Then using a "10" delimiter join all strings together
   R         # Reverse this string
    ©        # Store this string in variable `®` (without popping)
     ý       # Use this string as delimiter to join the second (implicit) input-list
      ¹sý    # Then join the first input-list by this entire string
         ®¡  # And split it back on variable `®` so it's the expected list of strings
             # (after which this result is output implicitly)

2
입력에 줄 바꿈이 있으면 실패합니다 (OP에서 입력이 현재 제한되지 않는다고 말했습니다).
Outgolfer Erik

@EriktheOutgolfer 다른 모든 답변에는 동일한 문제가 있습니다.
케빈 크루이 ssen

@EriktheOutgolfer 확실히 더 골프를 칠 수는 있지만 지금은 빠르고 더러운 수정을했습니다.
Kevin Cruijssen

1
입력 만 나열 (조기 분할 것이다) :( 줄 바꿈을 포함하는 문자열이 포함 된 경우 어, 죄송합니다 이것에 대해 ... 그것은 작동 실 거예요
조나단 앨런

1
@JonathanAllan Lol .. 아, 글쎄, 나는이 버그를 찾아 주셔서 감사합니다 것 같아요 .. 그것은 지금 수정되고 다른 것을 찾을 수 없기를 바랍니다 .. 당신이 느끼는 느낌이 있지만 ..
Kevin Cruijssen


2

Japt , 8 바이트

Jonathan의 접근 방식을 채택합니다 .

qVqN²)qN

시도 해봐

qVqN²)qN     :Implicit input of arrays U & V (N=[U,V])
q            :Join U with
 Vq          :  V joined with
   N²        :    Push 2 to N (modifying the original), which gets coerced to a string
             >     e.g., N=[["a","b"],["c","d"]] -> N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"
     )       :End join
      qN     :Split on the modified N, which, again, gets coerced to a string
             > e.g., N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"

무엇 N이 경우에? TryIt-link의 검색 기능을 사용하여 올바르게 이해하면 N두 번 반복 됩니다 ( ). 그런 다음이를 사용하여 두 번째 입력 V( VqN²)을 결합한 다음 해당 전체 문자열을 사용하여 첫 번째 (암시 적) 입력 U( q...)) 을 결합합니다 . 마지막으로 결과 문자열을 N( qN)로 분할합니다 . 그러나이 N경우에는 무엇입니까?
케빈 크루이 ssen

아 잠깐, p(...)검색에서 잘못된 방법을 살펴본 것 같습니다 . 그것은 2함께 짝을 이루지 않은 두 입력에 모두 추가합니다 . 의 결과 만 발생하며 [["w","x","y","z"],["ab","cd","e"],2]전체 목록을 사용하여 참여합니다. 왜 마지막은 않습니다 qN을 떠날 2경우에 결과 목록에? 아니면 원본을 수정 N합니까?
케빈 크루이 ssen

1
@KevinCruijssen은 설명을 추가했지만 거의 알아 냈습니다. 그리고 예, pushJS의 배열에 요소를 넣으면 원래 배열이 수정됩니다.
얽히고 설킨


1

J , 44 43 42 29 바이트

_<;._1@,(;@}:@,@,.(,_&,)&.>/)

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

마일 덕분에 -13 바이트!

이 방법은 정수를 사용하며 마일로 인한 것입니다.

문자열을 사용한 독창적 인 접근법

g=.[:}.@,,.
f=.(<@0<@;;._1@,];@g<"0@[)<@0<@g]

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

참고 : TIO를 -3으로 조정하여 설명했습니다. f=.

J에 적합한 Jonathan Allen의 방법을 사용합니다.

J에는 내장 된 "join"방법이 없기 때문에 놀랍게도 골프를 타기 어려웠으며, 크게 향상 될 수 있는지 궁금합니다.

g 우리에게 "가입"하는 도우미 동사입니다


입력으로 정수의 목록 작업, 내가 29 문자의 발견 솔루션을 , _<;._1@,(;@}:@,@,.(,_&,)&.>/)무한대를 사용하는 _경우 분할하는 방법을 알고 센티넬 값으로 <;._1. /하나의 큰 상자를 형성하기 위해 reduce 를 사용하여 결합을 수행 한 다음 배열을 형성합니다.
마일

인상적입니다. @ 마일 감사합니다. 이것은 확실히 개선의 여지가 있다고 생각했지만 어떻게 보지 못했습니다.
요나

@miles g&.:(a.&i.&.>)바이트 수를 세지 않아야합니까, 아니면 뭔가 빠졌습니까?
요나

영업 이익은 도우미 기능을 쉽게 볼 수 INT 배열의 상자에 단지 문자 배열의 상자에서 변환하는 것입니다 그래서 입력, 문자 또는 정수의 목록으로 목록으로 될 수 언급
마일

아, 나는 그것을 잊었다
Jonah



0

펄 5 ( -lp), 20 바이트

@JonathanAllan이 언급했듯이 이것은 IO의 경우 탭을 목록 구분 기호로 사용하고 줄 바꿈을 사용하여 두 목록을 구분하는 전체 프로그램입니다.

chop($n=<>);s/  /$n/g

TIO

탭과 줄 바꿈 그렇지 않으면 인쇄 할 수없는 문자로 변경 될 수 있습니다, 테스트 케이스를 확인하는 것이 더 편리하기 때문에 선택되었다 \1\2.

( -02l012p)

chop($n=<>);s//$n/g

TIO

작동 방식

  • -02 : 입력 레코드 구분 기호를 \2
  • -l : 기본 인수에서 입력 구분 기호를 제거합니다. $_ 하고 기본 출력에 출력 레코드 구분 기호를 추가합니다.
  • -012: 출력을 쉽게 확인할 수 있도록 출력 레코드 구분 기호를 \012( \n) 로 설정
  • -p : 기본 인수를 인쇄합니다

  • $n=<>; : 다음 레코드를 읽고 할당 $n

  • chop$n; :에서 분리기를 제거합니다. $n
  • s/\x1/$n/g: 모든 발행 수 교체 \1로를$n

2
내 Perl은 거의 존재하지 않지만 IO의 경우 탭을 목록 구분 기호로 사용하고 두 줄을 구분하는 줄 바꿈을 사용하는 전체 프로그램 이라고 생각 합니다. 이 문자로 입력을 어떻게 받아 들일 수 있습니까?
조나단 앨런

@JonathanAllan, 당신은 맞습니다, 나는 제출하려고 할 때 설명을 추가 할 시간이 없었습니다
Nahuel Fouilleul

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