단어 목록 서식


16

주어진 문자 수를 초과하지 않는 여러 줄의 단어 목록을 형식화하여 각 줄에 가능한 한 많은 단어가 포함되어 있고 불필요하게 단어가 잘리지 않도록해야합니다.

입력

입력은 공백으로 구분 된 단어 목록과 4 이상의 숫자입니다.

산출

출력은 입력 단어보다 많은 문자를 포함하는 행이 없도록 행으로 그룹화 된 입력 단어 여야합니다. 단어는 입력 된 순서대로 출력되어야합니다. 단어는 공백이 필요하지 않은 각 줄의 끝을 제외하고 쉼표와 공백으로 구분해야합니다. 단어가 너무 길어서 줄에 맞지 않으면 다른 규칙을 따르는 동안 가능한 한 조금 잘라 내고 끝에 "..."를 추가해야합니다.

테스트 사례

Input:
foo bar baz qux 12

Output:
foo, bar,
baz, qux


Input:
foo bar baz qux 5

Output:
foo,
bar,
baz,
qux


Input:
strength dexterity constitution intelligence wisdom charisma 10

Output:
strength,
dexterity,
consti...,
intell...,
wisdom,
charisma


Input:
quas wex exort 4

Output:
...,
wex,
e...


답변:


10

읽을 수 없음 , 2559 바이트

이 과제는 읽기 불가능한 사용자에게 적합합니다.

이것의 첫 번째 버전은 3379 바이트로, 내가 얼마나 골프를했는지에 대한 아이디어를 제공합니다.

프로그램은 챌린지에 설명 된대로 정확하게 입력을받습니다 : 공백으로 구분 된 단어 목록 (숫자 및 문장 부호를 포함 할 수도 있음), 공백 및 최소 4 이상의 정수 (작은 숫자는 무한 루프를 생성 함) .

' "" "" ""' "" "" "" "" ' "" "" ""' "" "" "" "" " '" "'" "" "" "" "" "" "" "" " '" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" " '" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" ""' "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" " '" ""' "" "" "" "" " '" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" " ' "" "" "" "" " '" ""' "" ' "" "" "" ""' "" "" " '" "" "" "" "" "" "" "" "" "" " " '" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "'" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" ""' "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" ""' "" "" """ "" "" "" "" "" ' "" "'" "" "" "" "" " '" "'" " '" "" "" "" ""' "" "" "" ' "" ' "" "" "'" " '" "'" " '" "" "" "" "" ""' "" "" "" "" "" "" "" "" ' "" "" " " '" "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" "" "" "" " '" "'" "" "" ""' ""' "" ' ""' "" ' ""' "" "" " '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" " '" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "' '"" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" "" ' "" "" "" "" "" "" ""' "" "" "" "" ' "" "" "" "" "" "" "" "" "" " "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ''"" "" "" "" "" ' "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" ' "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" ' "" "" "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "' ' "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" ""' "" ' "" "'" ' "" "" "" "'" " '" "'" " '" "'" "" "" " '" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '"' "" ' ""' "" "" " '" "'" " '" "'" "" "" "" "" "" ' "" "" "" "" " '" "" ""' "" ' ""' "" ' "" "" "'" " '" "'" " '" "" "" "" "" "" "" "" "" "' '"" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" ""' " '" "" "" "" "" "" ""' "" ' ""' "" "" "" "" "" "" "" "" "" '' "" "" "" "" " '" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" " "" "" "" "" "" ' "" "'" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" """ ' "'" " '" "'" " '" "'" "" "" "" " '" "'" " '" "" "" "" "" ""' "" "" "" ' "" ' "" "" "'" " '" "'" " '" "'" " '" "'" " '" "'" " '" "" ""' "" ' "" "" "" " ' "" "" "" "'" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" ' "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' ""' "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "'"" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "'" "" "" "" "" "" "" ""

설명

프로그램이 입력을 처리하는 방법을 안내합니다 thyme horseradish peppermint 10. 예상 출력은 thyme,\nhorser...,\npeppermint입니다.

먼저 셀 # 7에서 시작하여 전체 입력을 읽지 만 공백이 0이되도록 모든 문자에서 32를 뺍니다.

명백한 이유로, 이것은 실행 포인터 ( 여기서 p , 셀 # 0에 저장 됨)를 끝에 둡니다 . 우리는 마지막 루프를 찾기 위해 하나의 while 루프를 사용하는데, 이는 출력의 너비를 정의하는 숫자의 시작 부분입니다 (이 예제에서는 셀 # 36).

이제 숫자를 해독하려고합니다 (즉, 십진수에서 변환). 최종 결과는 셀 tr 모두에 있습니다 . 우리는 그들이 0에서 시작한다는 사실에 의존합니다.

숫자의 모든 숫자에 대해 다음을 수행하십시오.

  • t 를 -15로 설정하십시오 .
  • while 루프에서는 r (현재까지의 결과 포함)을 -1로 줄입니다 (정확히 r 반복이 필요 하기 때문에 while 루프의 조건으로 확인되기 전에 감소가 발생하므로 0으로 감소하면 반복 횟수가 줄어 듭니다) 각 반복에 대해 10을 t에 더하십시오 . 이제 t 는 이전 결과에서 15를 뺀 15를 포함합니다.
  • 다시 while 루프에서 * p 를 0으로 줄이고 반복 할 때마다 1을 t에 더하십시오 . 이 t 에 지금까지 올바른 중간 결과가 포함 된 후 : ASCII 코드 48–57 '0''9'갖는 문자 , 32의 초기 뺄셈 후에는 16–25이므로 실제로 15–24를 t에 더하면 −15로 취소됩니다. 우리는 그것을 이전으로 설정했습니다. 또한 후속 코드가 단어 목록의 끝을 인식 할 수 있도록 숫자 문자를 포함하는 데 사용 된 셀을 0으로 만드는 것이 중요합니다.
  • 다음 반복에서 r 에서 찾을 수 있도록 r 을 새로운 중간 결과로 설정하십시오 . ( t를 다시 읽을 필요는 없습니다. * p 는 0이 될 수 없으므로 적어도 한 번 실행되었으므로 이전 while 루프의 마지막 값만 사용할 수 있습니다.)

마지막으로, 우리 는 방금 계산 한 숫자를 단항으로 변환하기 위해 또 다른 간단한 while 루프 ( t 를 카운터로 감소 )를 사용합니다. 셀 # 0에서 왼쪽으로 1의 문자열을 저장합니다. 이 세포 # 1이 (우리의 실행 포인터는 사실에 의존 q는 ) 읽을 수있는 루프 그런 반면 있기 때문에 우리는 하나 적은 1 초를 얻을 0에서 밖으로 시작한다 :

이 후에는 r 의 값이 더 이상 필요하지 않으므로 해당 셀을 다른 용도로 재사용합니다. 포인터 pq를 재설정하고 나중에 필요한 ASCII 코드의 문자로 일부 셀을 초기화합니다. 또한 나중에 사용할 cs로 레이블을 지정 했으며 s 가 0에서 시작 한다는 사실에 의존 합니다.

잠깐만 요 셀 # 0이 빨간색으로 표시되는 이유는 무엇입니까? ... 음, 이것은 비열한 속임수를 강조하기위한 것입니다. 1을 너무 적게 출력한다는 것을 기억하십니까? 비결은 셀 # 0을이를 "확장"으로 사용하여 수정하는 것입니다. 이것은 우리가 p 가 0이 될 수 없다는 것을 알고 있기 때문에 작동 합니다. 이런 식으로, 빨간 블록의 너비는 10 셀이며 정확히 우리가 원하는 수입니다. 또한 0 대신 q 를 1 로 초기화 할 수 있도록 9자를 저장 합니다.

이제 단어를 통과하고 모두 출력하는 while 루프를 시작합니다.

1 단계 : 다음 단어가 현재 줄에 맞는지 알아 봅니다. 우리는 단순히 이동하여이 작업을 수행 할 페이지를 오른쪽에 Q 때까지 잠시 루프 왼쪽 p는 다음 간격을 명중 :

이제 p가바로 단어의, 우리는이 경우 확인하여 목록의 마지막 단어를인지 여부를 확인하실 수 있습니다 * (P + 1) 제로이다. 우리는 또한 나중에 다시 필요할 것이기 때문에 그 값 (이 예에서는“양 고추 냉이”에서 32를 뺀“h” 이므로 32 임)을 c에 저장 합니다. 이 경우 0이 아니므로 단어와 함께 쉼표를 출력해야하므로 단어가 한 글자 더 깁니다. q를 한 번 더 줄임으로써 이것을 고려하십시오 . 마지막으로, 다른 while 루프를 사용하여 p 를 단어의 시작 부분으로 다시 이동 하십시오.

q 가 0이 아닌 값을 가리 키기 때문에 단어가 현재 줄에 들어가는 것을 알았으므로 다음 과 같이하면됩니다.

  • p 를 단어 앞으로 다시 이동 하여 각 문자를 인쇄하십시오 (32 개의 모든 ASCII 코드가 32로 해제되어 있기 때문에 32를 더함).
  • c 가 0이 아닌 경우 셀 # 5의 값을 사용하여 쉼표를 인쇄하십시오.
  • s 를 0이 아닌 값으로 설정 하여 다음 반복에 더 이상 줄의 시작 부분에 있지 않으므로 다음 단어 앞에 공백 문자를 출력해야 함을 나타냅니다. (우리는이 인쇄 문의 반환 값을 다시 사용하는데, 이는 쉼표에 44입니다.)

지금까지 출력 : thyme,

그런 다음 큰 루프의 다음 반복이 시작됩니다. 이전과 마찬가지로 왼쪽에서 오른쪽으로 단어를 이동할 때 q 를 줄임으로써 다음 단어가 나머지 줄에 맞는지 확인합니다 . 하는 것으로 q는 여전히 -5 우리는 이미 현재 행에 인쇄 얼마나 많은 문자를 추적 이전 반복에서. s 가 0이 아니기 때문에“와사비”의 문자, 쉼표에 대한 문자, 1을 더한 문자를 세고 나면 공백도 출력해야 함을 나타내 므로 q 는 1의 블록 끝을 초과합니다.

이제 q 는 제로 셀을 가리 킵니다. 즉, "양 고추 냉이"는 현재 라인에 맞지 않습니다. 우리가 지금하는 것은 s 가 0이 아닌지에 달려 있습니다. 우리의 경우에는 다음 줄로 줄 바꿈해야합니다. 우리가해야 할 일은 :

  • 개행 인쇄 (셀 # 3 사용)
  • q를 다시 1로 설정
  • s 를 0으로 설정

지금까지 출력 : thyme,\n

다음 반복에서 p 는 이전과 같은 위치에 있으므로 동일한 단어를 다시 볼 것입니다. 이전과 마찬가지로 "양 고추 냉이"의 문자 수를 세고이 단어 뒤에 다른 단어가 있음을 발견하면 c 를 다시 80으로 설정 하고 쉼표의 q 를 줄인 다음 p 를 단어의 시작 부분으로 되감습니다 .

이전 반복에서와 같이 q 는 0 인 셀에서 끝나기 때문에 "양 고추 냉이"는 여전히 적합하지 않습니다 . 그러나 이번에는 s 가 0이므로 마지막 시간과 다른 작업을 수행합니다. 단어, 3 개의 점 및 쉼표 중 일부를 출력해야합니다. 너비는 10이므로 단어의 6자를 출력해야합니다. 다음과 같은 경우에 우리가 어디에서 끝나는 지 봅시다.

  • 1의 빨간 블록의 시작을 찾으십시오. 우리는 q 가 그것의 왼쪽에 있어야 한다는 것을 알기 때문에 올바르게 진행함으로써 이것을 할 수 있습니다 .
  • 쉼표를 출력해야하는 경우 q를 한 번 더 증가시킵니다 ( c ≠ 0).

테이프는 이제 다음과 같습니다.

나는 여기에 6 세포의 범위를 표시했습니다. 보시다시피 q = -1 까지 문자를 출력해야합니다 . 이것은 확인하기에 코드 효율적입니다 (기본적으로 while ((++q)+1) { ... }). 그래서:

  • q 가 -1에 도달 할 때까지 해당 문자 (32보다 더하기 때문에 모든 ASCII 코드가 32로 해제되므로)를 인쇄하십시오 . p 는“양 고추 냉이”라는 단어의 중간에있는 셀 19에있을 것입니다.
  • 세 개의 점을 인쇄하십시오. print 명령은 자체 인수를 반환하므로 코드 효율적으로 중첩 할 수 있습니다 (본질적으로 print(print(print('.')))). 셀 # 5에서 ASCII 값을 가져와 2를 더하여 점의 ASCII 코드를 얻습니다.
  • p 를 단어의 끝으로 이동 하십시오. 우리는 단어의 끝에 도달 할 수 없다는 것을 알고 있기 때문에 (단어가 너무 길어서 점에 맞추기 위해 적어도 3자를 제거해야했기 때문에)이 루프에는 적어도 하나의 반복이 있으므로 while 루프의 본문이 점의 ASCII 값을 계산 한 다음 while 루프의 반환 값을 인쇄 함수에 전달하도록하는 코드가 더 짧습니다.
  • c 가 0이 아닌 경우 쉼표를 인쇄하십시오 .

이 모든 후, 우리는 또한 셀라 인 3을 사용하여 줄 바꿈을 인쇄하고 q 를 1로 다시 설정 합니다. 또한 이미 0 인 경우에도 s 를 0으로 설정할 수 있습니다 . 다음 줄 ( s 가 0이 아닌 경우)이므로 코드 반복을 피하기 위해 s 를 검사하는 조건부 이후에 수행합니다 .

지금까지 출력 : thyme,\nhorser...,\n

하나의 반복 만 남았습니다. 이번에는 단어의 글자를 세면 다음과 같이 나타납니다.

이번에는 p 뒤에 아무것도 없기 때문에 “쉼표 없음”을 나타 내기 위해 c 를 0으로 설정했기 때문에 q 를 더 이상 줄이지 않습니다 . q는 이제 0이 아닌 셀을 가리 키 므로 단어가 적합하다는 것을 알고 있으므로 이번에는 c 가 0 이라는 점을 제외하고 첫 번째 반복과 동일한 코드가 실행 되므로 단순히 쉼표를 인쇄하지 않습니다.

산출: thyme,\nhorser...,\npeppermint

이 연습에서는 코드가 실제로 공백을 인쇄하는 경우를 포함하지 않았지만 지금은 명확해야한다고 생각합니다. 코드에서 단어가 적합하고 ( * q ≠ 0) s 가 0 이 아닌 경우 단어 앞에 공백을 출력합니다.


3

자바 스크립트 (ES6), 171

출력을 배열로 반환하는 익명 함수로

(명시 적으로 금지되지 않은 경우 일반적으로 허용되므로 : meta meta )

s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

f=s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

// Less golfed
U=s=>(
  s=s.split` `,
  n=s.pop()-1,
  t='', // current line
  o=[], // output
  s.map( (w,i)=>(
    w=w[
      n+=!s[i+1] // space for 1 more char on the last line
    ]?w.slice(0,n-3)+'...':w, // change w if it is too long
    (t+w)[n-2]&& ( // if current line + w is too long, ouput t and reset current line
      t&&o.push(t.slice(1)),t=''
    ),
    t+=` ${w},`
  )),
  o.push(t.slice(1,-1)), // remove tailing comma on last line
  o
)

console.log=x=>O.textContent+=x+'\n\n';
  
console.log(f("foo bar baz qux 12").join`\n`)
console.log(f("foo bar baz qux 5").join`\n`)
console.log(f("strength dexterity constitution intelligence wisdom charisma 10").join`\n`)
console.log(f("quas wex exort 4").join`\n`)
<pre id=O></pre>


1

파이썬 2, 206 바이트

i=input().split()
l=int(i.pop())
i=[[w[:l-4]+'...',w][len(w)<l]+','for w in i][:-1]+[[w,w[:l-3]+'...'][len(w)>l]]
r=[i.pop(0)]
for w in i:
 if len(r[-1])+len(w)<l:r[-1]+=' '+w
 else:r+=[w]
print'\n'.join(r)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.