KTUG마당은 KTUG를 방문하는 모든 이용자가 대화를 나누고 소식을 전하는 곳입니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- Team Blog의 글을 이곳 게시판의 "정보글"로 모았습니다. Team blog는 기고자가 올린 글에 질문을 받는 부담을 줄이기 위하여 댓글을 허용하지 않았습니다. 그러나 이곳 게시판으로 모으면서 댓글을 달 수 있습니다. 게시물을 작성하실 때 댓글을 원하지 않으시면 댓글을 허용하시지 않으시기를 바랍니다. 또한 불필요한 소모성 댓글을 달지 않도록 주의하여 주시기를 바랍니다.
- TeX과 관련된 질문이나 답변은 QnA 마당을 이용하십시오. TeX과 관련된 질문은 지웁니다
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
- 사용하는 편집기는 CKeditor입니다. 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한줄을 비웁니다. 글줄만 바꾸려면 shift-enter 를 누르시면 <BR>가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
자유글 주어진 단어로 대소문자 순열 만들기
2023.12.06 16:21
case라는 단어가 주어졌을 때, 각 글자의 대소문자를 조합하면
case, casE, caSe, caSE, ... CASE가 됩니다.
정말 쓸데없는 짓이지만, 그런 순열을 만드는 함수를 만들어봤습니다. 대소문자는 2진수와 다를 바 없다는 점에 착안하여 이렇게 구상했습니다.
주어진 단어의 글자 수만큼, 위의 "case"를 예로 들자면, 0000, 0001, 0010, ... 1111 문자열을 만들어 테이블에 담습니다. 그리고 한 글자씩 주어진 단어와 대조하며 0이면 소문자로, 1이면 대문자로 치환합니다. 나름 영특하지 않습니까? ^^
댓글 15
-
작나
2023.12.06 17:02
-
yihoze
2023.12.06 17:29
말씀대로 고치니 table도 필요없군요.
function permuteCases(word)
local word = string.lower(word)
local padding = "%0" .. #word .. "d"
tex.print("\\begin{ttfamily}")
for decimal=0, 2^(#word)-1 do
local binary = ""
while decimal > 0 do
local remainder = decimal % 2
binary = tostring(remainder) .. binary
decimal = math.floor(decimal / 2)
end
binary = string.format(padding, binary == "" and "0" or binary)
local perm = ""
for j=1, #word do
if string.sub(binary, j, j) == "0" then
perm = perm .. string.sub(word, j, j)
else
perm = perm .. string.upper(string.sub(word, j, j))
end
end
tex.print(perm .. "\\quad")
if (decimal+1) % #word == 0 then
tex.print("\\newline")
end
end
tex.print("\\end{ttfamily}")
end -
작나
2023.12.06 17:48
.. 와 같은 string concat이나 string.sub는 비용이 많이 드는 연산입니다.
특히나 .. 는 할때마다 새로운 문자열이 생겨서 메모리 낭비도 있어요.
위 두 연산을 배열(루아에서는 테이블)을 이용해서 바꿔보는 것도 좋을 것 같습니다.
-
yihoze
2023.12.07 08:10
단어를 쪼개어 테이블에 넣으려면 어차피 string.sub를 써야 하잖아요? 이진수를 구하여 문자열로 만든 다음에 테이블에 넣을 때에도 string.sub를 써야 할 수밖에 없을 것 같고요. 그러니 string.sub의 사용은 불가피해 보입니다. 모범 해법을 보여주세요.
-
작나
2023.12.07 08:38
단어를 글자 단위로 쪼개어 테이블에 넣고 시작하면 string.sub를 쓰지 않고 테이블 인덱스로 처리할 수 있을 것 같습니다.
예를들어 "graph" 라는 단어를 쪼개어 {'g', 'r', 'a', 'p', 'h'} 라는 테이블을 만들고 시작합니다.
모범 해답까지는 아니고, 한 번 만들어 봤습니다. (첨부파일)
바이너리 리스팅 방식을 그레이 코드를 사용하는 것으로 변경해 보았는데요. 몰라도 됩니다.
이런 종류의 재미있는 문제는 루아 프로그래밍 언어에는 공부가 되지만, 루아텍 자체에는 그다지... ㅎㅎㅎ;
아무튼 "웰컴투 루아텍 월드!" 입니다.
-
Progress
2023.12.06 19:07
오... 눈팅만 하는데 재밌습니다.
-
작나
2023.12.07 00:26
예시 단어가 freedom 이었으니 망정이지, i18n 즉 internationalization 과 같이 긴 단어였으면 큰일날뻔 했습니다.
-
Progress
2023.12.07 09:37
왼쪽은 hoze님 코드(댓글에 있는 코드), 오른쪽은 작나님 코드입니다.
잘 몰라서 여쭙는데요.
프린트할 때 소문자 fabulousness로부터 출발하여 모두 대문자인 FABULOUSNESS로 끝나야 하는 거 아닌가여? -
작나
2023.12.07 09:45
네, 잘 발견하셨습니다.
이진수를 나열하는 방법에 여러가지가 있는데, hoze님이 나열한 방법은 우리에게 익숙한 숫자가 증가하는 방식이고,
제가 한 방식은 그레이 코드를 이용한 방식입니다. (진짜로 아실 필요없습니다.)
그레이코드 방식의 특징은 이웃하는 단어들 끼리는 정확히 한 글자만 다릅니다.
-
Progress
2023.12.07 09:47
그리고 가만보니 단어가 두 번씩 찍히는 것 같습니다.
-
작나
2023.12.07 09:59
역시 매의 눈을 가지셨습니다.
거의 3년만에 루아 코드를 사용하다보니, 책을 찾아가며 만들어보았는데, 실수가 있었습니다.
고쳤습니다. 감사합니다.
-
yihoze
2023.12.07 09:53
오~ coroutine도 등장하고 (실은 coroutine이 정확히 뭔지 알지 못합니다) ...
그레이 코드라는 거 ... 오묘한 것 같습니다. 그닥 깊이 알고 싶지는 않습니다만 ^^
-
작나
2023.12.07 10:07
루아로 무언가를 나열하는데 코루틴을 안쓴다?
그건 루아에 대한 배신이자 의리를 저버리는 짓입니다. ㅎ;
-
Progress
2023.12.07 10:19
"그레이코드 방식의 특징은 이웃하는 단어들 끼리는 정확히 한 글자만 다릅니다."
예전에도 작나님께서 Knuth 교수와 관련된 이런 거 하나 소개해주셨던 것 같은데 기억이 안 납니다.
글자수가 같은 첫단어와 마지막 단어가 제시되면 중간에 철자 하나씩 바꿔가면서 도달하는 그런 알고리즘(?)이었던 것 같은데...
예를 들어 kind가 nice로 바뀌려면kind > mind > mine > mice > nice
-
likesam
2023.12.07 15:21
저같은 공장형 공돌이에게는 뭔가 외계어처럼 보입니다.
그나저나 nested for loop와 goto는 로망일까요? T.T
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
864 |
공동번역 성서 조판 형태의 재현
[5] ![]() | noname | 2024.01.22 | 305 |
» |
주어진 단어로 대소문자 순열 만들기
[15] ![]() | yihoze | 2023.12.06 | 358 |
862 |
원고지와의 인연
[21] ![]() | noname | 2023.12.07 | 742 |
861 |
minipage 병치
[5] ![]() | yihoze | 2017.07.14 | 5913 |
860 | 올해 학술대회는 혹시 언제일까요 [2] | 크사인 | 2024.01.09 | 200 |
859 |
yihoze님의 지워진 글에 대한 코멘트
[5] ![]() | noname | 2023.12.05 | 216 |
858 |
잊을 만하면 다시 돌아오는 로또
[4] ![]() | yihoze | 2023.12.05 | 182 |
857 |
표 그리기: Tabular 환경의 표를 tabularray로 그려보자
[2] ![]() | noname | 2023.11.30 | 203 |
856 |
latex4wp의 표 그리기
[4] ![]() | noname | 2023.11.26 | 213 |
855 | Codehigh 패키지 [7] | Zeta | 2023.11.23 | 161 |
854 | 워드 프로세서 사용자를 위한 레이텍 1.2 [20] | noname | 2023.11.05 | 433 |
853 |
색인에서 연속하는 페이지 번호
[3] ![]() | yihoze | 2023.11.16 | 132 |
852 |
[소소한 팁 03] 특정 명령이 정의된 패키지 찾기
[4] ![]() | noname | 2023.11.09 | 212 |
851 |
양력 음력 변환
[9] ![]() | noname | 2020.11.23 | 3459 |
850 |
영어로 작성된 텍 파일의 철자 검사하기
[2] ![]() | yihoze | 2023.11.03 | 183 |
849 |
[유물] 1995년의 TeX: HTEX
[6] ![]() | noname | 2022.04.17 | 909 |
848 | [역사] ko.TeX 이전의 한글 LaTeX [5] | noname | 2023.10.10 | 409 |
847 | TeX 매크로 관련 문서 [4] | 크사인 | 2023.09.28 | 326 |
846 | 한국 텍 사용자 수 [10] | 크사인 | 2023.09.14 | 433 |
845 |
PDF 파일을 열지 않고 페이지 수 알아내기
[15] ![]() | yihoze | 2020.09.22 | 15880 |
멋있습니다.
좀 다듬으면 훨씬 나아질 것 같습니다.
우선 for loop이 세 개나 있는데, 하나로 만들어보세요.