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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
902 | printnthpar: 꿈을 찍는 사진관 [1] | noname | 2024.09.27 | 12 |
901 | KTUG 문고 과레스키의 첫째와 셋째 이야기 | 텍사랑 | 2024.09.26 | 29 |
900 | KTUG 문고 과레스키와 짧은 이야기 | 텍사랑 | 2024.09.25 | 49 |
899 | KTUG 문고에 투고합니다 [9] | 텍사랑 | 2024.09.21 | 175 |
898 | 수능 국어 문제 [4] | noname | 2024.09.09 | 227 |
897 | 꺾쇠란 무엇인가? [5] | noname | 2024.09.01 | 227 |
896 | TeX 용어의 한국어 표현 [5] | 애플민트초콜릿 | 2024.08.24 | 302 |
895 | 며칠 전에 올렸던 문서 [5] | noname | 2024.08.23 | 244 |
894 | kskorsym: 8.15를 맞아, 8.15를 입력하려고 [11] | noname | 2024.08.15 | 445 |
893 | buffonneedle 2024 [2] | noname | 2024.07.01 | 384 |
892 | LaTeX 안내서 + α [13] | 애플민트초콜릿 | 2024.06.25 | 757 |
891 | Knuth, "The Letter S"; Progress, "S자 이야기", and tzplot [11] | noname | 2024.06.20 | 468 |
890 | 표 그리기 실습 과제 [2] | noname | 2024.06.19 | 436 |
889 | hverse [4] | noname | 2024.06.14 | 268 |
888 | LyX 2.4에 대한 각주 | noname | 2024.06.05 | 153 |
887 | 매큔-라이샤워 표기법 키보드 밖의 부호 [2] | noname | 2024.05.31 | 171 |
886 | [KTUG 문고] 이태준, 복덕방 [3] | noname | 2024.05.21 | 228 |
885 | 예전 샘플 문서 갱신: 금강경 | noname | 2024.05.15 | 145 |
884 | 텍으로 작성된 인문사회계 논문 [1] | 판돌이 | 2024.05.05 | 245 |
883 | La TeX 라텍 작성 하실 분 구합니다. [2] | LaTex | 2024.05.04 | 270 |
멋있습니다.
좀 다듬으면 훨씬 나아질 것 같습니다.
우선 for loop이 세 개나 있는데, 하나로 만들어보세요.