文字冰柱


45

由于Stack Exchange的技术限制,标题显示不正确。此挑战的正确标题是

做一个

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

当今的挑战是使输入词无法产生冰柱。给定一个完全可打印的ASCII字符串,以及至少2个非空格字符,请执行以下步骤:

  1. 打印字符串的当前状态。

  2. 用空格替换词法上最小的字符(空格除外)。如果有平局,请替换最左边的字符。

  3. 在连续的行上重复直到该字符串仅包含1个非空格字符。

这产生了输入字符串看起来像融化的效果。

I'm Melting!!!
I'm Melting !!
I'm Melting  !
I'm Melting   
I m Melting     
  m Melting   
  m  elting   
  m   lting   
  m   ltin    
  m   lt n    
  m    t n    
       t n    
       t      

规则

  • 经过几次迭代后,您的输出几乎肯定会在每行上都有尾随空格。如果选择截断这些内容,则允许这样做。

  • 您可能只有一个尾随的空行,但没有更多。

  • 请记住,输入可能包含多个空格,但是所有这些空格都被有效地跳过了。例如,输入a a应为

    a      a
           a
    
  • 如果需要,您可以将输入作为字符串列表。对于输出,您可以返回或打印字符串列表,带换行符的单个字符串或char matrix / 2D数组。通常,我更喜欢宽松的IO格式,因此很可能会允许其他格式,只要它们是一致的并且明确对应于正确的输出即可。如有疑问,请随时提问。与往常一样,允许使用完整的程序或功能。

  • 请记住,这是用任何语言做出最短答案的竞赛!如果您选择用Java回答,请尝试做出最短的Java回答(以字节为单位)。

测试用例

Hello World! -->

Hello World!
Hello World 
 ello World 
 ello  orld 
 ello  orl  
  llo  orl  
   lo  orl  
    o  orl  
    o  or   
       or   
        r   


AbCdEfGhIjKlMnOpQrStUvWxYz -->

AbCdEfGhIjKlMnOpQrStUvWxYz
 bCdEfGhIjKlMnOpQrStUvWxYz
 b dEfGhIjKlMnOpQrStUvWxYz
 b d fGhIjKlMnOpQrStUvWxYz
 b d f hIjKlMnOpQrStUvWxYz
 b d f h jKlMnOpQrStUvWxYz
 b d f h j lMnOpQrStUvWxYz
 b d f h j l nOpQrStUvWxYz
 b d f h j l n pQrStUvWxYz
 b d f h j l n p rStUvWxYz
 b d f h j l n p r tUvWxYz
 b d f h j l n p r t vWxYz
 b d f h j l n p r t v xYz
 b d f h j l n p r t v x z
   d f h j l n p r t v x z
     f h j l n p r t v x z
       h j l n p r t v x z
         j l n p r t v x z
           l n p r t v x z
             n p r t v x z
               p r t v x z
                 r t v x z
                   t v x z
                     v x z
                       x z
                         z


PPCG is da BEST --> 

PPCG is da BEST
PPCG is da  EST
PP G is da  EST
PP G is da   ST
PP   is da   ST
 P   is da   ST
     is da   ST
     is da    T
     is da     
     is d      
     is        
      s        


({({})({}[()])}{}) -->

({({})({}[()])}{})
 {({})({}[()])}{})
 { {})({}[()])}{})
 { {}) {}[()])}{})
 { {}) {}[ )])}{})
 { {}  {}[ )])}{})
 { {}  {}[  ])}{})
 { {}  {}[  ] }{})
 { {}  {}[  ] }{} 
 { {}  {}   ] }{} 
 { {}  {}     }{} 
   {}  {}     }{} 
    }  {}     }{} 
    }   }     }{} 
    }   }     } } 
        }     } } 
              } } 
                } 

1
“词法最小”是指代码点吗?
朱塞佩

1
@Giuseppe是的,具有最小ASCII码点的字符(显然不是空格)
DJMcMayhem

2
让我想起了另一个挑战,我认为我们必须按字母顺序垂直重复一个字符。
毛茸茸的

6
@Shaggy您可能正在考虑制作字母雨
Rainbolt

2
但这是对MediaWiki的引用……
Erik the Outgolfer

Answers:



8

视网膜,28字节

/\S/+¶<~(O`.
0L$`\S
0`$\$&¶ 

在线尝试!说明:

/\S/+

输入的值不为空时,请重复。

¶<

打印当前值。

~(

在该值上执行脚本的其余部分。然后,将该脚本的结果作为值上的脚本执行。

O`.

将字符排序。

0L$`\S
0`$\$&¶ 

选择第一个非空白字符,然后输出一个Retina程序,该程序用空格(原始代码中的尾随空格$\)替换该字符()的第一个文字()出现$&



6

05AB1E,9个字节

ðм{v=yð.;

在线尝试!

说明

ð      # Push space
м      # Implicit input. Remove spaces
{      # Sort. Gives string of sorted, non-space chars
v      # For each char in that string
  =    #   Print latest string, without popping. The first time it prints the input
  y    #   Push current char
  ð    #   Push space
  .;   #   Replace first occurrence of current char by space
       # Implicitly end for-each loop

1
{ðKv=yð.;是我的,很好。
魔术章鱼缸

@MagicOctopusUrn Heh,非常相似
Luis

1
@MagicOctopusUrn实际上,在最新的05AB1E版本中,它仍将是相同的9个字节。. :替换所有字符,而不是.;替换第一个字符(即!,在测试用例中看一下7字节的作用)。另外,挑战明确指出要排除空格,因此您的7字法不适用于包含多个空格的输入。PS:好的答案,路易斯!向我+1。:)
Kevin Cruijssen

1
@KevinCruijssen让我忘了为什么我必须首先使用.;它。我确实记得今年早些时候在5月1日为之奋斗的一面,而现在您提到了这一点。
魔术章鱼缸

1
@LuisMendo好吧,您在此答案中使用的命令在05AB1E的Elixir重写中均未更改。:)
Kevin Cruijssen

5

Pyth,17 14 13字节

V-SQdQ=XQxQNd

在这里尝试

V-SQdQ=XQxQNd
V-SQd              For each non-space character in the sorted input (Q)...
     Q             ... print the current value of Q...
      = Q          ... and set Q to itself...
         xQN       ... with the first instance of the character...
       X    d      ... replaced by a space.

5

sed -rn142143字节

:a
p
s/$/	ABCDEFGHIJKLMNOPQRSTUVWXYZ/
s	\w+$	!"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_`\L&{|}~	
:b
/(.).*	\1/!s/	./	/
tb
s/(.)(.*)	\1.*/ \2/
ta

在线尝试!

(注意:程序中有选项卡)

由于sed没有字典顺序的概念,因此我不得不对可打印ASCII字符集进行硬编码,并且占用了字节数的一半以上。

使用sed 4.2.2会将字节数减少2,因为这允许使用未命名的标签,请在线尝试!


-r 启用扩展的正则表达式(更好)

-n 在程序结束时禁用模式空间的隐式打印

模式空间从输入开始

:a标签a,这是主程序循环

p 打印模式空间(缓冲区的奇特名称)

现在我们追加可打印的ASCII字符集(不包括空格)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ 附加一个制表符,用作1字节定界符,后跟大写字母

s<tab>替代(sed可以使用任何字符作为定界符,在这种情况下,制表符用于保存字节,避免转义/

  • \w+$ 我们刚刚附加的大写字母

  • <tab>

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>其余字符,请注意,这\L&是大写字母的小写版本

:blabel b,从开头集中删除输入中不存在的字符

/(.).* \1/! 如果ASCII集中的第一个字符不在输入中

  • s/ ./ / 去掉它

tb重复b直到替换失败

s/(.)(.*) \1.*/ \2/ 用空格替换输入中存在的ASCII集的第一个字符,然后删除ASCII集

ta 递归


非贪婪匹配在这里确实很有帮助,但是我能够提出一些愚蠢的东西sed以节省至少4个字节:在线尝试!
尼尔,

(牛嘎嘎指出,由于我以错误的顺序删除了相同的字符,所以我只能部分地愚弄sed。)
Neil


4

R140100字节

-40字节感谢Giuseppe!

function(x)for(i in any((z=utf8ToInt(x))<33):max(y<-rank(z,,"f"))){z[y==i]=32
cat(intToUtf8(z),"
")}

在线尝试!

使用outerGiuseppe的魔力正常工作的解决方案更长,为104字节。受到这个答案的启发。

function(x,z=utf8ToInt(x)-32)apply(t(outer(rank(z,,"f"),(2-(min(z)>0)):nchar(x),">=")*z+32),1,intToUtf8)

在线尝试!


109个字节将输入作为字符向量
朱塞佩

1
以输入为字符串的100个字节
朱塞佩

仍然是一个很好的答案。因为我不记得了,我的气球膨胀了200多个字节rank
朱塞佩

@Giuseppe告诉我-我首先尝试了“排序”,但结果却融化了,但顺序不正确!
JayCe '18年

@Giuseppe和我受您的帖子启发使用外部的尝试仅成功删除了所有空格。TIO我希望看到一个行之有效的外部方法作为单独的答案发布。仍在努力,但可能并不那么优雅。
JayCe '18年

3

Python 3,71个字节

f=lambda a:[*a.strip()]and[a]+f(a.replace(min(a.replace(*" ~"))," ",1))

在线尝试!

-4个字节,感谢ovs


使用- *bool({*a}-{" "})而不是if{*a}-{" "}else[a]
RootTwo '18

@RootTwo不会导致结果RecursionError吗?
ovs

@RootTwo if/else快捷方式,但*bool不会,所以是的,就像OVS recursionerror说
HyperNeutrino

你当然是对的。由于存在错误,我的函数通过调用您的函数而递归,因此它似乎可以正常工作。
RootTwo '18

3

Python 2中70个 69 66 64字节

def f(s):print s;S=set(s)-{' '};S and f(s.replace(min(S),' ',1))

在线尝试!

通过使用代替从ovs 2字节的ThxS and f()if S:f()


您错过了...If there is a tie, replace the leftmost character...规则,可以通过replace(min(...),' ',1)
Rod

@Rod:啊!知道了…
Chas Brown

3

果冻,8字节

ẋ"ỤỤ$z⁶Q

在线尝试!

理念

基本思想是直接构建所需输出的列,而不是操纵字符串并返回所有中间结果。

我们首先以输入字符串的字符被删除的顺序来对其进行编号。目前,我们假设空间也将被删除。

tee ay oh
845139276

现在,我们通过在此枚举中通过每个字符的索引重复来构建列。

tee ay oh
tee ay oh
tee ay oh
tee  y oh
t e  y oh
t    y oh
t    y o 
t    y   
     y   

剩下的就是删除重复项,以解决空间问题。

ẋ"ỤỤ$z⁶Q  Main link. Argument: s (string)

    $     Combine the two links to the left into a chain.
  Ụ       Grade up; sort the indices of s by their corresponding values.
          Let's call the result J.
          Grade up again, sorting the indices of J by the corr. values in J.
          This enumerates the positions of s as described before.
ẋ"        Repeat each character of s that many times.
     z⁶   Zip the resulting 2D array, filling missing characters with spaces.
       Q  Unique; deduplicate the array of rows.

3

Perl 5中 -n37个 34字节

在@TonHospel的帮助下删除了三个字节

say&&s/\Q$a/ / while($a)=sort/\S/g

在线尝试!


啊,非常好,更好的方法!我认为您需要\Q最后一个测试用例...。我也是第一次错过了!
Dom Hastings '18

你是对的。添加了。
Xcali

简称:say&&s/\Q$a/ / while($a)=sort/\S/g。也可以正确处理0
Ton Hospel,

3

JavaScript,67 66 65字节

因为我有一段时间没有喝高尔夫球了!

s=>[...t=s].sort().map(x=>x>` `?t+=`
${s=s.replace(x,` `)}`:0)&&t

在线尝试

感谢DanielIndie指出啤酒包含的4个冗余字节!


为什么在地图中指定y?:P它可以做成67
DanielIndie

@DanielIndie,因为啤酒!:D感谢您指出。
毛茸茸的

是的,我认为情况会如此:P
DanielIndie

3

K(ngn / k)26 24字节

{?(,x),x{x[y]:" ";x}\<x}

在线尝试!


美丽!我的K尝试出现在41:`{。[x;(-1 +#x)&x?_ci&/ _ ic x _dv“”;:;“”]}`我在浪费字节,将字节转换为int然后返回并进行确保它不会超出范围。
里加(Uryga)'18年

@uryga谢谢。如果我正确地实施了预测,{@[x;y;:;" "]}本来可以做到的@[;;:;" "]。您使用哪个版本的k?我不熟悉这些:_ci _ic _dv
ngn

我认为是2.8欧元?我正在使用Kona解释器,该解释器将运算符作为内置函数提供:char-of-int,int-of-char,delete-value。
uryga

2

C#(Visual C#交互式编译器),129个字节

var s=ReadLine();while(s.Any(c=>c!=32)){WriteLine(s);var i=s.IndexOf(s.Min(c=>c==32?(char)999:c));s=s.Remove(i,1).Insert(i," ");}

在线尝试!


c!=32可以c>32; c==32可以c<33; 并且(char)999可以是'¡'(或可打印的ASCII unicode范围之外的任何其他字符)。
Kevin Cruijssen

哦,您还可以保存另外两个字节,将更改为whilefor然后将var s=ReadLine()and s=s.Remove(i,1).Insert(i," ")放在其中(这样就不再需要两个分号了)。
凯文·克鲁伊森


2

Haskell,67个字节

Laikoni节省了12个字节

f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b)

在线尝试!

这终止于错误

Haskell83 79字节

g(a,_:b)=a++' ':b
mapM_ putStrLn.(iterate$g.(span=<<(/=).minimum.concat.words))

在线尝试!

这终止于错误

Haskell,86个字节

u=concat.words
g(a,_:b)=a++' ':b
(take.length.u)<*>(iterate$g.(span=<<(/=).minimum.u))

在线尝试!

Haskell100 91 88字节

u=concat.words
f x|(a,_:b)<-span(/=minimum(u x))x=a++' ':b
(take.length.u)<*>(iterate f)

在线尝试!


67个字节:f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) 在线尝试!
Laikoni '18

@Laikoni谢谢!我正处于这样的边缘,我睡着了。但是我认为我不会想出id=<<这么聪明的方法
Wheat Wizard


2

K428个 20 18字节

解:

?x{x[y]:" ";x}\<x:

例:

q)k)?x{x[y]:" ";x}\<x:"PPCG is da BEST"
"PPCG is da BEST"
"PPCG is da  EST"
"PP G is da  EST"
"PP G is da   ST"
"PP   is da   ST"
" P   is da   ST"
"     is da   ST"
"     is da    T"
"     is da     "
"     is d      "
"     is        "
"      s        "
"               "

说明:

这与ngn所做的是同一件事。查找会导致列表升序的索引,使用,将其一一覆盖" ",然后使用非重复项删除所有重复的行:

?x{x[y]:" ";x}\<x: / the solution
                x: / save input as x
               <   / return indices that would result in ascending sort
 x{        ; }\    / two-line lambda with scan
        " "        / whitespace
       :           / assignment
   x[y]            / x at index y
            x      / return x
?                  / distinct

2

gcc 32位,66 65字节

char*p,i;f(a){for(i=32;i++;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}
main(){char s[]="3.1415926";f(s);}

感谢Jonathan Frech的-1个字节


*p==i?...:0;可能是*p-i?0:...;
乔纳森·弗雷希

@JonathanFrech不,它长了1个字节(尽管*p-1||(...)长度是相同的)
l4m2

抱歉,没有意识到使逗号表达保持在一起的重要性。但是,这可能是65个字节。我也不知道应该如何f(a)编译,a应该是type char*,但是我认为这与您的32位gcc用法有关。
乔纳森·弗雷希

@JonathanFrech我认为char*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}在tio(64bit)上可以解释f(a)工作原理
l4m2

很抱歉,尽管我向OP询问了挑战说明,他们说输入字符串可能以空格开头。因此,我提出的解决方案是无效的(因为这样的输入会导致无限循环),因此您很可能应该还原为原始解决方案。
乔纳森·弗雷希

2

MATLAB,74字节

它使用max()函数的2输出形式检索最小的字符及其索引,已将字符串转换为空格中的零值和256(可打印字符的字符值)。

s=input('s');x=1;while(x);disp(s);[x,y]=max((256-s).*(s~=' '));s(y)=' ';end

1
欢迎来到PPCG!干得好!
AJFaraday

2

Common Lisp的240个 228 224字节

(setf s(read))(defun f(x)(setf y(char-code(elt s x)))(if(= y 32)1e9 y))(loop for _ across s do(print s)do(setf s(replace s" ":start1(position(code-char(reduce #'min (loop for i from 0 below(length s)collect i):key #'f))s))))

在线尝试!

这是我第一次发贴。
我正在学习口齿不清,因此我敢肯定有人会想到比这短的东西。


1
欢迎光临本站!很高兴看到一些常见的口齿不清!
小麦巫师

1

APL(Dyalog Unicode),39字节SBCS

{⎕←⍵⋄×≢⍵∩g' '~⍨⎕UCS256:∇' '@(⊃g⍋⍵)⊢⍵}

在线尝试!

Dfn。

怎么样?

{⎕←⍵⋄×≢⍵∩g' '~⍨⎕UCS256:∇' '@(⊃g⍋⍵)⊢⍵}  Main function, argument 
 ⎕←⍵⋄                                     Print 
         g' '~⍨⎕UCS256                  Assign to g every Unicode character except space
     ×≢⍵∩                :                If ⍵∩g is not empty
                                         Recursively call the function with argument:
                           ' '@          Space at
                               (⊃g⍋⍵)     The first (⊃) element in  graded up (⍋) with g
                                          The dyadic grade up function will index  according
                                          to its left argument, in this case g.

1

V,27个字节

>>ò2Ùúú^lDhrfDj|@"r kdòdj<H

在线尝试!

十六进制转储:

00000000: 3e3e f232 d9fa fa5e 6c44 6872 6644 6a7c  >>.2...^lDhrfDj|
00000010: 4022 7220 6b64 f264 6a3c 48              @"r kd.dj<H

1

PowerShell103 99字节

param($a)2..$a.length|%{($x=$a);[regex]$p=""+([char[]]$a-ne' '|sort)[0];$a=($p.replace($x," ", 1))}

在线尝试!

将输入作为字符串输入$a。然后,我们从循环2$a.length(即,除去一个字符以外的所有字符所需的垂直次数)。每次迭代,我们输出当前字符串并方便地同时保存到$x其中。然后我们构建了一个新[regex]对象,$pattern包含剩下的字符中$a-nOT eQUAL空间,sort编,则0其第一个。

然后,我们设置$a等于与正则表达式对象的一个新的字符串.Replace的方法在字符串中替换$x,该$pattern,有空间" ",但只有1ST比赛。是的,这种语法很奇怪。

这些字符串留在管道上,隐式Write-Output为我们免费提供它们之间的换行符,以及一个尾随的换行符。




1

MATL17 16字节

tSXz"tOy@=f1)(]x

在线尝试!验证所有测试用例

说明

t       % Implicit input. Duplicate
S       % Sort
Xz      % Remove spaces
"       % For each char in that string
  t     %   Duplicate last result. This is the most recent string obtained
        %   from replacing chars by spaces in the input
  O     %   Push 0
  y     %   Duplicate from below
  @     %   Push current char
  =     %   Equals? (element-wise) Gives 1 for occurrences of current char
        %   in the most recent string, 0 otherwise
  f     %   Indices of nonzeros
  1)    %   Get the first entry
  (     %   Write 0 at that position. Char 0 will be displayed as space
]       % End
x       % Delete last result, which consists only of space / char zero

1

Excel VBA,167个字节

匿名VBE立即窗口函数,该函数从范围获取输入[A1]并输出到VBE立即窗口。

s="Code(Mid(A$1,Row(),1))":[B1].Resize([Len(A1)])="=If("&s &"=32,1E3,"&s &")":For i=1To[Len(A1)-CountIf(B:B,1E3)]:?[A1]:[A1]=[Substitute(A1,Char(Min(B:B))," ",1)]:Next

取消评论

''  run as `call icicle("Test")` or `icicle"I am the WALRUS`
Sub icicle(Optional str As String)
    If Not IsMissing(str) Then [A1] = str   ''  pipe input
    [B:B].Clear                             ''  reset between runs
    [B1].Resize([Len(A1)]) = "=If(Code(Mid(A$1,Row(),1))=32,1E3,Code(Mid(A$1,Row(),1)))"  ''  get char number for every char in input
    For i = 1 To [Len(A1)-CountIf(B:B,1E3)] ''  iterate across from 1 to length of input - number of spaces
        Debug.Print [A1]                    ''  output a single line
        [A1]=[Substitute(A1,Char(Min(B:B))," ",1)]  ''  replace minimum char with space
    Next
End Sub

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.