我的世界镜像


51

这是加尔文。只需尝试获得20个代表,以便该用户可以在PPCG Minecraft服务器聊天室聊天

编写一个使用正整数的程序或函数。

如果整数是偶数(2、4、6,...),请打印或返回此确切的ASCII艺术字串:

                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     |
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   |
/        \  |  |  \|  |__   \__  |   \  /    \  |     |

如果整数是奇数(1、3、5,...),则打印或返回此确切的ASCII美工字符串:

                       __    __
\        /  |  |  /|  |     /    |   /  \ __ /  |     |
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   |
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

您可以假设输入始终是一个正整数。

在两种输出情况下,可选地,每行上可以有任意数量的尾部空格,直到“ T”的右边缘,和/或单个尾部新行。请注意每个字母之间如何有两列空格。

以字节为单位的最短代码获胜。


54
如果我是新用户,我也想删除Calvin;)
Geobits 2015年

13
@Geobits是我。
加尔文的爱好

52
@Geobits不,是我。我知道,如果我真正透露出自己的名字,谁也不会投票赞成。
Optimizer

19
为什么创建它很重要?代表不应该基于帖子的内容吗?
沼泽

19
@marsh从理论上讲,是的。实际上,人们是有缺陷的。这将是一个有趣的实验,让高级用户创建一个新帐户来发布一些挑战以衡量接收差异。
Geobits,2015年

Answers:


23

的JavaScript(ES6),343 336 289 267 265 260个字节

只是为了好玩... :)(感谢Xufox削减了46个字节,并鼓励我自己削减另外37个字节。)

n=>`887141${n%2?`
98/202/05/4|3/29 1 /2|5|
 92/92/30 / 0--2|5|--/492/3|--3|
29/29/40/2013912|1|59/4|12_|_`:`3185121_
2/92/9409205/405/94|5|
 /29/2930 9 0--2|5|--94/193|--3|
/892029013912|392/492|5|`}`.replace(/\d/g,x=>+x?x<2?'__':x<9?' '.repeat(x):'\\':'|  |')

称为a(4)或类似。在这里尝试:

我已经将空格压缩为从2到的数字字符串8(例如887= 23个空格)。然后将每个数字替换为相应的空格数。0代表| |1代表__。总而言之,该程序比两个字符串的总和(203 + 227 = 430)短170个字节,所以我很高兴。:)

编辑:不知何故,它的长度与此时唯一的其他条目完全相同。...o_o

编辑2:更改n%2<1?n%2?并交换字符串,节省了一些空间。还利用了两个字符串的开头相同以减少另外5个字节这一事实。

编辑3: |2|似乎显示了很多东西,所以简化了每次发生x,节省了7个字节。Xufox的建议又减少了40个字节。

编辑4: Xufox的建议\n用实际的换行符代替,从总数中删除了6个字节。更改x0__1(此处插入邪恶的笑),然后将所有的(这里的正则表达式插入的复数),因为他在他的词条一样,保存一个额外的16个字节。

编辑5:由于我选择使用ES6标准,因此我使用了自定义模板字符串插值法来剃除2个最终字节。


1
这个数字一定要有它!除了成为一个完美的立方体之外,这就是:-)因为我不了解JavaScript,所以无法对您的答案进行投票...
Luis Mendo

1
怎么.replace(/\d/g,d=>' '.repeat(d))
塞巴斯蒂安·西蒙

1
@ETHproductions不错!现在,你能打败我的答案吗?只剩下9个字节了…;)顺便说一句,使用gEdit计数工具,当我计算您的字节数时,它显示为289…
Sebastian Simon

1
也许使用模板字符串能够进行实际的换行,而不是\n每个换行节省一个字节?
塞巴斯蒂安·西蒙

1
现在,我的字节数比您少2个字节。= P
塞巴斯蒂安·西蒙

12

MATLAB,343 341

a=' -/\_|';
if mod(input(''),2)
x='003C00E00E000L0005N5000I000005550I0000I0055N4UVYO26R4004400400U005300UUXO060O060003C00C30CO00IO00UUUS060S5B54000';else
x='0I2000L0000L000E05H50C0000000555000C00C00H554UVYO26R4004400400U000250WUU006O006O0I2002I00O0I0O0C0UUU006S05BT0004';end
disp(a(reshape(dec2base(base2dec(reshape(x,[],7),36),6),4,[])-47))

输入数字是从stdin提供的。

样品运行:

>> a=' -/\_|';
if mod(input(''),2)
x='003C00E00E000L0005N5000I000005550I0000I0055N4UVYO26R4004400400U005300UUXO060O060003C00C30CO00IO00UUUS060S5B54000';else
x='0I2000L0000L000E05H50C0000000555000C00C00H554UVYO26R4004400400U000250WUU006O006O0I2002I00O0I0O0C0UUU006S05BT0004';end
disp(a(reshape(dec2base(base2dec(reshape(x,[],7),36),6),4,[])-47))
1
                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     | 
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   | 
/        \  |  |  \|  |__   \__  |   \  /    \  |     | 

1
那只是疯狂的笑。+1。
rayryeng-恢复莫妮卡2015年

1
@rayryeng是的:-)遗憾的是Matlab只允许基数最多为36。较大的值会节省很多字节
Luis Mendo

1
@LuisMendo正是我在制作JavaScript解决方案时的想法…
塞巴斯蒂安·西蒙

JS中的@Xufox btoa()和atob()函数分别是base64编码和解码。
2015年

11

CJam,158个 149 145 138字节

li2%"A+×rµ^ÅÆÿ»£ºoU#ü T^U^ÝZe<ÄÊKÞÒ£^ÛWWø5Úí§¹T^Úêer^^°^Ã}Ã^A0R2"281b7b"/
 -_\|"f=N/S3**_"_ ":T/TW%*4/zW%1m>N*1>"\/"_W%er"^W^]5OU"{i_32>T=t}/\4/zN*?

由于代码包含不可打印的字符,因此上面使用了插入符号。

CJam解释器中在线尝试。

如果永久链接在您的浏览器中不起作用,则可以从此粘贴中复制代码。

运行示例

$ LANG=en_US
$ xxd -ps -r > minecraft.cjam <<< 6c69322522412bd772b585c6ffbba3ba6f5523fc2054159d5a653cc4ca4bded2a39b5757f835daeda7b9549aea65721eb0837dc30130523222323831623762222f0a202d5f5c7c22663d4e2f53332a2a5f225f20223a542f5457252a342f7a5725316d3e4e2a313e225c2f225f5725657222171d354f55227b695f33323e543d747d2f5c342f7a4e2a3f
$ cjam minecraft.cjam <<< 2; echo
                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     | 
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   | 
/        \  |  |  \|  |__   \__  |   \  /    \  |     | 
$ cjam minecraft.cjam <<< 1; echo
                       __    __                        
\        /  |  |  /|  |     /    |   /  \ __ /  |     | 
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   | 
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

理念

与其直接编码MINECRAFT字符串(填充以达到恒定的行长),不如直接编码它的“压缩”版本,在该版本中已对行和列进行了转置。

压缩并删除换行符后,必须对以下字符串(称为R)进行编码:

   /  /  /   \    \   /  /   \    \    \         |||         ||| \    \    \ |||         |||_ -__ -_          |  / \_  __  _         |||_ - _ -  |\    \           /  /  /_  \_   \    \         |||_ - _ -         _   _|||_   

有很多行的空格,因此我们将用换行符替换每次出现的空格三元组。

这给我们留下了七个不同的字符(\n -/\_|),因此我们为每个字符分配一个从06的数字,并考虑以7为基数的结果数组数字,然后将其编码为字节字符串。

解码通过从上至下反转步骤进行。

可以从原始字符串构造镜像字符串。

如果我们颠倒了四行的顺序并交换了固相线,则会得到以下结果:

\        /  |  |  /|  |__   /__  |   /  \    /  |     | 
 \  /\  /   |  | / |  |--  |     |--/    \__/   |--   | 
  \/  \/    |  |/  |  |     \    |  |     \/    |     | 
                       __    __   __             __  ___

某种程度上相似,但是我们显然必须旋转行以将底部的行移到顶部:

                       __    __   __             __  ___
\        /  |  |  /|  |__   /__  |   /  \    /  |     | 
 \  /\  /   |  | / |  |--  |     |--/    \__/   |--   | 
  \/  \/    |  |/  |  |     \    |  |     \/    |     | 

如果不是那些讨厌的下划线,那就是这样。

如果我们从上至下读取原始字符串,并忽略换行符(从而获得R),并在移动行之前将每个下划线后跟一个空格替换为一个下划线,则结果如下:

                         _     _                      _ 
\        /  |  |  /|  |_    /_   |   /  \ __ /  |     | 
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   | 
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

好多了!剩下要做的就是删除第一行的第一空格(将第一行中的所有下划线向左移动一个字符),将EC中错位的下划线向上移动一排,并在T上删除下划线。

li2%           e# Read an integer from STDIN and push its parity.

"A+×rµ^ÅÆÿ»£ºoU#ü T^U^ÝZe<ÄÊKÞÒ£^ÛWWø5Úí§¹T^Úêer^^°^Ã}Ã^A0R2"

281b7b         e# Convert the byte string from base 281 to base 7.
"/\n -_\\|"f=  e# Replace each digit by its corresponding character.
N/S3**         e# Turn linefeeds into three spaces.
_              e# Copy the resulting string.
"_ ":T         e# Define T.
/TW%*          e# Replace occurrences of T with T reversed.
4/z            e# Split into chunks of length 4 and zip.
W%1m>          e# Reverse and rotate the rows.
N*             e# Join the rows, separating by linefeeds.
1>             e# Discard the first character.
"\/"_W%er      e# Swap the soliduses.
"^W^]5OU"      e# Push the string that corresponds to [23 29 53 79 85].
{              e# For each character:
  i            e#   Push its code point.
   _32>        e#   Push 1 iff the code point is larger than 32.
       T=      e#   Select the element at that index from T = "_ ".
         t     e#   Replace the element at the code point's index with that char.
}/             e#
\              e# Swap the partially generated MINECARFT string on top.
4/z            e# Split into chunks of length 4 and zip.
N*             e# Join the rows, separating by linefeeds.
?              e# Select the first string iff the input was odd.

它是如何工作的?
anatolyg 2015年

@anatolyg我已经编辑了答案。
丹尼斯

10

Pyth-182字节

使用基本编码方法。由于索引在Pyth中是模块化的,因此我什至不必为偶数做任何事情,只需按正确的顺序放置它并使用即可@Q。作为奖励,这也适用于负数。

@mjbcs@L"_| /\\-"jCd6 56,"EWbòH\x00B)þK٣ĭIOõìæ«FFãbÐÄBØ\«¼,vã<RN>­º:w÷ò¾<éifP9e|ÉWf!FÔèà""EWbòH\x00B)þOHÿ$@ËþçX'D[¾«Â?°´=&£üá ¹»ázH×Æz3äkÕg{`!|ðY!ðGV"Q

我尝试只编码第一个,然后翻转和切换斜线,但是第一行和最后一行太难了。

通过将实际的空字节放入代码中,我可以节省6个字节,但这太麻烦了。

在这里在线尝试

在线输出看起来真的很糟糕,因为输出盒太小且无法包裹。我建议摆弄dev-console并将其更改col-md-5col-md-7


这两个字符串有一堆重复的字符,您可以像这样删除11个字节。
PurkkaKoodari 2015年

8

JavaScript(ES6), 312285281272270263262,260

对于以前的编辑,请参阅编辑历史记录

编辑5:在转换中,我切换了与-(现在为0)和空格(现在为1)关联的数字。在结果块中,不再使用数字1、2和3。这使我可以使用缺少数字的数组。

编辑6:改进数组文字。我以前尝试过此方法,但是使用77777作为字符串而不是数字,直到现在我才错过了它。

编辑7: “高尔夫球代码”是问题所指定的功能,不需要f=满足此规范。因此,将其删除,节省了两个字节。


在Firefox 39中可运行:

// Testing:

f=

// Golfed code:

n=>[...`11111113ss17ss1pp11117pp3ppp
97dj3dj7822j78z213e17z3v8397gm78212
7f3kf3k1z27k7z20021200k17fppk1z001z
d7983987j2287jz2ss1lss2aabj3d7987j2aa3aza`.replace(/[123]/g,x=>[,777,'77z',77][x])].map(a=>isNaN(i=parseInt(a,36))?a:'- /\\_|'[n%2?i%6:~~(i/6)]).join``

// Testing:

;document.body.appendChild(document.createElement('pre')).innerHTML=f(0);
document.body.appendChild(document.createElement('pre')).innerHTML=f(1);
document.body.appendChild(document.createElement('pre')).innerHTML=f(2);
document.body.appendChild(document.createElement('pre')).innerHTML=f(35);

它基于基数6的数字系统,每个ASCII字符代表一个数字:

"-": 0
" ": 1
"/": 2
"\": 3
"_": 4
"|": 5

然后,我组合了每个ASCII字符串的数字表示形式。例如:当第一个ASCII字符串/在一个位置包含a ,而另一个\相同位置包含a 时,该位置变为32,以6为底(20十进制)。如果将其转换为基数36(每两个基数为6的基数得到一个基数为36的基数),则得到。k

所有这些都是事先完成的,该功能基本上可以取消此过程。

现在,这两个JavaScript答案都各自具有一个相同的字节数…。


PS:作为给自己的注释和对他人的引用,这是我使用的代码:

// 1. ASCII here
a=`|\\-/ _`;

// 2. ASCII here
b=`/|\\_ -`;

// Note: the ASCII strings’ backslashes have to be escaped!

[...a]
  .map((c,i)=>parseInt((c+b[i])
    .replace(/-/g,'0')
    .replace(/ /g,'1')
    .replace(/\//g,'2')
    .replace(/\\/g,'3')
    .replace(/_/g,'4')
    .replace(/\|/g,'5'),6))
  .map(c=>isNaN(c)
    ?`
`
    :c.toString(36))
  .join``
// Returns "wn3g7o", which is then put into the function as the block at the top.

2
天哪,为什么~NaN == -1呢?
塞巴斯蒂安·西蒙

我还考虑过逐行反转ASCII字符串,以消除更多的尾随空格(它在替换中还节省了两个字节:[…][x]+7777不再需要是字符串),但是在高尔夫球代码中进行了额外的反转并没有做到这一点……
塞巴斯蒂安·西蒙

一年前第一次阅读时,我并不理解,但是现在我看到了这项技术。:-)我每对字符组合成一个非常聪明认为你可以替换isNaN使用1+,并~~(i/6)i/6|0
ETHproductions 2016年

哈哈,我现在领先了;)
ETHproductions

@ETHproductions好吧,等等……我只是注意到您f=一开始没有,但是我知道。我还了解到可以删除它,因此我自己做,现在有260个字节。;)
塞巴斯蒂安·西蒙

6

CJam,136个字节

"^ASÓ8¥È÷^K¯¾/^HÕ2^ÄË1jÒÝ^D^Á0îl;)HR§û|^Ê^Þ^ÇÝÅ^ßNlz^TfÑ^Øj>À^à 4#bH\¿^Äî·íì^E^A~(¿ø³(ú´,^È(¡j>è?#'»vçPïju87)×"
265b8b[S9*'|3*+S2*]"/-_\| "+f=s4/56/ri=zN*

由于代码包含不可打印的字符,因此上面使用了插入符号。

换行符仅用于“可读性”。在CJam解释器中在线尝试。

如果永久链接在您的浏览器中不起作用,则可以从此粘贴中复制代码。

运行示例

$ LANG=en_US
$ xxd -ps -r > minecraft.cjam <<< 220153d338a5c8f70bafbe2f08d53284cb316ad2dd048130ee6c3b294852a7fb7c8a9e87ddc59f4e6c7a1466d1986a3ec08320342362485cbf84eeb7edec05017e28bff8b328fab42c8828a16a3ee83f2327bb76e750ef6a75383729d7223236356238625b53392a277c332a2b53322a5d222f2d5f5c7c20222b663d73342f35362f72693d7a4e2a
$ cjam minecraft.cjam <<< 2; echo
                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     | 
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   | 
/        \  |  |  \|  |__   \__  |   \  /    \  |     | 
$ cjam minecraft.cjam <<< 1; echo
                       __    __                        
\        /  |  |  /|  |     /    |   /  \ __ /  |     | 
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   | 
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

理念

这种方法与我其他答案中的方法有一些相似之处,但是它简单得多,并且(更令人失望的是)更短。

我们寻找一种编码以下字符串的方法:

                       __    __   __             __  ___                       __    __                         
  /\  /\    |  |\  |  |     /    |  |     /\    |     | \        /  |  |  /|  |     /    |   /  \ __ /  |     | 
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   |  \  /\  /   |  | / |  |--  |     |--/    \  /   |--   | 
/        \  |  |  \|  |__   \__  |   \  /    \  |     |   \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

在对每行进行填充(以实现恒定的行长),压缩(对行和列进行转置)并删除换行符之后,必须对该字符串进行编码:

   /  /  /   \    \   /  /   \    \    \         |||         ||| \    \    \ |||         |||_ -__ -_          |  / \_  __  _         |||_ - _ -  |\    \           /  /  /_  \_   \    \         |||_ - _ -         _   _|||_    \    \    \   /  /   \    \   /  /  /           |||         |||   /  /  /   |||         |||_ -__ -_          |  / \_  __  _         |||  -_  -_  /| /           \    \  _ \ _ /  /  /           |||  -_  -_           _ |||   _

我们将每个子字符串替换" |||"0,将每个子字符串" "替换为1,将字符"/-_\| "替换为27,形成一个以8个基数为单位的数组,该数组可以编码为字节字符串。

解码通过从上至下反转步骤进行。

"^ASÓ8¥È÷^K¯¾/^HÕ2^ÄË1jÒÝ^D^Á0îl;)HR§û|^Ê^Þ^ÇÝÅ^ßNlz^TfÑ^Øj>À^à 4#bH\¿^Äî·íì^E^A~(¿ø³(ú´,^È(¡j>è?#'»vçPïju87)×"

265b8b        e# Convert from base 265 to base 8.
[S9*'|3*+S2*] e# Push ["         |||" "  "].
"/-_\| "+     e# Concatenate to push ["         |||" "  " '/' '-' '_' '\' '|' ' '].
f=            e# Select the elements that correspond to the base 8 digits.
s4/           e# Flatten and chop into chunks of length 4 (columns).
56/           e# Chop into two subarrays of 56 columns.
ri            e# Read an integer from STDIN.
=             e# Select the corresponding subarray.
              e# Arrays wrap around, so [A B]0= eq. [A B]2= and [A B]1= eq. [A B]3=.
zN*           e# Zip and join the rows, separating by linefeeds.


4

球拍, 443 434 386字节

(require file/gunzip net/base64)(define(f n)(define o(open-output-bytes))(gunzip-through-ports(open-input-bytes(base64-decode #"H4sIAK8Lt1UAA22Q3Q3AIAiE352CBcwtRHLpHg7f8lubahRUDuVD5DjItrH9REgOEWgskfVMDeca1GWcSmN2WFBtlUTdzdmSOT0BpEpGnjxUAf2RmvPq1OyKGF6N5V1nvgYcWjeod/Hj8JotBRtH0qM48OeoWrBxJH23KL/dOMh4IDXe8MUbT1AqtKkBAAA="))o)(list-ref(string-split(get-output-string o)"a")(modulo n 2)))

只是为了踢。

(require file/gunzip net/base64)
(define (f n)
  (define o (open-output-bytes))
  (gunzip-through-ports
   (open-input-bytes
    (base64-decode #"H4sIAK8Lt1UAA22Q3Q3AIAiE352CBcwtRHLpHg7f8lubahRUDuVD5DjItrH9REgOEWgskfVMDeca1GWcSmN2WFBtlUTdzdmSOT0BpEpGnjxUAf2RmvPq1OyKGF6N5V1nvgYcWjeod/Hj8JotBRtH0qM48OeoWrBxJH23KL/dOMh4IDXe8MUbT1AqtKkBAAA="))
   o)
  (list-ref (string-split (get-output-string o) "a") (modulo n 2)))

注意,您可能需要#lang racket在DrRacket中运行该行。


1
恰好100个字节。
user253751

1
来吧!我知道您也可以将其设置为343
Optimizer

除非我放弃这种方法,否则我不会看到这种情况。
温妮

您不需要使用基数64个字符。您可以只使用gunzip发送的原始unicode字符
MilkyWay90 '18

4

05AB1E179个 177 176 字节

"
 -/\_|"•ÿ%Ò´Åçδ’Üå·Äm…½µƵδø5)ǝ®∊∊Ý®þCĀ₆áÝoþ²ši¤Æ%ßû¤%¦Ï≠θĀ5¾₃ʒŸQ>Šn°η8±8d¸6':…é’b…÷‡ö©«&‡huѦ%λÁZÊJÌ₅ú∞°»ó₄ι«ÓW´×ƒ×ùqiò2D1āwθóÆ˲’
Tι#и∊²ý‚KʒFæΩZºÿÏ";ηiʒæøвøïž‚è°ć½∊•7вèJ2äIè

在线尝试。

说明:

•ÿ%Ò´Åçδ’Üå·Äm…½µƵδø5)ǝ®∊∊Ý®þCĀ₆áÝoþ²ši¤Æ%ßû¤%¦Ï≠θĀ5¾₃ʒŸQ>Šn°η8±8d¸6':…é’b…÷‡ö©«&‡huѦ%λÁZÊJÌ₅ú∞°»ó₄ι«ÓW´×ƒ×ùqiò2D1āwθóÆ˲’
Tι#и∊²ý‚KʒFæΩZºÿÏ";ηiʒæøвøïž‚è°ć½∊•

压缩数字

669530978249988431396781816197276307266403407188962925862194299697873953319419752813246251351417090709766331736351616127424760949905163941809417778114834562736028512279028673309866195447599979612590918985644583407413903825059942009898007791080822453262749380245316127735585410697701790387188175543639634091138422651942833048832372950797322005040161476426127678479662921265139425

在线尝试。

将其转换为以Base-7为列表,因此我们得到了数字列表:

[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,1,1,1,1,5,5,1,1,1,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,1,1,5,5,5,0,1,1,3,4,1,1,3,4,1,1,1,1,6,1,1,6,4,1,1,6,1,1,6,1,1,1,1,1,3,1,1,1,1,6,1,1,6,1,1,1,1,1,3,4,1,1,1,1,6,1,1,1,1,1,6,0,1,3,1,1,4,3,1,1,4,1,1,1,6,1,1,6,1,4,1,6,1,1,6,2,2,1,1,6,1,1,1,1,1,6,2,2,4,1,1,1,1,3,5,5,4,1,1,1,6,2,2,1,1,1,6,0,3,1,1,1,1,1,1,1,1,4,1,1,6,1,1,6,1,1,4,6,1,1,6,5,5,1,1,1,4,5,5,1,1,6,1,1,1,4,1,1,3,1,1,1,1,4,1,1,6,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,1,1,1,1,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,4,1,1,1,1,1,1,1,1,3,1,1,6,1,1,6,1,1,3,6,1,1,6,1,1,1,1,1,3,1,1,1,1,6,1,1,1,3,1,1,4,1,5,5,1,3,1,1,6,1,1,1,1,1,6,0,1,4,1,1,3,4,1,1,3,1,1,1,6,1,1,6,1,3,1,6,1,1,6,2,2,1,1,6,1,1,1,1,1,6,2,2,3,1,1,1,1,4,1,1,3,1,1,1,6,2,2,1,1,1,6,0,1,1,4,3,1,1,4,3,1,1,1,1,6,1,1,6,3,1,1,6,1,1,6,5,5,1,1,1,4,5,5,1,1,6,5,5,6,1,1,1,1,1,4,3,1,1,1,1,6,5,5,1,1,5,6,5]

在线尝试。

è索引字符串中的每个数字"\n-/\_|"J然后将整个列表连接在一起,这为我们提供了以下内容:

                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     |
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   |
/        \  |  |  \|  |__   \__  |   \  /    \  |     |                       __    __                        
\        /  |  |  /|  |     /    |   /  \ __ /  |     |
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   |
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

在线尝试。

将字符串分成两部分。
接受输入,并对其进行索引(自动环绕)以获得两个部分之一,然后将其隐式输出。

非常感谢@MagicOctopusUrn的ASCII压缩器,该压缩器用于生成压缩数字和Base-7音译。在线尝试。(此后,通过颠倒堆栈中的字符串和数字,用в代替B使其成为数字列表,并用索引到字符串中,从而对音译进行打高尔夫球è


3

C,251字节

k(w){char*f="_-/\\|]^^^\0<&*&)&3&(&&WX&J&*&\0t_&/&3&\0`);35)I5M\0a).@7).8-;./.-\0j()(0(1+4()(*+4+4()(04+",*o=f+4,m[229]="",i=7,c=10,p;for(memset(m,32,228);i;c=*f++^(w%2&i--/2==2)*115)for(p=0;*++o;m[(w%2?4-i/6-p/57:p/57)*57+p%57]=c)p+=*o-37;printf(m);}

该函数k接收参数并将消息打印到stdout

更具可读性的版本:

k(w)
{
    char*f="\n_-/\\|", // characters to fill in
        *o= " "// for each character, the list of positions to put it in, difference-encoded
        "]%%^^^\0"                  // for '\n' (newline)
        "<&*&)&3&(&&WX&J&*&\0"      // for '_' (underscore)
        "t_&/&3&\0"                 // for '-' (minus)
        "`);35)I5M\0"               // for '/' or '\' (slashes)
        "a).@7).8-;./.-\0"          // for '\' or '/' (slashes)
        "j()(0(1+4()(*+4+4()(04+",  // for '|' (vertical bar)
        m[229]="",  // message to generate
        i, // index of character, running 7...1
        c, // current character to fill in
        p, // where to place the character
        y; // y-coordinate of the character

    memset(m,32,228); // fill the message with spaces
    for(i=7;--i;)
    {
        c=*f++;
        c^=~w%2|i/2^1?0:115; // flip the direction of slashes, if needed
        for(p=0;*++o;)
        {
            p+=*o-37; // jump to next position
            y=p/57; // extract the y-coordinate
            y=w%2?4-i/5-y:y; // flip the y-coordinate, if needed
            m[y*57+p%57]=c; // place the character
        }
    }
    printf(m); // print the message
}

首先,它准备一个空消息(用空格填充)。对于每个字符(例如|-),都有一个放置该字符的位置列表。

对于每个位置,如果应打印上下颠倒的版本,则该位置会翻转。也就是说,其垂直坐标y4-y或代替3-y(取决于字符是否为下划线)。同样,斜线的方向也被翻转-这是由XOR带有的a来执行的115

此控件结构还用于放置换行符-向列表添加4个坐标似乎比编写显式循环更有效。


该系统存在一些小故障。首先,最后一个字母T在翻转版本中看起来有些不同:

___ 
 |    |
 |    |
 |   _|_

为了正确输出,代码必须将|字符放在字符之后_

另外,为了确保控制字符串仅包含ASCII字符,我对其进行了编码:

  • 它记录位置之间的差异,而不是位置本身-这会缩小范围
  • 字符串中的数字已37添加到其中,以将其移入ASCII范围32 ... 127。我可以增加一个较小的数字,但要37避免像"\这样的字符必须在字符串文字中转义。
  • 其中两个数字都大于127-例如,第一个-字符出现在位置137。为了解决这个问题,我-在另一个位置(79)添加了一个人工字符,后来又覆盖了该字符-该字符|也出现在位置79。

另一个有趣的事情是,我无法使用puts输出字符串-这会产生额外的尾随换行符。所以我printf改用了。

同样,数字57在高尔夫球代码中出现4次-看起来冗长的表达式(w%2?4-i/6-p/57:p/57)*57+p%57使消除变量y成为可能,从而使代码更短。


C似乎是一种“总是用此代码编写此构造”的语言……这种……是……非常……嗯……+ 1;)
拍了

3

Perl中,292个 259 246字节

$_="Svv __SS__S nnSv nnSnnn
i kjSkj hw|j h|wS /SwrhSi pq hwS |
 mSlmSlS |S| l |S|--wS |--lSSmnnlS |--S |
k ihSih jw|h j|S|__S g__S|oosjSk ih jS|ooSo|o";s/v/SSSSS/g;s/w/S|S/g;s/S/  /g;<>&1?y"g-s"\\/\\  /\\ ___ |":y"g-s"\\  \\/\\/_ /\\| ";print $_

利用了以下事实:两个字符串大部分相似(例如,整个IE和C),并且根据显示的版本不同,使字符串显示的字符不同。例如,m表示“右向上的字符串为正斜杠,上下颠倒的字符串为反斜杠”。它进行音译替换以显示正确的字符。还使用字符串替换对游程长度进行编码。

多行:

$_="Svv __SS__S nnSv nnSnnn
i kjSkj hS|S|j h|S|SS /SS|SrhSi pq hS|SS |
 mSlmSlS |S| l |S|--S|SS |--lSSmnnlS |--S |
k ihSih jS|S|h j|S|__S g__S|oosjSk ih jS|ooSo|o";
s/v/SSSSS/g;
s/w/S|S/g;
s/S/  /g;
<>&1?
    y"g-s"\\/\\  /\\ ___ |"
:
    y"g-s"\\  \\/\\/_ /\\| ";
print $_

理念:

由于输出中只有22个唯一列,因此应该可以将其存储为22 * 4 = 88个字符,范围为​​0-17(所有可能的“双重含义”字符),以及56个字符的查找表格,每列0到21之间有一个条目。从理论上讲,它可以使用<100个字节进行编码,但是由于要对其进行解码的代码更加复杂,因此很难获得最终的胜利。



2

CJAM,206

这两个ascii图片是base-216编码的,一个字节= 3个字符。

" _\/|-":A;S7*"!D!D"+:B;qi2%{B"h  °°¤8 2 °2,J° °"",4# °³8=Ô° Ó\"# Ó °""\"z °Â89D-D·° z ·!¶"}{B"'    '!J"+"#h °¼88 2 °°  ° °""2/\" °²8=Ô° Óh#L Ó °""  h°°9D-D°,2 h° °"}?]{{i32-__36/A=@6/6%A=@6%A=}/N}/

在这里测试


2

的powershell,275个 253 248字节

param($n)$d='8 \83484/7/484302 92984308 92918--118--128||6//0\16116129558| \/ |8 /02083\6/10018/6\302 955776_71 9_7_'
'8\,__,777,/6 /,\6/6\,_8 -- _,88,888,  ,||||||'-split','|%{$d=$d-replace+$i++,$_}
0..3|%{$l=$_;-join$d[(0..55|%{$_*8+$l*2+$n%2})]}

测试脚本:

$f = {

param($n)$d='8 \83484/7/484302 92984308 92918--118--128||6//0\16116129558| \/ |8 /02083\6/10018/6\302 955776_71 9_7_'
'8\,__,777,/6 /,\6/6\,_8 -- _,88,888,  ,||||||'-split','|%{$d=$d-replace+$i++,$_}
0..3|%{$l=$_;-join$d[(0..55|%{$_*8+$l*2+$n%2})]}

}

&$f 2
&$f 1

输出:

                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     |
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   |
/        \  |  |  \|  |__   \__  |   \  /    \  |     |
                       __    __
\        /  |  |  /|  |     /    |   /  \ __ /  |     |
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   |
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

主要观点

压缩方法是Dennis♦ 对CJam的扩展方法:

  1. 压缩前创建一个字符串:
    • 两种ASCII艺术的第一列的字符,然后
    • 第二列的字符,然后
    • 第三列的字符,依此类推...
  2. 使用10个连续的替换进行压缩(因为Powershell可以使用数字0..9作为字符串,所以进行10个压缩,这使解压缩算法更短。通过蛮力找到的替换。)

压缩脚本:

$src =
"                       __    __   __             __  ___", # line1, art1
"                       __    __                         ", # line1, art2
"  /\  /\    |  |\  |  |     /    |  |     /\    |     | ", # line2, art1
"\        /  |  |  /|  |     /    |   /  \ __ /  |     | ", # line2, art2
" /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   | ", # line3, art1
" \  /\  /   |  | / |  |--  |     |--/    \  /   |--   | ", # line3, art2
"/        \  |  |  \|  |__   \__  |   \  /    \  |     | ", # line4, art1
"  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_"  # line4, art2

$z=-join(0..$src[0].Length|%{
    $p=$_
    $src|%{$_[$p]}
})
$z

之前的压缩字符串为:

   \  /     /\    /    \  \    /    \/      /\    /    \  \    /    \/     /  \                   ||||||                  ||||||  \    /    \/     /  \   ||||||          ||||||__  --____  --__                    ||    //  \\__    ____    __                  ||||||_   -- __   -- _  | \/ |   /  \                    \  /     /\  /__  \  \__  /    \/     /  \                   ||||||_   -- __   -- _                _      __ ||||||_      _

您答案中的解释可能比我所有答案加起来要付出更多的努力!+1
MilkyWay90 '18

1

SAS,442字节

%macro a(b);&b=tranwrd(&b,put(i,1.),repeat('A0'x,i));%mend;%macro b(z);length a b c d$99;if mod(&z,2)then do;a='992__3__';b='\7/1|1|1/|1|4/3|2/1\0__0/1|4|';c='0\1/\1/2|1|0/0|1|--1|4|--/3\1/2|--2|';d='1\/1\/3|1|/1|1|__2\__1|__|4\/3|__1_|_';end;else do;a='992__3__2__65__1___';b='1/\1/\3|1|\1|1|4/3|1|4/\3|4|';c='0/1\/1\2|1|0\0|1|--1|4|--\3/__\2|--2|';d='/7\1|1|1\|1|__2\__1|2\1/3\1|4|';end;do i=0to 9;%a(a)%a(b)%a(c)%a(d)end;put a/b/c/d;%mend;`

非高尔夫:

%macro a(b);
  &b=tranwrd(&b,put(i,1.),repeat('A0'x,i));
%mend;

%macro b(z);
length a b c d$99;
if mod(&z,2)then do;
  a='992__3__';
  b='\7/1|1|1/|1|4/3|2/1\0__0/1|4|';
  c='0\1/\1/2|1|0/0|1|--1|4|--/3\1/2|--2|';
  d='1\/1\/3|1|/1|1|__2\__1|__|4\/3|__1_|_';
end;
else do;
  a='992__3__2__65__1___';
  b='1/\1/\3|1|\1|1|4/3|1|4/\3|4|';
  c='0/1\/1\2|1|0\0|1|--1|4|--\3/__\2|--2|';
  d='/7\1|1|1\|1|__2\__1|2\1/3\1|4|';
end;
do i=0to 9;
  %a(a)
  %a(b)
  %a(c)
  %a(d)
end;
put a/b/c/d;
%mend;

测试:

data a;
  %b(1)
  %b(2)
  %b(0)
  %b(35)
run;
                       __    __
\        /  |  |  /|  |     /    |   /  \ __ /  |     |
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   |
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_
                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     |
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   |
/        \  |  |  \|  |__   \__  |   \  /    \  |     |
                       __    __   __             __  ___
  /\  /\    |  |\  |  |     /    |  |     /\    |     |
 /  \/  \   |  | \ |  |--  |     |--\    /__\   |--   |
/        \  |  |  \|  |__   \__  |   \  /    \  |     |
                       __    __
\        /  |  |  /|  |     /    |   /  \ __ /  |     |
 \  /\  /   |  | / |  |--  |     |--/    \  /   |--   |
  \/  \/    |  |/  |  |__   \__  |__|     \/    |__  _|_

可以通过将它们放在输入块中来节省一些代码,但这增加了限制,即每个数据步只能对宏执行一次限制,这违反了将其编写为宏的精神。(而且我怀疑在数据步骤中添加提示以获取输入会增加更多字符)。


1

bash,247个字节

(($1%2)) && c=tail || c=head
base64 -d <<<H4sIAF/3uFUCA31Q2w3AIAj8ZwoWMLcQyS3i8JWXtWlTI6BwPA7Vz0Nunc9HhKSowlJU57qWJjBoZ/4a41o8aC4NsTBjbMgYkQDStCIrDz3AbmRuYjpzPTOGG5P9/gmKtQddFy8eMbOn4Khb7NE88ObRs+DgUez3iqrtwYPMAoWJhU/KBeJFPOCqAQAA | zcat | $c -n4

字符串被串联并压缩。


1

PHP,225字节

丑陋的暴力解决方案。

echo str_split(gzinflate(base64_decode('dZDdDcAgCITfnYIFzC1Ecos4fOW3Nm2NgsohfIp8DrJtbB8RkkMEGktk7anhXIO6jFNpzA4Lqq2SqLs5WzKnJ4BUycjOQzXQhdScd6dmV8Rwa7rqP9/QukE9ixeGt2wpODASHoWBN0a1ggMj4fuHsuyBQcYDqfH/XrwA')),224)[$argv[1]%2];

我进行了压缩,然后base64编码了要显示的连接字符串。该代码将其解码,解压缩并将其拆分为224个字符。第一个字符串是224个字符,没有结尾的换行符,第二个字符串是201个字符(其后也没有换行符)。命令行参数($argv[1]%2)的奇偶校验用作生成的数组中的索引str_split()


1

Haskell,138个字节

m x=do
 h<-readFile"a"
 return$take 225.drop(225*mod x 2)<$>find((==h).hash.pack)(replicateM 425"/\\|_- ")

这有点hack。我对两个Minecraft文本的混和进行了残酷的SHA256哈希处理,然后将其拆分并根据参数x选择合适的文本。这是非常不切实际的,无法实时计算,据我所知甚至可能会发生冲突。

因为Haskell无法在字符串中具有该哈希的ASCII表示形式,所以我正在从一个名为“ a”的文件中读取它,并为此增加了32个字节。

  • readFile和pack来自Data.ByteString.Char8
  • 哈希来自Crypto.Hash.SHA256

说明:

replicateM 425"/\\|_- "

在425个字母(两个Minecraft文本的总和的长度)上创建字母“ / \ | _-”的每个组合的列表

find((==h).hash.pack)

选择与哈希匹配的第一个

take 225.drop(225*mod x 2)

第一个文本长225个字母,另一个正好200个字母。


106个字节,而不是138

看到我的解释,我添加了32个字节,因为我正在读取一个32字节长的文件
BlackCap

1

使用Javascript(ES6),403个 296字节

(从我之前的回答中删除)尝试一种新方法:

n=>`55555559Å9Å${n%2?`55555558556776}}5Y75Y¥Æ75786¡YAA[7ćA5Fï5¡YFéA8Y§5}\x83AEÅKÅ\x99}5§5\x999\x95`:`Q5555Q9Ý>6¡77¡}}5Y7756¡75768Y¡AA£7ćA5Fû5u¡FéAY55¡}}­EÅKÅ}G;5¡}5}`}`.replace(r=/./g,x=>(163+x.charCodeAt()).toString(6).slice(1)).replace(r,x=>' /|\\_-'[x]).match(/.{56}/g).join`
`

请注意,这里有一些不可打印的字符。这些已被例如替换\x83

编码本身比另一个短约40个字节,但是解码过程更加复杂。我使用了其他人用来编码文本的base-216系统。供参考,这是我使用的代码:

// normal MINECRAFT
a='00000000000000000000000440000440004400000000000004400444'+
  '00130013000020023002002000001000020020000013000020000020'+
  '01003100300020020302002550020000025530000144300025500020'+
  '100000000300200200320024400034400200030010000300200000200';

// upside-down MINECRAFT
// un-comment this one to run it
/*
a='00000000000000000000000440000440000000000000000000000000'+
  '30000000010020020012002000001000020001003044010020000020'+
  '03001300100020020102002550020000025510000300100025500020'+
  '003100310000200210020024400034400244200000310000244004240';
*/

console.log(a.replace(/.../g,x=>String.fromCharCode(parseInt(b[i],6)+53)));

这基本上采用了ASCII文本(预转换为6),并将其自身增加了三倍,更改为216。然后添加53以删除大多数不可打印的字符。

建议欢迎!


这是原始的403字节代码:

a=n=>{y=[' ','/','|','\\','_','-'],x=`55555559Å9Å${n%2?`55555555¡55Y}}eA5;5};GÝY}5}¡k;77;} 757Ĉ5G;7ć75§H5AB77Ý8ÝEÑ5H5EÅÕ`:`Q5555Q9Ý6¡k5}\u008FAA5;5}}5k5}5}Y§G77G} 757Ċ5?×7ć7;55GAAI7Ý8ÝA865GA5A`}`;b=x.split('').map(x=>x.charCodeAt(0)-53);for(c=[],i=b.length;i--;){c[i]=b[i].toString(6);while(c[i].length<3)c[i]='0'+c[i]}d=c.join('').replace(/\d/g,x=>y[x]).split('');d[56]=d[112]=d[168]=`
`;return d.join('')};

使用一个for循环,一个while循环,仅使用一次的四个变量以及用于简单事物的大量长算法。男孩,我有进步吗?


您可能可以完全删除y=[' ','/','|','\\','_','-'],而不是y[x]' /|\\_-'[x]。=)
塞巴斯蒂安·西蒙

@Xufox我已经做到了很多,总共打了107个字节!
ETHproductions 2016年

0

Python,312字节

def y(b):
 x=int(['4vwhclv10tuk4z18gf73aimn6zvwkrhxekphfn1lxocj9ezchd1cd1cv97p3f6k12s8hcjznnm5iq3om4vgxvugp3makgu4n3f6qxvdrtl4c0lva12hwt','8uzwdylhtrf6oqnwnck8pfxu25m5844tuo2700v3zoeuvossx1b47rnwyrmqodau3feu3spi9jydhyxvntv48vojx9iq9af78wufzn1'][b%2],36);x<<=69;s="";t=" /\\-|_\n"
 while x:s+=t[x&7];x>>=3
 print s

给定int的函数打印输出


是的,我只是在寻找一种将其进一步压缩的简洁方法,尽管如此
Blue

这是如何运作的?
奥利弗·倪

是36分吗?但如果是16598125653940296495007405984048067937906981182427207589486265398555496561913976121109917896233762115477615438181875147062369253802653987802486539539466848179256705775331854915993645
Oliver Ni

基本上,它将两个结果存储在一个列表中,然后使用模数函数获得正确的结果。然后,它会按照您的想法从基数36解码。因为这是2的大幂,所以我通过>> 69删除了一些字符。然后,我使用基本的转换功能将其转换为正确的输出。
2015年

0

C,321字节

将重复和字符索引编码为字符串。

main(n,v,p,c)char**v,*p,*c;{c=" _/\\|-\n";for(p=atoi(v[1])%2?"8@8iXivs8rhththrthtPrXt`rhspiprhtPtvpshrshr`thtprpthtmhtPtmrXshr`tm`tvhsrhsrXthtrhthti`sihtitPsrXtihqtq":"8@8iXi`i8PihavhrshrsXthtshthtPrXthtPrsXtPtvprhsrhs`thtpspthtmhtPtmsXris`tm`tvr8shththsthti`siht`shrXshtPtw";*p;p++)for(n=*p/8^15;n--;)putchar(c[*p&7]);}

0

Python 3中,486 533 612

r=str.replace;m,p=r(r(r('''YYYYY   __YA AYY   A___
  /\  /\YX\  X Y/YX Y/\Y| Y|
 /  \/  \   X \ X--  | Y|--\Y/__\   |--   |
/YY\  X  \XA \A|   \  /Y\  | Y| ''','X','|  |'),'Y','    '),'A','__  '),print;
if int(input())%2==0:p(m)
else:
 q,i,u=m.split('\n')[::-1],0,[[23,24,29,30],[42,43],[],[23,24,29,30,34,35,53,49,50,55]];q.insert(0,q.pop())
 while i<len(q):
  x=list(r(q[i],'_',' '))+[' ']
  for a in u[i]:x[a]='_'
  p(r(r(r(r(''.join(x),'___',''),"\\",'t'),'/',"\\"),'t','/'))
  i+=1

0

PHP,263字节

<?=strtr('3333 20220'.['2 0332 020_
2/\2/\211\113/2113/\212 1
 /2\/2\ 11 \ |1412 14\22/0\ 14 1
/32 \112\|102 \012 \2/22\12 1',
'
\32 /112/|13/212 /2\ 0 /12 1
 \2/\2/ 11 / |1412 14/22\2/ 14 1
2\/2\/211/1102 \010|3\/2102_|_'][$argn&1],[__,"  |","  ","     ","--"]);

在线尝试!


您可以再保存8个字节,而自己替换3个空格。
泰特斯

0

Ruby,290个字节

$><<(gets.to_i%2<1?"xCeCdCnCcC_
c/Bc/Be|ABAAf/e|Af/Be|f|
b/cB/cBd|AbBb|A--Af|--Be/CBd|--d|
/iBAAcB|ACdBCAdBc/eBAf|":"xCeC
Bi/AAc/|Af/e|d/cBbCb/Af|
bBc/Bc/d|Ab/b|A--Af|--/eBc/d|--d|
cB/cB/e|A/AACdBCAC|fB/e|Cc_|_").gsub(?C,'__').tr(?B,?\\).gsub(?A,'c|').gsub(/[a-z]/){|e|' '*(e.ord-97)}

可能是虚弱且可改进的条目。基本上是一种非常简单的压缩(手工压缩),其中小写字母表示许多空格(实际上是ord(ch)-'A'空格)和大写字母只是一些常用术语,节省了几个字节。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.