つららを作る


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      

ルール

  • 数回の反復の後、出力の各行にほぼ確実に末尾スペースがあります。これらを切り捨てることを選択した場合、許可されます。

  • 末尾に空の行が1つありますが、それ以上はありません。

  • 入力には複数のスペースが含まれることがありますが、これらはすべて効果的にスキップされることに注意してください。たとえば、入力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あなたはおそらくMake Alphabet Rainを考えています。
レインボルト

2
MediaWikiへの言及は…
エリックアウトゴルファー

回答:



8

網膜、28バイト

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

オンラインでお試しください!説明:

/\S/+

入力値が空白でない間繰り返します。

¶<

現在の値を出力します。

~(

値に対して残りのスクリプトを実行します。次に、そのスクリプトの結果を値のスクリプトとして実行します。

O`.

文字を順番に並べ替えます。

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

最初の非空白文字を選択し、その文字の最初のリテラル($\)出現を$&スペース(元のコードの末尾のスペース)に置き換えるRetinaプログラムを出力します。


6

APL(Dyalog Unicode)18 11バイト

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

オンラインでお試しください!

使用⎕io←1; 文字列の配列(文字ベクトルのベクトル)を返します


である必要?
Kritixi Lithos

@Cowsquackはい、そうでない場合、出力の最初の数行が同一になる可能性があります
-ngn

@Cowsquackありがとう、気づかなかった
ngn

幸いなことに、これを修正すると解決策が短くなりました:)
ngn

素敵なもの、本当に賢い使い方⍋∘⍋:)
Kritixi Lithos

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、かなり似ている
ルイスメンドー

1
@MagicOctopusUrn実際、最新の05AB1Eバージョンでは9バイトのままです。最初の:文字.;を置き換えるのではなく、すべての文字を置き換えます(つまり!、テストケースで7バイトが行うことを確認してください)。また、チャレンジでは、スペースを除外することが明示的に指定されているため、7バイトは複数のスペースを含む入力では機能しません。PS:いい答えだ、ルイス!私から+1。:)
ケビンクルーイッセン

1
@KevinCruijssenは、そもそもなぜ使用.;しなければならなかったのかを忘れてしまった。あなたがそれについて言及した今、私は文字通り、今年5月1日にそれと苦労したことを覚えています。
魔法のタコ

1
@LuisMendoさて、この回答で使用したコマンドはいずれも、05AB1EのElixirリライトで変更されていません。:)
ケビンクルーイッセン

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 -rn、142 143バイト

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

オンラインでお試しください!

(注:プログラムにはタブがあります)

sedには辞書式順序の概念がないため、印刷可能なASCII文字のセットをハードコーディングする必要があり、バイトカウントの半分以上を占めます。

sed 4.2.2を使用すると、バイトカウントが2減ります。名前のないラベルを使用できるため、オンライン試してください!


-r 拡張正規表現を有効にします(golfier)

-n プログラムの最後でパターンスペースの暗黙的な印刷を無効にします

パターン空間は入力から始まります

:alabel a、これはメインプログラムループです

p パターンスペースを印刷します(バッファの仮名)

次に、印刷可能なASCII文字のセットを追加します(スペースを除く)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ 1バイトの区切り文字として機能するタブを追加し、その後に大文字のアルファベットを追加します

s<tab>代替(sedは区切り文字として任意の文字を使用できます。この場合、タブを使用して、エスケープからのバイトを保存します/

  • \w+$ 追加した大文字のアルファベット

  • <tab>

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>残りの文字、\L&大文字のアルファベットの小文字バージョンであることに注意してください

:blabel b、入力に存在しない文字を開始セットから削除します

/(.).* \1/! ASCIIセットの最初の文字が入力にない場合

  • s/ ./ / それを除く

tbb置換が失敗するまで繰り返す

s/(.)(.*) \1.*/ \2/ 入力に含まれるASCIIセットの最初の文字をスペースに置き換え、ASCIIセットを削除します

ta 再帰する


ここでは、貪欲でないマッチングは本当に役に立ちましたが、sed少なくとも4バイトを節約するのに十分なだましものを思いつくことができました。オンラインで試してみてください。
ニール

(カウズは、間違った順序で同一の文字を削除するため、sedをだますことは部分的にしかできないと指摘しました。)
ニール


4

R140100バイト

-40バイトジュゼッペに感謝!

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
ジュゼッペ

@ジュゼッペそれについて教えてください-私は最初に「順序」を試しましたが、結果は溶けていましたが、正しい順序ではありませんでした!
JayCe

@Giuseppeとあなたの投稿に触発されたアウターを使用する私の試みは、すべてのスペースを削除することができました。TIO独立した回答として掲載されている実用的な外部アプローチをご覧ください。まだそれに取り組んでいますが、それほどエレガントではないかもしれません。
JayCe

3

Python 3、71バイト

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

オンラインでお試しください!

ovsのおかげで-4バイト


*bool({*a}-{" "})代わりにif{*a}-{" "}else[a]
-RootTwo

@RootTwoはこの結果になりませんRecursionErrorか?
-ovs

@RootTwo if/elseショートカットが*boolそうではないので、はい、ovsが言ったような再帰
エラー

もちろんあなたは正しいです。バグのため、私の関数は関数を呼び出すことで再帰し、機能しているように見えました。
RootTwo

3

パイソン270の 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)
ロッド

@ロッド:ああ!それを手に入れた...
チャス・ブラウン

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の助けを借りて3バイトを削除しました

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

オンラインでお試しください!


ああ、とてもいい、ずっといいアプローチです!\Q前回のテストケースでも、あなたが必要だと思います。
ドムヘイスティングス

あなたが正しい。追加しました。
Xcali

短い:say&&s/\Q$a/ / while($a)=sort/\S/g。また、適切に処理します0
トンホスペル

3

JavaScript、67 66 65バイト

私はしばらく酔ってゴルフをしていないので!

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

オンラインで試す

ビールが含まれている4つの冗長バイトを指摘してくれたDanielIndieに感謝します!


なぜマップでyを指定するのですか?:Pそれは67を作ることができます
ダニエルインディー

@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

@urygaありがとう。プロジェクションを適切に実装していれば、{@[x;y;:;" "]}できたはず@[;;:;" "]です。kのどのバージョンを使用しますか?私はこれらに精通していません:_ci _ic _dv
ngn

2.8っぽいと思いますか?私は、演算子を組み込み関数として提供するKonaインタープリターを使用しています:char-of-int、int-of-char、delete-value。
uryga

2

C#(Visual C#Interactive Compiler)、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; および(または印刷可能なASCIIユニコード範囲の上の他の文字)に(char)999することができます '¡'
ケビンクルイッセン

ああ、あなたはより多くの2を節約することができます変更バイトwhileforして置くvar s=ReadLine()と、s=s.Remove(i,1).Insert(i," ")その内部に(2セミコロンが不要になったように)。
ケビンCruijssen


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) オンラインでお試しください!
ライコニ

@ライコニありがとう!私はちょうどそのような何かの危機にonしていて、私は眠りに落ちました。しかし、私はid=<<それがかなり賢いだと思いませんでしたとは思わない
ウィートウィザード


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が行っているのと同じことです。昇順リストになるインデックスを検索し、それらを1つずつ上書きします" "。次に重複を削除するために別個のものを取ります。

?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);}

-1バイトのJonathan Frechに感謝


*p==i?...:0;おそらく可能性があります*p-i?0:...;
ジョナサンフレッチ

@JonathanFrechいいえ、1バイト長くなります(*p-1||(...)同じ長さですが)
l4m2

申し訳ありませんが、コンマ式を一緒にすることの重要性を認識できませんでした。ただし、これは65バイトになる場合があります。typeのようにf(a)コンパイルする方法もわかりませんが、32ビットgccの使用法と関係があると思います。achar*
ジョナサンフレッチ

@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 Lisp240 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))))

オンラインでお試しください!

これは私の最初の投稿です。
私はLispを学習しているので、誰かがこれよりも短いものを考えることができると確信しています。


1
サイトへようこそ!いくつかの一般的なLispを見るのは良いことです!
小麦ウィザード

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

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(つまり、1文字を除くすべてを削除するのに必要な適切な垂直回数)。繰り返しごとに、現在の文字列を出力$xし、同時に便利に保存します。次に、新しい[regex]オブジェクトを$p作成します。このオブジェクトは、スペースに等しいotの残りの文字で構成され、ed、その次の文字で構成さ$aれます。-nesort0

私たちは、その後、設定$aと正規表現オブジェクトの新しい文字列と同じ.Replace文字列に置換するための方法$x$pattern、スペースを持つ" "が、唯一の1番目の一致。ええ、この構文は奇妙です。

文字列はパイプラインに残され、暗黙的にWrite-Outputそれらの間の改行が無料で提供され、末尾に改行が1つ追加されます。




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バイト

範囲から入力を受け取り[A1]、VBEイミディエイトウィンドウに出力する匿名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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.