이 Ascii 커피 컵을 그립니다.
영형 영형 영형 __________ / \ __ | J | \ | A | | | V | | | A | __ / \ __________ /
커피 스크립트 또는 자바 브라우니 포인트 :)
바이트, 함수 또는 프로그램의 짧은 코드, 후행 줄 바꿈 또는 공백은 허용됩니다.
이 Ascii 커피 컵을 그립니다.
영형 영형 영형 __________ / \ __ | J | \ | A | | | V | | | A | __ / \ __________ /
커피 스크립트 또는 자바 브라우니 포인트 :)
바이트, 함수 또는 프로그램의 짧은 코드, 후행 줄 바꿈 또는 공백은 허용됩니다.
답변:
mγmλ⁶…Jcēņ▒&↓¡℮štΥ{ιE‽▼⅛÷εγ╝Ξ∫$■⌡πθ&χF׀▼ΡQ7L↓F¶‘
설명:
SOGL에는 내장 문자열 압축이 있으며 그 중 하나는 문자 사전 압축입니다. 더 나은 것은 사용 가능한 문자가 "/ \ | _- \ n"인 상자 문자열 압축 유형입니다. 따라서 전체 프로그램은 " '("는 암시 적)으로 묶인 문자열입니다.
내가 압축기에 준 줄은 (탈출)입니다.
" o\n o\n o\n ",
"__________",
"\n/ \\__\n| ",
"J",
" | \\\n| ",
"A",
" | |\n| ",
"V",
" | |\n| ",
"A",
" |__/\n\\",
"__________",
"/"
edc65 덕분에 4 바이트 절약
let f =
_=>`1o
6o
3o
9
/44\\__
|2J5|1\\
|3A4|1|
|4V3|1|
|5A2|__/
\\9/`.replace(/\d/g,n=>' _'[n>>3].repeat(++n))
console.log(f())
원본 ASCII 기술의 압축은 연속 2 ~ 10 개의 연속 된 공백 시퀀스와 10 개의 연속 밑줄의 2 개의 시퀀스를 단일 숫자로 대체하여 이루어집니다.
N
연속 된 공백 의 각 시퀀스 는 숫자로 인코딩됩니다 N-1
.9
.우리는 하나 이상의 숫자를 사용할 필요 N-1
가 N
없도록 오히려 사용합니다. 따라서 ++n
디코딩 할 때 필요하다 .
식 n>>3
(우측 비트 시프트)이 0과 동일 n = 1
행 n = 7
과 동일 1 n = 8
(사용하지 않음) n = 9
. 따라서에 ' _'[n>>3]
대한 밑줄 9
과 다른 모든 발견 된 값에 대한 공간을 제공합니다.
유일한 특별한 경우는 "JAVA"바로 위의 10 개의 연속 공백 시퀀스입니다. 로 인코딩 9
하면 밑줄 시퀀스와 충돌합니다. 따라서로 인코딩 된 5 개의 공백으로 구성된 두 개의 시퀀스로 분할해야합니다 44
.
f=
. 이 방법으로 4 바이트를 절약 할 수 있습니다. n>>3
대신 +!(n&7)
, 9
대신 _8
(두 번) 44
대신9
f=
... 저장된 바이트에 감사드립니다!
' '
). 그러나 그것이 정확히 어떻게되는지 확실하지 않습니다. 비트 시프트는 무엇을합니까? 왜 우리는 n을 증가 시키는가?
Dennis 덕분에 -2 바이트 (1. 중복 제거 ”
및 2. ZŒṙ
요소 반복 별 감소로 전치 및 실행 길이 디코딩을 대체 x/
합니다.)
“Ñṁ{xGgṭḷVỤɲ8ṿfƬT9Ɱ¹=qṀS“$<(ƇỤ08ØÑḌṃṘX6~cuc8HṗḞ2’Dx/ị“ ¶_/\|JAVo
“...“...’
두 개의 기본 250 압축 숫자의 목록입니다.
[1021021021332411532617161526181616261916162618163425334, 2117114111551155121131612111415121115141211161312111551]
D
10 진수로 변환하여 두 자릿수 목록을 생성합니다.
[[1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 3, 3, 2, 4, 1, 1, 5, 3, 2, 6, 1, 7, 1, 6, 1, 5, 2, 6, 1, 8, 1, 6, 1, 6, 2, 6, 1, 9, 1, 6, 1, 6, 2, 6, 1, 8, 1, 6, 3, 4, 2, 5, 3, 3, 4], [2, 1, 1, 7, 1, 1, 4, 1, 1, 1, 5, 5, 1, 1, 5, 5, 1, 2, 1, 1, 3, 1, 6, 1, 2, 1, 1, 1, 4, 1, 5, 1, 2, 1, 1, 1, 5, 1, 4, 1, 2, 1, 1, 1, 6, 1, 3, 1, 2, 1, 1, 1, 5, 5, 1]]
x/
요소 반복에 의해 하나의 자릿수 목록을 제공합니다 (첫 번째 목록의 숫자를 다른 값의 해당 값으로 반복).
[1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 0, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 3, 2, 6, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 6, 1, 1, 5, 2, 6, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 6, 1, 1, 6, 2, 6, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 6, 1, 1, 6, 2, 6, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 6, 3, 3, 4, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4]
ị
하나의 기반으로 모듈 식으로 오른쪽 목록에 색인을 생성하도록 지시합니다 (0은 가장 오른쪽 항목에 색인). 오른쪽에있는 목록 ¶_/\|JAVo
은 단순히 필로우 ¶
가 줄 바꿈과 동일한 코드 포인트 인 필수 순서 로 사용되는 문자입니다. “
프로그램의 끝이므로 닫기 파트너 는 필요하지 않습니다.
[' ', ' ', 'o', '\n', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'o', '\n', ' ', ' ', ' ', ' ', 'o', '\n', ' ', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '\n', '/', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '\\', '_', '_', '\n', '|', ' ', ' ', ' ', 'J', ' ', ' ', ' ', ' ', ' ', ' ', '|', ' ', ' ', '\\', '\n', '|', ' ', ' ', ' ', ' ', 'A', ' ', ' ', ' ', ' ', ' ', '|', ' ', ' ', '|', '\n', '|', ' ', ' ', ' ', ' ', ' ', 'V', ' ', ' ', ' ', ' ', '|', ' ', ' ', '|', '\n', '|', ' ', ' ', ' ', ' ', ' ', ' ', 'A', ' ', ' ', ' ', '|', '_', '_', '/', '\n', '\\', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '/']
Jelly는이 목록의 암시 적 인쇄를 수행합니다.이 목록에는 문자가 포함되어 있으므로 마치 문자열 인 것처럼 인쇄합니다.
o
o
o
__________
/ \__
| J | \
| A | |
| V | |
| A |__/
\__________/
”
암시 적이며, 당신은 대체 할 수 있습니다 ZŒṙ
로 x/
. 또한 바이트가 없지만 ¶
리터럴 줄 바꿈 대신을 사용하면 코드를 더 빨간색으로 실행할 수 있습니다.
r="replace";" 1o0n0 6o0n0 3o0n0 _9n0/0 9b0_1n0|0 2J0 5|0 1b0n0|0 3A 4|0 1|0n0|0 4V0 3|0 1|0n0|0 5A0 2|0_1/0n0b0_9/0"[r](/\d/g,(a,b,c)->c[b-1].repeat(a))[r](/n/g,"\n")[r](/b/g,"\\")
f=()->""" o
o
o
__________
/ \__
| J | \\
| A | |
| V | |
| A |__/
\__________/"""
하드 코딩이 없습니다.
Base-64 인코딩이 없습니다.
정규식 없음.
k=' '
q='_'*10
print'\n'.join([k*i+'o'for i in 2,7,4]+[k+q]+['/'+k*10+'\\__']+['|'+k*s+'JAVA'[s-3]+k*(9-s)+'|'+' _'[s==6]*2+'\\||/'[s-3]for s in 3,4,5,6]+['\\'+q+'/'])
'_'*10
Python의 True -> 1
and 변환을 외부화 하고 활용하여 2 바이트를 절약했습니다 False -> 0
.
불필요한 공백을 제거하여 1 바이트를 절약했습니다.
@TuukkaX 덕분에 4 바이트가 절약되었습니다!
] for
및에 2 개의 쓸모없는 공백이있는 것 같습니다 in [
.
[2,7,4]
와 [3,4,5,6]
로 2,4,7
와 3,4,5,6
.
"""2o
7o
4o
$(($a='_'*10))
/55\__
|3J6|2\
|4A5|2|
|5V4|2|
|6A3|__/
\$a/"""-replace'(\d)','$(" "*$1)'|iex
-replace
내가 알고 있는 더 짧은 방법 을 찾은 @briantist에게 감사드립니다 .
필요한 수의 공백 대신 숫자가 포함 된 문자열을 사용합니다. 그런 다음 -replace
숫자를 스크립트 표현식으로 정규식으로 변환 합니다 $(" "*$1)
. 따라서, 예를 들어, 문자열의 첫 번째 줄은 것 $(" "*2)o
두 번째는 것, $(" "*7)o
등등. 삼중 따옴표로 인해 파이프 라인에 문자열로 남습니다. 스크립트 표현식을 처리하고 결과 다중 행 문자열을 파이프 라인에 남겨 두는 iex
(약식 Invoke-Expression
및 유사)로 덤프합니다 eval
. 출력은 암시 적입니다.
($_,' '*$_)[+$_-in48..57]
-내가 무엇을 변경하더라도 그것은 실패합니다.
space
에 의해 o
및 barfs.
s:$: o@SS o@S o@ UU@/SSS \\__@|SJSS| \\@|S AS | |@|S VS | |@|SSAS|__/@\\UU/:
s:S: :g
y:@:\n:
s:U:_____:g
기본 인코딩은 3 개의 공백을 S
, \n
as @
및 5 개의 밑줄을으로 저장 U
합니다. 더 짧은 것을 찾기 위해 계속 조합을 시도 할 것입니다.
문자열을 직접 인쇄하는 간단한 솔루션은 다음과 같습니다. 136 바이트이며 위의 인코딩 체계를 사용하여 압축률은 18 %입니다.
c\ o\
o\
o\
__________\
/ \\__\
| J | \\\
| A | |\
| V | |\
| A |__/\
\\__________/
S
3 개의 공백 을 저장 하는 1 바이트 적은 솔루션을 찾았습니다 s
. 동일한 수의 변환을 유지하기 때문에 대신이 것을 편집 할 것입니다.
[TIH][IAC]111Z?c'(ty!(OWM4J4gW{lm> >bw8ch|.FU2W"@\#2Dj!NQDeIMZ'F'_ /|\JAV'Za7e
이 솔루션은 커피를 "거품"과 머그잔의 두 조각으로 나눕니다. 거품을 만들기 위해 세 위치에 111이있는 희소 행렬을 만들어 문자 배열로 변환합니다.
[TIH][IAC]111Z?c
찻잔 구성 요소의 경우 문자열 압축을 사용합니다
'(ty!(OWM4J4gW{lm> >bw8ch|.FU2W"@\#2Dj!NQDeIMZ'F'_ /|\JAV'Za7e
두 구성 요소 모두 출력에 인쇄되고 구성 요소 사이에 개행이 자동으로 배치됩니다
MATL Online 에서 사용해보십시오
Rod 덕분에 -1 바이트 ( ('_'*10,)
선언을 피하기 위해 튜플의 곱셈을 사용하십시오 ).
print''.join('0'<c<':'and' '*int(c)or c for c in'''2o
7o
4o
%s
/ 9\__
|3J6|2\\
|4A5|2|
|5V4|2|
|6A3|__/
\%s/'''%(('_'*10,)*2))
참고 : 이중 백 슬래시 는 줄 바꿈 전에 필요합니다.
'''
와 사이의 모든 것은 '''
단일 문자열이며, 두 개 %s
는 후행 %(...)
튜플 의 내용으로 대체되는 포매터이며 '_'*10
튜플 곱셈 을 통해 두 개의 사본이 포함 (...)*2
됩니다. '_'*10
수행 문자열 승산 얻었다 '__________'
.
이 코드는, 문자 통과 c
, 그 전체 문자열의 사용을 for c in '''...
과 결합하여 새로운 문자열을 생성 ( join(...)
)
중 하나 에 의해 확인 된 공간의 수는 c
, int(c)
, 경우는 c
숫자인가
또는 c
자체
숫자에 의해 식별되는 - '0'<c<':'
이상 저장할은 c.isdigit()
.
u,u
와 ('_'*10,)*2
드롭 u
선언
골프 :
()->{String s="";for(char c:"\u026F\n\u076F\n\u046F\n __________\n/\u0A5C__\n|\u034A\u067C\u025C\n|\u0441\u057C\u027C\n|\u0556\u047C\u027C\n|\u0641\u037C__/\n\\__________/".toCharArray()){for(int i=0;i<c>>8;++i)s+=' ';s+=(char)(c&255);}return s;}
kolmogorov-complexity 의 정신으로 , 이것은 출력 할 문자열을 하드 코딩하지 않습니다. 대신 여러 개의 공백이 있고 그 뒤에 인쇄 가능한 문자가 있다는 사실을 이용합니다. 문자의 상위 바이트에서 문자 앞에 오는 공백 수를 하위 바이트의 실제 ASCII 문자로 인코딩합니다.
언 골프 드 :
import java.util.function.*;
public class DrinkYourMorningCoffee {
public static void main(String[] args) {
System.out.println(f(
() -> {
String s = "";
for (char c : "\u026F\n\u076F\n\u046F\n __________\n/\u0A5C__\n|\u034A\u067C\u025C\n|\u0441\u057C\u027C\n|\u0556\u047C\u027C\n|\u0641\u037C__/\n\\__________/".toCharArray()) {
for (int i = 0; i < c >> 8; ++i) {
s += ' ';
}
s += (char) (c & 255);
}
return s;
}
));
}
private static String f(Supplier<String> s) {
return s.get();
}
}
\u0641
.
F
. 거기에 모두 들어갈 수 있어야합니다.
0x
접두사를 잃어 버렸 습니다.
<v"XaXXXNYXNY77777'XXXXX2_TXQXX0XZTXDXX0X^TXXRX0X^TXXDX07]27777#"p29+55
:<_@#:,g2/+55,g2%+55
\JV/|_Ao
문자열의 문자는 먼저 가능한 10 가지 값의 룩업 테이블에 인덱스로 인코딩됩니다. 그런 다음 인덱스는 쌍으로 그룹화되며 각 쌍은 0-99 범위의 단일 숫자 (i1 + i2 * 10)로 결합됩니다. 룩업 테이블의 순서를 신중하게 선택하면 해당 값이 항상 유효 함을 보장 할 수 있습니다 문자열 리터럴로 표현할 수있는 ASCII 문자.
이것은 코드 자체의 분석입니다.
룩업 테이블의 마지막 요소를 개행 문자 (ASCII 10)로 초기화합니다.
그런 다음 문자열 리터럴을 사용하여 인코딩 된 내용을 스택으로 푸시합니다.
마지막으로 스택의 값을 반복하여 한 번에 두 문자를 디코딩하고 출력합니다.
마지막 행은 찾아보기 테이블을 보유합니다. 9 번째 요소는 묵시적인 공간이며 10 번째 (개행)는 앞에서 설명한대로 수동으로 설정됩니다.
(format t"~3@{~vto
~} ~10@{_~}
/~11t\\__
| J~11t| \\
~2@{|~5t~a~11t| |
~}|~7tA |__/
\\~10{_~}/"2 7 4'A" V"1)
~&
s 대신 문자열에 enters를 넣는 아이디어를 사용하여 6 바이트를 절약했습니다 .
개선을위한 아이디어를 환영합니다.
print(' o\n'+7*' '+'o\n'+4*' '+'o\n'+' '+10*'_'+'\n'+'/'+10*' '+'\__\n'+'|'+3*' '+'J'+6*' '+'| \\\n'+'|'+4*' '+'A'+5*' '+'| |\n'+'|'+5*' '+'V'+4*' '+'| |\n'+'|'+6*' '+'A'+3*' '+'|__/\n'+'\\'+10*'_'+'/')
s=' '
변수를 선언 하고 사용하는 것이 좋습니다.
'o\n'
길이가 같습니다 'o'+n
.
print(*(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'),sep='\n')
또는 for x in(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'):print(x)
둘 다 197입니다. 여전히 136 하드 코드 보다 깁니다 .
r" o
7 o
4 o
10_
/10 \__
|3 J6 | \\
|4 A5 | |
|5 V4 | |
|6 A3 |__/
\\10_/"9
간단한 실행 길이 디코딩.
형식 문자열을 광범위하게 사용하는 솔루션 :
void f(){printf("%1$3c\n%1$8c\n%1$5c\n%2$11s\n/%3$13s\n|%4$4c%5$7c%6$3c\n|%7$5c%5$6c%5$3c\n|%8$6c%5$5c%5$3c\n|%7$7c%5$4c__/\n\\%2$s/\n",'o',"__________","\\__",74,'|',92,65,86);}
더 읽기 쉬운 버전은 다음과 같습니다.
void f() {
printf("%1$3c\n"
"%1$8c\n"
"%1$5c\n"
"%2$11s\n"
"/%3$13s\n"
"|%4$4c%5$7c%6$3c\n"
"|%7$5c%5$6c%5$3c\n"
"|%8$6c%5$5c%5$3c\n"
"|%7$7c%5$4c__/\n"
"\\%2$s/\n"
'o',"__________","\\__",'J','|','\','A','V');
}
void g(){puts(" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\__________/\n");}
이 솔루션은 이 스크립트를 사용하여 자동으로 생성되었습니다 .
0 0o¶ 1¶/32\__¶4 J24\¶|3A 34|¶| 3V34|¶|2A |__/¶\1/
4
|
3
2
1
__________
0
o¶
(많은 줄에 후행 공백이 있습니다)
이것은 대상 문자열에서 반복되는 일부 문자 시퀀스 대신 숫자 1,2,3,4를 사용한 다음 다시 대체하여 작동합니다.
나는이 코드를 조정하거나 완전히 변화하는 접근 방식으로 더 골프를 칠 수 있다는 것을 알고 있지만 kolmogorov 메타 골프 도전은 실망스러운 결과를 얻었으므로 스크립트를 실제 도전에 사용하려고했습니다.
허프만 인코딩에 대한 나의 시도는 다음과 같습니다. 누군가가 아이디어를 받아들이고 싶다면 확실히 골프를 더 할 수 있습니다.
from bitarray import bitarray as b
a=b()
a.frombytes(bytes.fromhex('ca7fca7e53b6db6db664ffc6d9ae1fd6335e2fad1af83d68d7e2e9b218db6db6db20'))
print(''.join(a.decode({k:b(v)for k,v in zip(" _|\no/\\AJV","1 011 010 0011 00101 00100 00011 00010 00001 00000".split())})))
리터럴은 base64 또는 기타로 변환하여 더 압축 할 수 있으며 허프만 트리는 더 짧은 비트 배열을 생성하도록 최적화 할 수 있습니다.
f(){printf(" o\n%7co\n o\n __________\n/%11c__\n| J%6c| \\\n| A | |\n|%6c | |\n|%7c |__/\n\\__________/",0,92,0,86,65);}
main(){f();}
w(){puts(" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\\__________/");}
for(;$c="1o
6o
3o
9
/44\\__
|2J5|1\\
|3A4|1|
|4V3|1|
|5A2|__/
\\9/"[$i++];)echo$c>0?str_repeat(" _"[$c>8],$c+1):$c;
이것은 Arnauld의 답변 과 매우 비슷하며 거의 동일합니다. 로 실행하십시오 -r
.
printf "^_<8b>^H^@^@^@^@^@^B^CSPÈçR^@^A^P^CJÆÃ^A<97>¾^B^\Ä^@¹5@Ú^KÂ^E2cÀ|^EG^X¿^FÂW^HCæÃTÔÄÇësÅÀ^L^Fq^@<92>}ý^?{^@^@^@"|zcat
설명 : 해당 문자열은 gzip 압축 Java 컵 ASCII 아트입니다. 내가 사용 printf
에 있기 때문에 echo
, zcat
경고를 출력하고, echo -e
하나 개의 문자 이상이다. 그것은 작동하지 않습니다 bash
또는 sh
그들이 그것을 바이너리 파일이라고 생각하기 때문에. 효과적으로 브라우저에서 그 결과를 붙여 할 수 없기 때문에, 여기에 '사용 가능한 파일을이야.
()->{String s="";BigInteger b=new BigInteger("43ljxwxunmd9l9jcb3w0rylqzbs62sy1zk7gak5836c2lv5t36ej6682n2pyucm7gkm9bkfbn4ttn0gltbscvbttifvtdfetxorj6mmy3mt6r3",36);while(!b.equals(BigInteger.ZERO)){int x=b.intValue()&0x3ff;for(int i=0;i<x>>7;i++)s+=' ';s+=(char)(x&0x7f);b=b.shiftRight(10);}return s;}
언 골프 드 :
() -> {
String s = "";
BigInteger b = new BigInteger(
"43ljxwxunmd9l9jcb3w0rylqzbs62sy1zk7gak5836c2lv5t36ej6682n2pyucm7gkm9bkfbn4ttn0gltbscvbttifvtdfetxorj6mmy3mt6r3",
36);
while (!b.equals(BigInteger.ZERO)) {
int x = b.intValue() & 0x3ff;
for (int i = 0; i < x >> 7; i++) s+=' ';
s += (char)(x&0x7f);
b = b.shiftRight(10);
}
return s;
}
JShell에서의 사용법 :
Supplier<String> golf = <lambda expression>
System.out.println(golf.get())
각 문자를 상위 3 비트의 문자 앞의 공백 수로 구성되고 하위 7 비트의 코드 포인트가 뒤에 오는 10 비트로 각 문자를 인코딩합니다.
(카운트에는 3 비트 만 있기 때문에 7 개의 연속 된 공백을 나타낼 수 없으며 문자열의 한 지점에 10 개의 공백이 있습니다. 이들은 6의 카운트로, 그 다음에 공백, 그 다음에 a로 인코딩됩니다. 세 문자 다음에 다음 문자가 표시됩니다.)
안타깝게도 다음과 같은 간단한 140 바이트 Java 솔루션을 잃게됩니다.
()->" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\\__________/"
•1d'uì[_ÍpH»Ð]jŠ$ÿ{ɘß|ªpå±W¾Ö:ÞjÇ&@è$´Öàˆå]Á¢šBg¦ï&-ã¥ønØ7Ñà'?•9B8ÝJ"o _/\|JAV"‡15ô»