"Stair-ify" sebuah string

12

Anda harus menulis program atau fungsi yang menciptakan string "stair-ified". Inilah cara Anda "menaiki tangga" sebuah string:

Untuk setiap karakter dalam string:

  • Jika karakter adalah vokal huruf besar atau kecil, tidak termasuk 'y', keluarkan kemudian pindahkan sisa string ke atas kolom.

  • Jika karakter adalah spasi atau tab, keluarkan kemudian pindahkan sisa string ke kolom.

  • Jika karakter bukan keduanya, keluarkan secara normal.

IO dapat dalam format apa pun yang masuk akal. Masukan tidak akan mengandung baris baru. Jika mau, Anda bisa menghapus spasi spasi apa saja.

Jika Anda memilih untuk mengembalikan string, daripada mencetaknya, harap juga sertakan program pendek yang akan mencetak string Anda sehingga dapat divisualisasikan. Ini tidak wajib, juga tidak akan menuju ke byte-count Anda. Ini hanya kenyamanan bagi pengguna yang tidak mengerti golf atau esolang (seperti saya) untuk dapat memverifikasi output atau bermain-main dengan kode.

Sampel IO:

Output untuk "bcdef ghijkl":

    f    jkl
bcde  ghi

Output untuk "Pemrograman Puzzle Dan Code-Golf":

                               lf
                            -Go
                  s  nd   de   
         ng   zzle  A   Co       
      mmi   Pu                 
   gra        
Pro

Output untuk "Abcdefghijklmnopqrstuvwxyz":

                     vwxyz
               pqrstu
         jklmno
     fghi          
 bcde             
A        

Seperti biasa, ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang.

James
sumber
Bolehkah kita menghapus spasi spasi utama / tambahan?
orlp
@ orlp Karena tidak akan mengubah representasi visual sama sekali, saya tidak mengerti mengapa tidak.
James
Jika kita memilih untuk mengembalikan string, apakah program untuk mencetaknya termasuk dalam jumlah byte?
@PeterPeter Lihat hasil edit terakhir saya.
James

Jawaban:

2

MATL , 38 37 byte

Oj33<G13Y2m-IL)hYstX<-"@Z"GX@)h]Xh!c!

Cobalah online!

Penjelasan

Untuk setiap karakter, kode menghitung posisi vertikal, diukur dari atas (0 tertinggi). Kemudian membangun string keluaran ditransposisikan: masing-masing karakter berada pada garis dengan banyak ruang terdepan seperti yang ditunjukkan oleh posisi vertikal. Kemudian semua baris digabungkan menjadi array char 2D, yang akhirnya ditransformasikan dan ditampilkan.

O       % push a 0
j       % input a string
33<     % array of the same length as the input that contains true for spaces or tabs
G       % push input again
11Y2    % string 'aeiouAEIOU'
m       % array of the same length as the input that contains true for vowels
-       % subtract
IL)     % remove last element
h       % prepend the 0 that is at the bottom of the stack
Ys      % cumulative sum. This gives the vertical position of each char
tX<     % duplicate. Compute minimum
-       % subtract. This sets minimum vertical position to 0
"       % for each vertical position
  @     %   push vertical position of current character
  Z"    %   string with that many spaces
  G     %   push input again
  X@)   %   get the character corresponding to the current iteration index
  h     %   concatenate horizontally
]       % end for each
Xh      % concatenate all lines into a row cell array
!       % transpose into a column cell array
c       % convert into 2D array, padding with spaces if needed
!       % transpose. Implicitly display
Luis Mendo
sumber
7

Pyth, 63 byte

V_Q aY?}rN0"aeiou"=hZ?}N"     "=tZZ;Jh.mbYKh.MZYjC.b++*d+JNY*dK_YQ
                         ^^^^^
                         |||||
                         |tabs
                        space

Spasi di tengah sebenarnya adalah karakter tab tunggal, tetapi StackExchange menerjemahkannya sebagai empat spasi.

Cobalah online!

Biarawati Bocor
sumber
Saya menghitung 64 byte.
Conor O'Brien
Karena tab ditampilkan sebagai empat spasi di sini.
Leaky Nun
Jelas 64 byte. mothereff.in/…
Tidak, @KennyLau berarti bahwa karakter tab harus ditempatkan alih-alih empat spasi. Lihatlah tautan online coba.
Mama Fun Roll
@MamaFunRoll StackExchange secara otomatis mengganti tab dengan 4 spasi.
orlp
4

Python 2, 141 137 byte

def S(s,l=[0]):
 for c in s:l+=[l[-1]-(c in"aeiouAEIOU")+(c<"!")]
 for h in sorted(set(l)):print"".join([" ",c][i==h]for i,c in zip(l,s))
orlp
sumber
Yang ini tampaknya tidak turun pada spasi
Score_Under
@Score_Under Ini berfungsi dengan baik di komputer saya. Apakah Anda menguji pada Python 2?
orlp
Bekerja. Saya tidak sepenuhnya tahu bagaimana, tetapi saya pasti telah membuat kesalahan ketika menempelkannya pertama kali.
Score_Di Bawah
3

JavaScript (Firefox 30-57), 151 byte

s=>[...s].map((c,i)=>r[c<'!'?n++:/[AEIOU]/i.test(c)?n--:n][i]=c,n=s.length,r=[for(_ of s+s)[]])&&[for(a of r)if(s=[for(c of a)c||' '].join``)s].join`\n`

Dimana \nmewakili karakter baris baru literal.

Neil
sumber
2
Dengan string template, Anda dapat meletakkan baris baru dalam sebuah string, sehingga Anda dapat menggantinya /ndengan ``
Generic User
1
@GenericUser Hitungan byte disesuaikan dengan anggapan bahwa Anda telah melakukan itu; Saya hanya tidak ingin menggunakan baris baru literal dalam posting saya.
Neil
1

C, 180 byte

char s[99];i,j,p[99],m,M;main(c){for(gets(s);c=s[i];j+=strchr("aeiou",c|32)!=0,j-=c<33,m>j?m=j:M<j?M=j:0)p[i++]=j;for(;m<=M;putchar(10),M--)for(i=0;c=s[i];)putchar(M^p[i++]?32:c);}

Tidak Disatukan:

char s[99];i,j,p[99],m,M;
main(c){for(gets(s);c=s[i];
j+=strchr("aeiou",c|32)!=0,j-=c<33,m>j?m=j:M<j?M=j:0)
  //move current height up or down, adjust minimum and maximum height
p[i++]=j;  //record height of character
for(;m<=M;putchar(10),M--)  //from maximum to minimum height
for(i=0;c=s[i];)putchar(M^p[i++]?32:c);}  //print only characters on this height
mIllIbyte
sumber
1

Perl, 110 byte (skrip 108 byte + 2 flag byte)

$h=0;map{$h{$h}.=' 'x($p-$p{$h}).$_;$p{$h}=++$p;$h+=/[aeiou]/i-/\s/}split//;print for@h{sort{$b<=>$a}keys%h}

Jalankan dengan perl -nl script.pl, input ada di stdin, output ada di stdout.

Deobfuscated

Saya telah mengubah nama variabel lebih masuk akal, membuat kode use strictdan use warningsmematuhi, dan membuat eksplisit banyak perl sihir tidak secara otomatis.

Ini hanya dijalankan sebagai perl script.pl, karena mereplikasi efek dari -nlflag di dalam skrip.

use strict;
use warnings;
use English;

# The effect of -l in perl's flags
$INPUT_RECORD_SEPARATOR = "\n";
$OUTPUT_RECORD_SEPARATOR = "\n";

# These variables are magicked into existence
our $column = 0;
our %line_col = ();
our %lines = ();

# The implicit while-loop is the effect of -n in perl's flags
while (defined(my $line = <>)) {
    # The "chomp" is part of perl's -l flag too
    chomp $line;

    # Here starts the actual script. "$h=0" turns into...
    our $height = 0;
    for my $char (split '', $line) {
        if (!exists $line_col{$height}) {
            # Setting it to 0 is a bit of a white lie, but it might as well be 0.
            # Perl would otherwise have called the value "undef", which is
            # similar to 0 in numeric contexts.
            $line_col{$height} = 0;
        }

        $lines{$height} .= ' ' x ($column - $line_col{$height});
        $lines{$height} .= $char;

        $column++;
        $line_col{$height} = $column;

        $height++ if $char =~ /[aeiou]/i;
        $height-- if $char =~ /\s/;
    }

    # Sort line heights numerically descending (so the greatest is printed first)
    my @heights = sort { $b<=>$a } keys %lines;

    for my $line (@lines{ @heights }) {
        print $line;
    }
}
Score_Under
sumber
1

JavaScript (ES6), 133

s=>s.replace(/[^aeiou ]*(.?)/gi,(z,x,c)=>(q=o[r]||'',o[r]=q+=' '.repeat(c-q.length)+z,x<'!'?++r:r?--r:o=[,...o]),o=[],r=0)&&o.join`
`

Kurang golf

s=>(
  s.replace(/[^aeiou ]*(.?)/gi,(z,x,c)=>(
    q = o[r] || '',
    o[r] = q += ' '.repeat(c - q.length) + z,
    x == ' ' ? ++r : r ? --r : o = [,...o]
  ), o = [], r = 0),
  o.join`\n`
)

Uji

f=s=>s.replace(/[^aeiou ]*(.?)/gi,(z,x,c)=>(q=o[r]||'',o[r]=q+=' '.repeat(c-q.length)+z,x<'!'?++r:r?--r:o=[,...o]),o=[],r=0)&&o.join`
`

function test() {
  i=I.value
  O.textContent=f(i)
}

test()
#I { width:90%}
<input id=I oninput='test()' value='Programming Puzzles And Code-Golf'>
<pre id=O>

edc65
sumber
0

Haskell (dalam terminal ANSI), 75 byte

("\27[2J"++).(h=<<)
h ' '="\27[B "
h c|elem c"aeiouAEIOU"=c:"\27[A"
h c=[c]

Contoh penggunaan: putStr $ ("\27[2J"++).(h=<<) $ "bcdef ghijkl"

Ini menggunakan kode pelarian ANSI untuk menggerakkan kursor ke atas dan ke bawah.

nimi
sumber
0

C, 173 160 156 155 byte

Sunting: Ide pinjaman untuk menggunakan strchr dari @mIllIbyte untuk mengurangi 13 byte

Sunting2: Merampingkan perbandingan min / maks, -4 byte

Sunting3: c dapat memiliki nilai untuk memulai dengan -> ke main (c) sebagai gantinya, -1 byte

Sunting4: Menambahkan ungolf / penjelasan

p,l,j,m;main(c){char b[99],*s=gets(b);for(;j<m+2;p?putchar(c?l?32:c:10):l<j?j=l:l>m?m=l:0,l-=c?(c&=223)&&c-9?!!strchr("AEIOU",c):-1:(p=s=b,l+j++))c=*s++;}

Tidak dikumpulkan dan dijelaskan:

/* declare and initialize these variables to int and 0 */
p,l,j,m;

/* declares main, but also int c */
main(c)
{

  /* we can handle strings of length 98 (+1 for string-terminating 0) */
  /* we declare and initialize s to point to the beginning of the input
     string for the first pass through the for loop */
  char b[99],*s=gets(b);

  /* the for-loop actually contains nested loops, where the inner loops
     behave differently depending on the outer loop parameter p as follows:
     p attains the values false (0) and true (non-null pointer), in this order.

     p == false:
      the inner loop has the parameter s and passes through all the characters
      in the string until the string is exhausted (*s == 0). l is the vertical
      position of the current character relative to the first character
      (l = 0), smaller number = higher up. The purpose here is simply to find
      the range of vertical positions [j, m] present in the string. The
      commands in execution order are:

      -- loop over s --

      // test does not do anything since j <= m by design
      1. j < m+2

      // puts current char in c and increments string counter
      2. c = *s++          

      // ensures that j (m) equals the min (max) of the vertical positions (l)
         encountered so far. At first step j = l = m = 0.
      3. l<j?j=l:l>m?m=l:0 

      // c != 0, this updates the vertical position for the next character
      // c = SPC or C = TAB -> lower (l increases by 1)
      // c = "aeiouAEIOU" -> higher (l decreases by 1)
      4a. l-=(c&=223)&&c-9?!!strchr("AEIOU",c):-1

      -- loop over s ends --

      // c == 0, this resets the string pointer s and puts p = true, and 
      //         thereby initiates the next phase of the algorithm
      //         see rest of the explanation at p == true)
      4b. p=s=b

    p == true:
     now there are two inner loops. The outer of these has the parameter j,
     which ranges from the smallest vertical position+1 (the value of j after
     the p == false pass) to the largest vertical position+1 (m+2 after the
     p == true pass). The innermost loop has the parameter s and passes through
     all characters in the string until the string is exhausted (*s == 0) just
     as in the p == false inner loop. Here l is now the vertical position
     relative to the current position j-1, so that l == 0 when a character is
     at the current level. Such characters are printed as is, whereas
     characters at other levels are replaced by space. The end-of-string
     marker 0 outputs a newline. The commands in execution order are:

      -- loop over j --

      // at first step increments j to point to be one more than the
      // current vertical position. At other steps moves the current position
      // (j-1) one vertical position downwards. Also, at all steps, this
      // biases the vertical position counter l to be zero at the current
      // vertical position (j-1)
      1. l=-j++

      // compare j to stopping criteria, exit if j > m+1
      2. j < m+2

       -- loop over s --

       // puts current char in c and increments string counter
       3. c = *s++          

       // outputs character as follows:
       // c == 0 (end of string), output newline
       // c != 0 (middle of string)
       //  l == 0 (character at current vertcial position), output c
       //  l != 0 (character not at current vertical position), output space
       4. putchar(c?l?32:c:10)

       // c != 0, this updates the vertical position for the next character
       // c = SPC or C = TAB -> lower (l increases by 1)
       // c = "aeiouAEIOU" -> higher (l decreases by 1)
       5a. l-=(c&=223)&&c-9?!!strchr("AEIOU",c):-1

       -- loop over s ends --

      // c == 0, this resets the string pointer s for next loop over s
      //         algorithm (see rest of the explanation at p == true)
      5b. p=s=b

     -- loop over j ends --
  */

  for(;
      j<m+2;
      p?putchar(c?l?32:c:10):
    l<j?j=l:l>m?m=l:0,
      l-=c?(c&=223)&&c-9?!!strchr("AEIOU",c):-1:
       (p=s=b,l+j++))
    c=*s++;
}
Zunga
sumber