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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
1118 | La TeX 라텍 작성 하실 분 구합니다. [2] | LaTex | 2024.05.04 | 298 |
1117 | 이태준 《문장강화》 조판 재현 [6] | noname | 2020.04.27 | 3969 |
1116 | daft text [1] | noname | 2024.04.29 | 188 |
1115 | [취미] 심심할 때는 괘를 뽑아보세요 [1] | noname | 2024.04.16 | 250 |
1114 | [잡담] 이과가 사랑에 빠졌기에... [6] | noname | 2024.04.09 | 271 |
1113 | [Lilypond] W. A. Mozart, Laudate Dominum [3] | noname | 2024.04.07 | 190 |
1112 | [유틸리티] latexindent [1] | noname | 2024.03.30 | 224 |
1111 | 터잡기 [5] | yihoze | 2023.02.17 | 403 |
1110 | 텍라이브 2024 pretest를 깔아보았습니다 [8] | Progress | 2024.03.13 | 436 |
1109 | 게임 테이블 그리기 3 - 3인 게임 | ischo | 2024.02.14 | 283 |
1108 | 게임 테이블 그리기 5 - 혼합전략 | ischo | 2024.02.16 | 270 |
1107 | 게임 테이블 그리기 4 - 제로섬 게임 [4] | ischo | 2024.02.14 | 337 |
1106 | 게임 테이블 그리기 2 | ischo | 2024.02.14 | 190 |
1105 | 게임 테이블 그리기 1 [8] | ischo | 2024.02.03 | 439 |
1104 | lilypond와 LaTeX [6] | cantabile | 2018.03.05 | 6859 |
1103 | 세벌식 직결 글꼴의 추억 [7] | noname | 2023.11.27 | 492 |
1102 | 공동번역 성서 조판 형태의 재현 [5] | noname | 2024.01.22 | 380 |
» | 주어진 단어로 대소문자 순열 만들기 [15] | yihoze | 2023.12.06 | 427 |
1100 | 원고지와의 인연 [21] | noname | 2023.12.07 | 841 |
1099 | minipage 병치 [5] | yihoze | 2017.07.14 | 5968 |
멋있습니다.
좀 다듬으면 훨씬 나아질 것 같습니다.
우선 for loop이 세 개나 있는데, 하나로 만들어보세요.