階段の執筆


35

特定の文字列を階段形式で出力するプログラムまたは関数を作成し、母音で始まる単語の各部分を前の部分の1行下に書き込みます。

例えば:

Input: Programming Puzzles and Code Golf


Output: Pr          P           C    G
          ogr        uzzl   and  od   olf
             amm         es        e
                ing

入力

文字とスペースのみを含む文字列。

文字列は、STDINまたは関数の引数、または同等のものを介して渡すことができます。

文字は小文字でも大文字でもかまいません。

入力は常にこれらのルールに従うものと想定されるため、誤った入力をチェックする必要はありません。

出力

各時間は母音(で、aeiouまたはy)をワードに遭遇され、あなたは正しい水平位置の次の行(付属遭遇母音)の出力単語の残りの部分を、必要があります。このルールは再帰的です。つまり、単語にn個の母音がある場合、n + 1行に書き込まれます。

  • 母音は、次の行の先頭に書き込まれるべきであり、前の行に出会ったときに書き込まれるべきではありません。

  • 各単語は最初の行から始まるため、他の単語とは独立してフォーマットする必要があります。2つの単語はスペースで区切られます。

  • 単語が母音で始まる場合、2行目から記述する必要があります。

テストケース

  • 入力: Programming Puzzles and Code Golf

出力:

Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e
        ing
  • 入力: The quick brown fox jumps over the lazy dog

出力:

Th  q     br    f   j          th  l    d
  e  u      own  ox  umps ov     e  az   og
      ick                   er        y
  • 入力: aeiouy

出力:

 
a
 e
  i
   o
    u
     y
  • 入力: YEAh UppErcAsE VOwEls

出力:

               V
Y    Upp        Ow
 E      Erc       Els
  Ah       As  
             E
  • 入力: If you only knew the power of the Dark Side

出力:

            kn   th  p        th  D    S
If y   onl    ew   e  ow   of   e  ark  id
    o     y             er                e
     u

得点

これはなので、最短のコードが優先されます。


3番目の出力例は、「単語が母音で始まる場合、2行目から記述する必要があります」というルールと矛盾しているようです。
JohnE

1
YはYは母音ですか?
オプティマイザー

1
@JohnE確かにそうだったので、修正しました。ありがとう。
15:03

2
The vowel should be written at the beginning of the next line, and not at the end of the previous line when one is encountered.少し考えてから、これは次の行への移動が母音が印刷される前ではなく後に行われることを意味することを理解していますが、すぐに理解できる方法でこれを表現する価値があるかもしれません-それには時間がかかりました。
trichoplax

3
末尾の改行/スペースは許可されますか?
-Loovjo

回答:


18

網膜50 44 34 (+10) 32 30バイト

実際の制御文字を使用して14バイトを節約してくれたDennisに感謝します。

i`[aeiouy]
<VT>$0#
+`#(\S*)
$1<ESC>[A

この答え基づいて、私はANSIエスケープコードを使用して端末カーソルを垂直に移動しています。<ESC>制御文字として0x1Bに置き換え、そしてべきである<VT>垂直タブ付き0x0B。テストを簡単にするため<ESC>\e<VT>で置き換え、で\v、出力をフィードすることもできますprintf

カウントのために、各行は個別のファイルに入れられます。ただし、便宜上、コードを1つのファイルに貼り付けて、-sオプションでRetinaを呼び出す方が簡単です。

最初の置換はの各母音を囲みます\v...#。ここで\vカーソルは下に移動し、#は2番目のステップのマーカーです。これi`は、大文字と小文字を区別しないマッチングのためのRetinaの表記です。

次に、2番目のステップ(+`#が単語からaを繰り返し削除し、単語e\[Aの末尾にa を置きます。これによりカーソルが上に移動します。これは、文字列の変化が停止すると、つまり#、文字列にマーカーがなくなると停止します。


必要ありませんprintf\eESCバイト(0x1b)に置き換えるだけです。
デニス

@デニスああ、それははるかに良いです、ありがとう。
マーティンエンダー

1
これはすごい!!!
kirbyfan64sos

この答えは誰も網膜を真剣に受け止めない理由です;)
クリストファー・ウィート

@ChristopherWirtを詳しく説明してください:)(誰か Retinaを真剣に受け止めた場合、私は実際に恐ろしいでしょう。)
マーティンエンダー

8

CJam、39 36バイト

0000000: 6c 7b 5f 65 6c 22 61 65 69 6f 75 79 22  l{_el"aeiouy"
000000d: 26 7b 22 1b 5b 41 22 27 0b 6f 5c 7d 26  &{".[A"'.o\}&
000001a: 5f 53 26 7b 5d 7d 26 6f 7d 2f           _S&{]}&o}/

上記はリバーシブルxxdダンプです。これは、ソースコードに印刷できない文字VT(コードポイント0x0b)とESC(コードポイント0x1b)が含まれているためです。

同じように、この答えは、それが垂直タブと使用ANSIエスケープシーケンスを

これには、ほとんどの非Windowsターミナルエミュレーターを含むサポートビデオテキストターミナルが必要です。

試運転

実際のコードを実行する前に、プロンプトを無効にして画面をクリアします。

$ PS1save="$PS1"
$ unset PS1
$ clear

これにより、出力が適切に表示されます。

echo -n Programming Puzzles and Code Golf | cjam <(xxd -ps -r <<< 6c7b5f656c226165696f757922267b221b5b4122270b6f5c7d265f53267b5d7d266f7d2f)
Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e
        ing

プロンプトを復元するには、次を実行します。

PS1="$PS1save"

使い方

各母音の前に垂直タブを挿入してカーソルを下に移動し、各スペースの後に十分なバイトシーケンスのコピー1b 5b 41"\e[A")を挿入して、カーソルを最初の行に戻します。

l           e# Read a line from STDIN.
{           e# For each character C:
  _el       e#   Push lowercase(C).
  "aeiouy"& e#   Intersect with "aeiouy".
  {         e#   If the intersection is non-empty:
    ".[A"   e#     Push "\e[A" (will be printed later).
    '.o     e#     Print "\v".
    \       e#     Swap "\e[A" with C.
  }&        e#
  _S&       e#   Intersect C with " ".
  {         e#   If the intersection is non-empty:
    ]       e#     Wrap the entire stack in an array.
  }&
  o         e#   Print C or the entire stack.
}/          e#

unset PS1saveその後を忘れないでください。
-usandfriends

5

Java、428バイト

void s(String s){int l=s.length(),m=0;char[][]c=new char[l][];for(int i=0;i<c.length;java.util.Arrays.fill(c[i++],' '))c[i]=new char[l];String v="aeiouyAEIOUY";String[]a=s.split(" ");for(int r=0,p=0;r<a.length;r++){String u=a[r]+" ";int o=v.indexOf(u.charAt(0))>=0?1:0,x=p;for(;x<u.length()-1+p;o+=v.indexOf(u.charAt(x++-~-p))>=0?1:0)c[o][x]=u.charAt(x-p);p+=u.length();m=m<o?o:m;}for(int i=0;i<=m;i++)System.out.println(c[i]);}

恐ろしいことです。おそらく剃ることができるいくつかの文字がありますが、私はそれをするのが面倒です。


あなたはおそらく、あなたの多く宣言することができるint変数を(つまりirpo、とx)あなたが初期化場所lm彼らは、後に値が与えられますので、。またString v="...",a[]=...;、上記と同じ操作を行うこともできString uます。それはあなたのスコアをかなり下げるはずです。
TNT

私は好きですx++-~-p
-Ypnypn

4

Perl、31バイト

0000000: 24 5c 3d 22 1b 5b 41 22 78 20 73 2f 5b 61  $\=".[A"x s/[a
000000e: 65 69 6f 75 79 5d 2f 0b 24 26 2f 67 69     eiouy]/.$&/gi

上記はリバーシブルxxdダンプです。これは、ソースコードに印刷できない文字VT(コードポイント0x0b)とESC(コードポイント0x1b)が含まれているためです。

コードの長さは27バイトで、スイッチが必要です040p(4バイト)。

このプログラムには、垂直タブとANSIエスケープシーケンスをサポートするビデオテキストターミナルが必要 です。これには、ほとんどのWindows以外のターミナルエミュレータが含まれます。

試運転

実際のコードを実行する前に、プロンプトを無効にして画面をクリアします。

$ PS1save="$PS1"
$ unset PS1
$ clear

これにより、出力が適切に表示されます。

echo -n Programming Puzzles and Code Golf | perl -040pe "$(xxd -ps -r <<< 245c3d221b5b41227820732f5b6165696f75795d2f0b24262f6769)"
Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e 
        ing

プロンプトを復元するには、次を実行します。

PS1="$PS1save"

使い方

  • perl -040p入力をスペース区切りのトークン(-040)として自動的に読み取り、各トークンを$_-p)に保存してプログラムを実行します。

  • s/[aeiouy]/.$&/gi$_母音についてグローバルで大文字と小文字を区別しない検索を実行し、各母音を制御文字VT(カーソルを下に移動)で置き換え、その後に母音自体を続けます。

  • sは、それが行った置換の数を返します。したがって$\=".[A"x s...、バイトシーケンス1b 5b 41の複数のコピーを保存します(カーソルを上に移動します)$\

  • プログラムの終了時に、Perl "$_$\"-pスイッチのためにを自動的に出力します。


4

C、200 190バイト

i,j,k,l,M;f(char*s){M=strlen(s)+1;char t[M*M];for(;i<M*M;++i)t[i]=(i+1)%M?32:10;for(i=0;i<M-1;++i)k=(strspn(s+i,"aeiouyAEIOUY")?++j:s[i]==32?j=0:j)*M+i,l<k?l=k:0,t[k]=s[i];t[l+1]=0;puts(t);}

ゴルフをしていない:

i,j,k,l,M;
f(char *s){
    M = strlen(s)+1;
    char t[M*M];
    for(; i<M*M; ++i) t[i] = (i+1)%M ? 32 : 10;
    for(i=0; i<M-1; ++i)
        k = (strspn(s+i,"aeiouyAEIOUY") ? ++j : s[i]==32 ? j=0 : j) * M + i,
        l<k ? l=k : 0,
        t[k] = s[i];
    t[l+1]=0;
    puts(t);
}

長方形のバッファー(実際には正方形)を割り当て、スペースと改行で埋めてから、指定されたストリングを走査します。最後にヌル文字を追加して、末尾の改行を防ぎます。

技術的には、グローバルが含まれているため関数ではありません。実際には複数回呼び出すことはできません(jl開始時に0でなければなりません)。準拠するには、機能の開始時にi,j,k,l,M;移動することができますint i,j=0,k,l=0,M;


char*t=malloc(M*M);-> char t[M*M];およびfor(i=0;i<M*M;++i) ->for(;i<M*M;++i)
Spikatrix

良いキャッチ、編集。
jcai

これはC99のせいではないchar t[M*M]でしょうか?
ザカリー

4

CJam、47

ええ、それは少し長いですが、ANSIコードで「不正」ではありません:)

q_{_S&!\el"aeiouy"-!U+*:U}%_0|$])\zff{~@-S@?}N*

オンラインで試す

アイデアは、各文字の行番号を計算し(0から始まり、母音で増分し、スペースで0に戻る)、その後、各行で文字列を繰り返しますが、異なる行番号を持つ文字をスペースに置き換えます。


3

K、 81 72 70 66バイト

さて、それは始まりです:

`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x}

使用例:

  `0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x} "Programming Puzzles and Code Golf"
Pr          P           C    G   
  ogr        uzzl   and  od   olf
     amm         es        e     
        ing                      
  `0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x} "YEAh UppErcAsE VOwEls"
               V     
Y    Upp        Ow   
 E      Erc       Els
  Ah       As        
             E       

編集1:

より良い。表面レベルの改善:

`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/{+\{12>"aeiouyAEIOUY"?x}'x}'(0,&~{"  "?x}'x)_ x}
`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}

特に、?母音検索を実行するときの引数を逆にして、ラムダの必要性をなくし、同じ逆を行いました_私は空白に単語を分割し、私はそれが実現場所~{" "?x}'xというのは本当に愚かな、overcomplicated方法です" "=x

編集2:

別の表面レベルの調整s-ラムダに適用する前に調整し、内部の括弧を保存します。

`0:{+{(-z)!y,x#" "}[|/s].'x,'s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}
`0:{+{z!y,x#" "}[|/s].'x,'-s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}

編集3:

OK、各文字のオフセットを計算する別のアプローチを取りましょう。シーケンスをスペースで分割し、+\母音の位置のランニングサム()を計算する代わりに、スペースに遭遇するたびにランニングサムに0を掛けて、1回のパスで入力文字列全体を操作できます。このシーケンスの否定が必要なので、スキャンするときに追加する代わりに減算し、垂直パディングの量を計算するときに#?最大(|/)ではなく個別数()を使用できます。

`0:{+{z!y,x#" "}[|/s].'x,'-s:,/(+\12>?["aeiouyAEIOUY"]')'_[0,&" "=x]x}
`0:{+{z!y,x#" "}[#?s].'x,'s:1_0{(~" "=y)*x-12>"aeiouyAEIOUY"?y}\x}

これにより、さらに4文字が節約されます。ふう!


2

ルビー:135の 131 124 115 112文字

a=[]
y=l=0
gets.split(r=/(?=[aeiouy ])/i).map{|w|w=~r&&y+=1
w<?A&&y=0
a[y]='%*s%s'%[-l,a[y],w]
l+=w.size}
puts a

サンプル実行:

bash-4.3$ ruby staircase.rb <<< 'Programming Puzzles and Code Golf'
Pr          P           C    G
  ogr        uzzl   and  od   olf
     amm         es        e
        ing

間違っていない場合は、正規表現をに短縮できます/(?=[aeiouy ])/i
アレックスA.

ああ、あなたは正しい@AlexAです。別の単語としてのスペースは、以前の理論にとってのみ重要でした。ありがとう。
マナトワーク

2

C、192バイト

f(char*s){int l=0,r=1,v,c;for(;r;l=1){v=l;r=0;char*p;for(p=s;*p;++p){c=*p;if(c==' ')v=l,putchar(c);else if((strchr("aoeuiyAOEUIY",c)?--v:v)<0)r=1,putchar(' ');else*p=' ',putchar(c);}puts(p);}}

これにより、文字列が繰り返され、印刷時に文字が空白になります。印刷するスペース以外の文字がなくなるまで繰り返します。これは移植可能なCであり、文字エンコードについて何も想定していません。

読みやすいバージョン

f(char *s) {
    int l=0,       /* true if we've done the first line (no vowels) */
        r=1,       /* true if characters remain in buffer */
        v,         /* how many vowels to print from current word */
        c;         /* current character value */
    for (l=0; r; l=1) {
        v = l;
        r = 0;
        char *p;
        for (p=s;*p;++p) {
            c=*p;
            if (c==' ') {       /* a space - reset vowel counter */
                v=l;
                putchar(c);
            } else if ((strchr("aoeuiyAOEUIY",c)?--v:v)<0) {
                /* vowel conter exceeded - print a space */
                putchar(' ');
                r=1;
            } else {
                /* print it, and obliterate it from next line of output */
                putchar(c);
                *p=' ';
            }
        }
        puts(p); /* p points at the NUL, so this just prints a newline */
    }
}

' '-> 32およびf(char*s){int l=0,r=1,v,c;->l,r=1,v,c;f(char*s){
Spikatrix

@Cool- ' ' かもしれませんが32、それは文字エンコーディングに依存します、そして私が言ったように、私はこの移植性のあるCを作りintました。
トビースパイト

2

Pythonの3、265の 207 202 185 177文字

i=input()
w,e=i.split(" "),lambda:[[" "]*len(i)]
o,x=e(),0
for p in w:
    y=0
    for c in p:
        if c in"AEIOUYaeiouy":o+=e();y+=1
        o[y][x],x=c,x+1
    x+=1
for l in o:print("".join(l))

これはひどいものであり、誇りに思っていません。これを短くできることは知っていますが、とにかく投稿したいと思いました。

Cバージョンに触発されて、入力文字列をトラバースしながらリストが作成されます。


2

GNU Sed、151 + 1

-rフラグが必要なため+1 )

s/^/ /;h;s/[aoeuiy]/_/ig;:a;s/_[^ _]/__/;ta;y/_/ /;g;:x;:b;s/ [^ aoeuiy]/  /i;tb;h;s/([^ ])[aoeuiy]/\1_/ig;:c;s/_[^ _]/__/;tc;y/_/ /;g;s/ [^ ]/  /ig;tx

sedはこの仕事のツールになると思っていましたが、驚くほど難しいと思いました。

読み取り可能なバージョン:

#!/bin/sed -rf

# make sure the string starts with a space
s/^/ /
h

# print leading consonants, if any
s/[aoeuiy]/_/ig
:a
s/_[^ _]/__/
ta
y/_/ /
p
g

:x
# strip the consonants just printed
:b
s/ [^ aoeuiy]/  /i
tb
h

s/([^ ])[aoeuiy]/\1_/ig
:c
s/_[^ _]/__/
tc
y/_/ /
p
g
# remove leading vowel of each word
s/ [^ ]/  /ig
tx

私は怖いです、それは128文字であるべきです。1行バージョンにはaがないためp、何も出力されません。小さな問題は、出力が余分なスペースで始まることです。大きな問題は、母音で始まる最初のテキストが消えることです。
マナトワーク

私はそれが以前に働いていたと確信しています。私は見て、私が壊れたものを見るでしょう。ヘッズアップ、@ manatworkをありがとう!
トビースパイト

c直前の行のためにループに飛び込むのは間違っていましたtx。同様のループを使用して以前のバージョンを復元しましたが、後で別の試みを行います。
トビースパイト

2

Python 2、145 142バイト

おそらく他の方法ほど競争力はありませんが、正規表現を使用するクールな方法だと思いました。

import re;s=I=input()[::-1]+" ";i=0
while s.strip()or i<2:s=re.sub("(?!([^aeiouy ]*[aeiouy]){%s}[^aeiouy]* )."%i," ",I,0,2)[::-1];print s;i+=1

正規表現は(?!([^aeiouy ]*[aeiouy]){N}[^aeiouy]* ).任意の1文字と一致しますは、単語の末尾からN番目の文字グループ内にない。世界の終わりから数えるので、前後に文字列を逆にし、最後にスペースを追加する必要がありますが、その後、re.subこれらの文字のすべてのインスタンスをスペースに置き換えるのは簡単になります。文字列が空になるまで、Nのすべての値に対してこれを行います。


使いやすくて読みやすいのでre.I、適切なフラグ値、つまりを置き換えることで3バイト節約できます2
-Sp3000

1
@ Sp3000コードゴルフでのみ、「素敵で読みやすい」と否定的な関連性があります
-KSab

1

オクターブ、132 129文字

p=1;x=[];y=input(0);for j=1:numel(y);if regexpi(y(j),'[aeiouy]');p+=1;elseif y(j)==" ";p=1;end;x(p,j)=y(j);end;x(x==0)=32;char(x)

テスト

入力: "YEAh UppErcAsE VOwEls"

出力:

               V     
Y Upp Ow   
 E Erc Els
  あああ        
             E       

1

Gema53 48文字

/[aeiouyAEIOUY]/=@append{u;^[[A}^K$1
 = $u@set{u;}

^[(x1b)と^K(x0b)は単一の文字であることに注意してください。(以下のサンプル実行では、試してみたい場合に備えて、コピーと貼り付けが簡単\e\v同等のものを使用しています。)

サンプル実行:

bash-4.3$ gema '/[aeiouyAEIOUY]/=@append{u;\e[A}\v$1; = $u@set{u;}' <<< 'Programming Puzzles and Code Golf'
Pr          P           C    G    
  ogr        uzzl   and  od   olf 
     amm         es        e 
        ing 

1

ゼリー、42バイト(非競合?)

Ḳµe€Øyœṗ⁸⁶ṁ$;¥\z⁶Zµ€µḷ/⁶ṁW⁸;ḣ®µ€L€Ṁ©$¡ZK€Y

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

なぜゼリー、なぜ?:-(


CJamよりも長く変だと思われる
8

@Fatalizeこれは、Jellyが単に文字列を使用しないためです...通常は。また、異なるプログラミングパラダイムを実際に比較することはできません(cjamはスタックベースで、ゼリーは暗黙的です)。
エリックアウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.