Cầu thang Stair-ify là một chuỗi


12

Bạn phải viết một chương trình hoặc chức năng tạo ra chuỗi "cầu thang". Đây là cách bạn "cầu thang-ify" một chuỗi:

Đối với mỗi ký tự trong chuỗi:

  • Nếu ký tự là nguyên âm viết hoa hoặc viết thường, không bao gồm 'y', hãy xuất nó sau đó di chuyển phần còn lại của chuỗi lên một cột.

  • Nếu ký tự là khoảng trắng hoặc tab, hãy xuất nó sau đó di chuyển phần còn lại của chuỗi xuống một cột.

  • Nếu ký tự là không, xuất nó bình thường.

IO có thể ở bất kỳ định dạng hợp lý. Các đầu vào sẽ không chứa bất kỳ dòng mới. Nếu bạn muốn, bạn có thể loại bỏ bất kỳ khoảng trắng theo sau.

Nếu bạn chọn trả về chuỗi, thay vì in chuỗi, vui lòng bao gồm một chương trình ngắn sẽ in chuỗi của bạn để có thể hiển thị chuỗi. Điều này không bắt buộc, cũng sẽ không đi theo số byte của bạn. Đây chỉ là sự tiện lợi cho những người dùng không hiểu về golf hoặc esolang (như tôi) để có thể xác minh đầu ra hoặc tinker với mã.

Mẫu IO:

Đầu ra cho "bcdef ghijkl":

    f    jkl
bcde  ghi

Đầu ra cho "Câu đố lập trình và Code-Golf":

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

Đầu ra cho "Abcdefghijklmnopqrstuvwxyz":

                     vwxyz
               pqrstu
         jklmno
     fghi          
 bcde             
A        

Như thường lệ, đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất tính theo byte sẽ thắng.



Chúng tôi có thể tước bất kỳ khoảng trắng hàng đầu / dấu?
orlp

@orlp Vì nó sẽ không thay đổi hình ảnh đại diện nào cả, tôi không hiểu tại sao không.
James

Nếu chúng ta chọn trả về chuỗi, chương trình in có được bao gồm trong số byte không?

@PeterPeter Xem chỉnh sửa cuối cùng của tôi.
James

Câu trả lời:


2

MATL , 38 37 byte

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

Hãy thử trực tuyến!

Giải trình

Đối với mỗi char, mã tính toán vị trí thẳng đứng của nó, được đo từ phía trên (0 là cao nhất). Sau đó, nó xây dựng chuỗi đầu ra được hoán vị: mỗi char nằm trên một dòng có nhiều khoảng trắng hàng đầu như vị trí dọc của nó biểu thị. Sau đó, tất cả các dòng được liên kết thành một mảng char 2D, cuối cùng được hoán vị và hiển thị.

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

7

Bình thường, 63 byte

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

Các khoảng trắng ở giữa thực sự là một ký tự tab duy nhất, nhưng StackExchange biểu hiện nó thành bốn khoảng trắng.

Hãy thử trực tuyến!


Tôi đếm 64 byte.
Conor O'Brien

Bởi vì các tab được hiển thị như bốn không gian ở đây.
Leaky Nun

Chắc chắn là 64 byte. Mothereff.in/ từ

Không, @KennyLau có nghĩa là nên đặt ký tự tab thay vì bốn khoảng trắng. Nhìn vào liên kết thử nó trực tuyến.
Mama Fun Roll

@MamaFunRoll StackExchange tự động thay thế các tab theo 4 khoảng trắng.
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))

Cái này dường như không rơi xuống khoảng trắng
Score_Under

@Score_Under Nó hoạt động tốt trên máy của tôi. Bạn đang thử nghiệm trên Python 2?
orlp

Nó đang hoạt động. Tôi hoàn toàn không biết làm thế nào nhưng tôi đã mắc lỗi khi dán nó lần đầu tiên.
Điểm_Under

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`

Trường hợp \nđại diện cho nhân vật dòng chữ mới.


2
Với các chuỗi mẫu, bạn có thể đặt một dòng mới vào một chuỗi, do đó bạn có thể thay thế /nbằng ``
Người dùng chung

1
@GenericUser Số byte được điều chỉnh giả sử rằng bạn đã làm điều đó; Tôi chỉ không muốn sử dụng một dòng mới trong bài viết của mình.
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);}

Ung dung:

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

1

Perl, 110 byte (tập lệnh 108 byte + cờ 2 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}

Chạy với perl -nl script.pl, đầu vào là trên stdin, đầu ra là trên thiết bị xuất chuẩn.

Khử mùi

Tôi đã đổi tên các biến hợp lý hơn, tạo mã use strictuse warningstuân thủ và tự động làm rõ ràng rất nhiều phép thuật perl.

Đây chỉ là chạy perl script.pl, bởi vì nó sao chép hiệu ứng của các -nlcờ bên trong tập lệnh.

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

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`
`

Ít chơi gôn

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`
)

Kiểm tra

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>


0

Haskell (trong thiết bị đầu cuối ANSI), 75 byte

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

Ví dụ sử dụng: putStr $ ("\27[2J"++).(h=<<) $ "bcdef ghijkl"

Điều này sử dụng mã thoát ANSI để di chuyển con trỏ lên và xuống.


0

C, 173 160 156 155 byte

Chỉnh sửa: Mượn ý tưởng sử dụng strchr từ @mIllIbyte để cạo 13 byte

Edit2: Sắp xếp hợp lý các so sánh tối thiểu / tối đa, -4 byte

Edit3: c có thể có bất kỳ giá trị nào để bắt đầu bằng -> thành main (c), -1 byte

Chỉnh sửa4: Đã thêm ungolf / giải thích

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++;}

Ungolfed và giải thích:

/* 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++;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.