인쇄 가능한 ASCII 문자 의 비어 있지 않은 문자열을 사용하는 프로그램 (또는 함수)을 작성하십시오 .
문자열에있는 문자의 지그재그 체인을 다음과 같이 연결된 모든 인접 문자 쌍으로 인쇄 (또는 반환)합니다.
-
/
첫 번째 문자가 정상적인 ASCII 순서로 두 번째 문자 앞에 나타나는 경우 예 :B / A
-
\
첫 번째 문자가 정상적인 ASCII 순서로 두 번째 문자 다음에 나타나는 경우 예 :B \ A
-
-
첫 번째와 두 번째 문자가 동일한 경우 예 :A-A
그래서에 대한 출력 Programming Puzzles & Code Golf
될 것이다
o
/ \
r z-z o e G l
/ \ / \ / \ / \ / \
P o r m-m n u l s & C d f
\ / \ / \ / \ / \ / \ / \ /
g a i g P e
\ /
입력 문자열에 문자가 하나만 있으면 출력은 해당 문자가됩니다.
여러분의 프로그램은 치료해야한다 ,
/
, \
, 그리고 -
다른 모든 문자로 그냥 같은.
예를 들어 -\//-- \ //-
:
\
/ \
- /-/
/ \
- --- \ /-/
\ / \ / \
-
\
단일 선택적 후행 줄 바꿈을 제외하고 출력에 불필요한 줄 바꿈이 없어야합니다. (위의 예에서 빈 줄은 문자열의 마지막 공백을 유지하므로 불필요한 것은 아닙니다.) 어떤 배열에도 어떤 줄에도 후행 공백이있을 수 있습니다.
바이트 단위의 가장 짧은 코드가 이깁니다.
하나 더 예-입력 :
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
산출:
9 9 8 6 6
/ \ / \ / \ / \ / \
9 6 8 7 3 3 4 2 4 8 9 8-8
/ \ / \ / \ / \ / \ / \ / \
4 5 2 5 5 2 3-3 3 7 5 2 4 9 9 9-9 7
/ \ / \ / \ / \ / \ / \ / \ / \ / \
3 1 1 3 2 0 1 7 6 3 3 5 8 8 6
\ / \ / \ / \ / \ / \
. 1 1 5 2 9 9 3 7 1 4 6 8 9
\ / \ / \ / \ / \ / \ / \ / \ /
0 0 7 9 5 2 0 0 2 6 9-9 8 5 4 7
\ / \ / \ / \ / \ / \ / \ /
4 4-4 2 8 8 4 2 3 2 7 6
\ / \ / \ / \ /
0 6 8 3 1-1 0
\ / \ /
2 0
답변
Pyth, 69 바이트
aY,JhzZVtzaY,@"-\/"K-<NJ>N~JN=+ZKaY,N=+ZK;jbCmX*\ h-e=GSeMYhG-edhGhdY
데모. 더 긴 입력은 여전히 작동하지만 고정 너비 출력 상자에서는 잘 보이지 않습니다.
먼저 Y
[character, height] 튜플 의 목록을 구성하는 것으로 시작합니다 . 이 예의 [['P', 0], ['/', -1], ['r', -2], ['\\', -1], ['o', 0], ['\\', 1], ['g', 2]]
초기 단계입니다 Programming Puzzles & Code Golf
.
그런 다음 적절한 길이의 공백 문자열을 만들고 적절한 위치에 문자를 삽입하고 조바꿈하고 줄 바꿈에 참여하고 인쇄합니다.
답변
줄리아, 297 바이트
s->(l=length;d=sign(diff([i for i=s]));J=join([[string(s[i],d[i]>0?:'/':d[i]<0?:'\\':'-')for i=1:l(d)],s[end]]);D=reshape([d d]',2l(d));L=l(J);E=extrema(cumsum(d));b=2sumabs(E)+1;A=fill(" ",L,b);c=b-2E[2];for (i,v)=enumerate(J) A[i,c]="$v";i<l(D)&&(c-=D[i])end;for k=1:b println(join(A'[k,:]))end)
언 골프 드 :
function f(s::String)
# Get the direction for each slash or dash
# +1 : /, -1 : \, 0 : -
d = sign(diff([i for i in s]))
# Interleave the string with the slashes as an array
t = [string(s[i], d[i] > 0 ? '/' : d[i] < 0 ? '\\' : '-') for i = 1:length(d)]
# Join the aforementioned array into a string
J = join([t, s[end]])
# Interleave D with itself to duplicate each element
D = reshape(transpose([d d]), 2*length(d))
# Get the length of the joined string
L = length(J)
# Get the maximum and minimum cumulative sum of the differences
# This determines the upper and lower bounds for the curve
E = extrema(cumsum(d))
# Get the total required vertical size for the output curve
b = 2*sumabs(E) + 1
# Get the beginning vertical position for the curve
c = b - 2*E[2]
# Construct an array of spaces with dimensions corresponding
# to the curve rotated 90 degrees clockwise
A = fill(" ", L, b)
# Fill the array with the curve from top to bottom
for (i,v) = enumerate(J)
A[i,c] = "$v"
i < length(D) && (c -= D[i])
end
# Print out the transposed matrix
for k = 1:b
println(join(transpose(A)[k,:]))
end
end
답변
자바 (ES6) 360 331 316 302 바이트
네 번째 시도는 다음과 같습니다.
s=>{r=[],c=s[m=w=n=0];for(i in s)(i?(d=s[++i])>c?++n:c>d?--n:n:n)<m&&m--,n>w&&w++,c=d;for(i=0,n=w*2;i<(w-m)*2+1;r[i++]=[...' '.repeat(l=s.length*2-1)]);for(i=0;i<l;i++)i%2?(A=s[C=(i-1)/2])<(B=s[C+1])?r[--n,n--][i]='/':A>B?r[++n,n++][i]='\\':r[n][i]='-':r[n][i]=s[i/2];return r.map(x=>x.join``).join`
`}
다른 것만 큼 짧지는 않지만 지금은 그것에 만족합니다.
오, 테스트 해보고 싶습니까? 좋습니다, 여기 있습니다 :
z=s=>{r=[],c=s[m=w=n=0];for(i in s)(i?(d=s[++i])>c?++n:c>d?--n:n:n)<m&&m--,n>w&&w++,c=d;for(i=0,n=w*2;i<(w-m)*2+1;r[i++]=[...' '.repeat(l=s.length*2-1)]);for(i=0;i<l;i++)i%2?(A=s[C=(i-1)/2])<(B=s[C+1])?r[--n,n--][i]='/':A>B?r[++n,n++][i]='\\':r[n][i]='-':r[n][i]=s[i/2];return r.map(x=>x.join``).join('<br>')};
input=document.getElementById("input");
p=document.getElementById("a");
input.addEventListener("keydown", function(){
setTimeout(function(){p.innerHTML = "<pre>"+z(input.value)+"</pre>";},10);
})
<form>Type or paste your text here: <input type="text" id="input"/></form>
<h3>Output:</h3>
<p id="a"></p>
즐기세요!
업데이트 :
업데이트 1 : 다양한 일반적인 기술로 29 바이트를 사용했습니다.
업데이트 2 : 수직 문자열 배열을 구축하고 전환하는 것과는 달리 시작부터 수평으로 문자열을 작성하여 15 바이트를 더 떨어 뜨 렸습니다. 이것은 이전과 같습니다.
업데이트 3 : 14 바이트를 더 절약했습니다.
더 많은 골프가 곧 온다!
답변
파이썬, 393 바이트
def z(n,h=[]):
for j in range(len(n)):h.append(sum(cmp(ord(n[i]),ord(n[i+1]))for i in range(j)))
h=[j-min(h)for j in h]
for y in range(max(h)*2+2):
s=""
for x in range(len(n)):
if h[x]*2==y:s+=n[x]
else:s+=" "
if x==len(n)-1:continue
c=" "
if h[x]<h[x+1]and h[x]*2==y-1:c="\\"
if h[x]>h[x+1]and h[x]*2==y+1:c="/"
if h[x]==h[x+1]and h[x]*2==y:c="-"
s+=c
print s
다음으로 실행 :
z("Zigzag")
답변
자바 스크립트 (ES6), 202
템플릿 문자열 사용 들여 쓰기 공간과 줄 바꿈은 계산되지 않은 백틱 안의 마지막 줄 바꿈을 제외하고는 계산되지 않습니다.
일반적인 참고 사항 : EcmaScript 6 호환 브라우저에서 스 니펫 실행 테스트 (특히 MSIE가 아닌 Chrome이 아닙니다. Firefox에서 테스트 한 경우 Safari 9로 이동 가능)
f=z=>
[...z].map(c=>
(d=0,x=w+c,p&&(
c<p?o[d=1,g='\\ ',r+=2]||o.push(v,v)
:c>p?(d=-1,g='/ ',r?r-=2:o=[v,v,...o]):x='-'+c,
o=o.map((o,i)=>o+(i-r?i-r+d?b:g:x),v+=b)
),p=c)
,v=w=' ',o=[z[p=r=0]],b=w+w)&&o.join`
`
Ungolfed=z=>
(
v=' ',o=[z[0]],r=0,p='',
[...z].map(c=>{
if (p) {
if (c < p) {
if (! o[r+=2])
o.push(v,v)
o = o.map((o,i)=>o+(i==r ? ' '+c : i==r-1 ? '\\ ' : ' '))
} else if (c > p) {
if (r == 0)
o = [v,v,...o]
else
r -= 2
o = o.map((o,i)=>o+(i==r ? ' '+c : i==r+1 ? '/ ' : ' '))
} else {
o = o.map((o,i)=>o+(i==r ? '-'+c : ' '))
}
v += ' '
}
p = c
}),
o.join`\n`
)
out=x=>O.innerHTML+=x+'\n'
test = [
"Programming Puzzles & Code Golf",
"-\\//-- \\ //- ",
"3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"]
test.forEach(t=>out(t+"\n"+f(t)))
<pre id=O></pre>
답변
CJam, 79 바이트
l__0=\+2ew::-:g_0\{+_}%);_$0=fm2f*_$W=)S*:E;]z{~\_)"/-\\"=2$@-E\@t@@E\@t}%(;zN*
이렇게하면 출력 열을 열별로 작성하고 마지막에 결과를 조바꿈하여 출력을 한 행씩 가져옵니다. 이것은 전반적으로 상당히 고통 스러웠습니다.
설명:
l__ Get input and create a couple of copies.
0=\+ Prepend copy of first letter, since the following code works only with
at least two letters.
2ew Make list with pairs of letters.
::- Calculate differences between pairs...
:g ... and the sign of the differences.
_0\ Prepare for calculating partial sums of signs by copying list and
pushing start value 0.
{ Loop for calculating partial sums.
+_ Add value to sum, and copy for next iteration.
}% End of loop for partial sums. We got a list of all positions now.
); Pop off extra copy of last value.
_$0= Get smallest value.
fm Subtract smallest value to get 0-based positions for letters.
2f* Multiply them by 2, since the offsets between letters are 2.
_$W= Get largest position.
) Increment by 1 to get height of result.
S* Build an empty column.
:E; Store it in variable E.
] We got the input string, list of relative offsets, and list of
absolute positions now. Wrap these 3 lists...
z ... and transpose to get triplets of [letter offset position].
{ Loop over triplets.
~ Unwrap triplet.
\ Swap offset to front.
_) Copy and increment so that offset is in range 0-2.
"/-\\" List of connection characters ordered by offset.
= Pick out connection character for offset.
2$@ Get position and copy of offset to top.
- Subtract to get position of connection character.
E Empty column.
\@ Shuffle position and character back to top. Yes, this is awkward.
t Place connection character in empty line. Done with first column.
@@ Shuffle letter and position to top.
E Empty column.
\@ Stack shuffling again to get things in the right order.
t Place letter in empty line. Done with second column.
}% End of main loop for triplets.
(; Pop off first column, which is an extra connector.
z Transpose the whole thing for output by row.
N* Join with newlines.
답변
펄 5 230 214
@A=split(//,pop);$y=$m=256;map{$c=ord$_;$d=$c<=>$p;$t=$d>0?'/':$d<0?'\\':'-';$B[$x++][$y-=$d]=$t;$B[$x++][$y-=$d]=$_;$m=$y,if$m>$y;$M=$y,if$M<$y;$p=$c}@A;for$j($m..$M){for$i(1..$x){$s.=$B[$i][$j]||$"}$s.=$/}print$s
테스트
$ perl zigzag.pl "zigge zagge hoi hoi hoi"
z
\
i
\
g-g
\
e z g-g o o o
\ / \ / \ / \ / \ / \
a e h i h i h i
\ / \ / \ /
$