Cách dễ dàng để mã nghệ thuật ascii golf!


18

Bài tập:

Có rất nhiều câu trả lời trên trang web này được sắp xếp thành nghệ thuật ascii, như thế này . Thông thường việc sắp xếp được thực hiện thủ công, nhưng chương trình sẽ không giúp được gì? :)

Chương trình của bạn sẽ có 3 đầu vào:

  • Mã, dưới dạng một dòng
  • Số lượng dòng trong mẫu (có thể được bỏ qua nếu không cần thiết)
  • Bản thân mẫu, như *s hoặc char khác

Quy tắc:

  • Bạn phải viết một chương trình (không phải là hàm) đọc từ stdin
  • Văn bản được đặt từ trái sang phải trên mỗi dòng
  • Nếu không có đủ văn bản để điền vào mẫu, hãy đặt .s vào các khoảng trống còn lại
  • Nếu có quá nhiều văn bản để điền vào mẫu, in nó ra sau khi đầu ra
  • , vì vậy mã ngắn nhất, tính bằng byte thắng

Chạy mẫu:

Đầu vào (Kiểm tra chính xác Fit) :

qwertyuiopasdfghjklzxcvbnm
4
***** * ***
*   * * *
*   * * *
***** * ***

Đầu ra :

qwert y uio
p   a s d
f   g h j
klzxc v bnm

Đầu vào (Kiểm tra thêm ký tự) :

qwertyuiopasdfghjklzxcvbnm12345
4
***** * ***
*   * * *
*   * * *
***** * ***

Đầu ra :

qwert y uio
p   a s d
f   g h j
klzxc v bnm
12345

Đầu vào (Kiểm tra ký tự không đủ) :

qwertyuiopasdfg
4
***** * ***
*   * * *
*   * * *
***** * ***

Đầu ra :

qwert y uio
p   a s d
f   g . .
..... . ...

2
Những giả định nào nên được đưa ra về nơi cho phép chèn khoảng trắng và dòng mới mà không thay đổi ngữ nghĩa của chương trình?
Peter Taylor

1
@PeterTaylor có vẻ như không có thời gian để đặt / tách mã, vì vậy tôi cho rằng ngữ nghĩa bị bỏ qua?
Martin Ender

1
Do các phần "có thể được bỏ qua" và "hoặc char khác" của thông số kỹ thuật có nghĩa là chúng tôi tự do, nói, chỉ định rằng số lượng dòng phải được bỏ qua và các dấu hoa thị nên được thay thế bằng, giả sử, Xcho Chương trình để làm việc?
Ilmari Karonen

1
@Bakuriu Tôi không hiểu bình luận của bạn. Nếu bạn viết một chương trình bằng ASCII, thì mỗi ký tự là một byte. Nếu bạn viết bằng UTF-32, thì mỗi ký tự là 4 byte. Mã ngắn nhất tính bằng byte , không phải ký tự, sẽ thắng theo thông số hiện tại. Nghe có vẻ như bạn muốn mã hóa trở thành một yêu cầu, nhưng tôi không hiểu tại sao nó lại cần thiết. Tôi đã hiểu nhầm ý kiến ​​của bạn?
Rainbolt

1
Dựa trên một số câu trả lời thiếu một số quy tắc, tôi đã thêm hai ví dụ và di chuyển toàn bộ khối ví dụ bên dưới khối quy tắc để rõ ràng hơn.
Veskah

Câu trả lời:


5

GolfScript, 30 ký tự

n/(\(;n*'*'/{@.!'.'*+([]+@+}*\

Chạy trực tuyến .

Ví dụ:

> qwertyuiopasdfghjklzxcvbnm
> 4
> ***** * ***
> *   * * *
> *   * * *
> ***** * ***

qwert y uio
p   a s d
f   g h j
klzxc v bnm

> qwertyuiopasdfghjklzxcvbnm
> 1
> ***** * ***

qwert y uio
pasdfghjklzxcvbnm

> qwerty
> 2
> ***** * ***
> *   * * *

qwert y ...
.   . . .

10

Perl 6: 60 ký tự EDIT : 38 điểm (xem phía dưới)

  #C#O     D#E#G#O       #L#
#F    #.#S#       T#A#C#K
  get\     .subst(       "*"
,{    shift       BEGIN [
  get\     .comb,\       "."
xx    * ]},       :g)\ .\
  say\     xx get\       ()\
#E    #X#C#       H#A#N#G
  #E#.     #C#O#M#       #!#

Nếu bạn không đánh giá cao kỹ năng nghệ thuật khủng khiếp của tôi, thì đây là golf:

get.subst("*",{shift BEGIN [get.comb,"."xx*]},:g).say xx get

Điều này làm những điều kỳ lạ với thời gian đánh giá.

Đầu tiên, BEGINtừ khóa buộc [get.comb, "." xx *]phải được đánh giá trước, đưa vào một mảng danh sách các ký tự tạo thành "mã", theo sau là một lượng vô hạn"." s .

Tiếp theo, phần getcuối được đánh giá, lấy số lượng dòng của mẫu nghệ thuật ASCII. Các xxnhà điều hành lặp đi lặp lại phần đầu tiên của chương trình này nhiều lần. Điều này có ý nghĩa hơn khi bạn nhận ra rằng code() xx count()về cơ bản là đường cho code() for 1..count():count() nên được đánh giá đầu tiên.

Cuối cùng, phần getđầu của chương trình có một dòng mẫu nghệ thuật ASCII và thay thế mỗi"*" giá trị được thay đổi từ phần đầu của mảng chúng ta tạo ra trước mọi thứ khác ( {shift BEGIN …}).

BIÊN TẬP:

Được giảm xuống còn 37 ký tự, cộng với một ký tự cho chuyển đổi dòng lệnh:

perl6 -pe's:g[\*]=shift BEGIN [get.comb,"."xx*]'

Đây là khái niệm tương tự như bản gốc, công -ptắc lặp lại trên mỗi dòng (sau khi BEGINđã đọc trong "mã") và thay thế tất cả *s bằng chữ cái tiếp theo từ "mã" trước khi in. Định dạng đầu vào cho điều này không nên bao gồm số lượng dòng của định dạng.


6

Ruby 2.0, 53 52 ký tự

c=gets.chop
$><<gets($n).gsub(?*){c.slice!(0)||?.}+c

Theo thông số kỹ thuật, không sử dụng thông số 'số dòng'.

Chạy ví dụ:

qwertyuiopasd
***** * ***
*   * * *
*   * * *
***** * ***

Đầu ra:

qwert y uio
p   a s d
.   . . .
..... . ...

1
./ascii.rb: line 2: syntax error near unexpected token `(' ./ascii.rb: line 2: `puts gets($n).gsub(?*){c.slice!(0)||?.},c'
Không phải Charles

@Charles Tôi dường như không thể gặp lỗi đó trong bất kỳ phiên bản Ruby nào tôi đã cài đặt. Đây là mã đang chạy trên IDEONE: ideone.com/3HG3Fb
Paul Prestidge

kỳ dị. IDEone đã làm việc tốt. Dù sao, bạn có thể tiết kiệm một char (không gian) bằng cách thay thế puts với $><<và thay đổi ,vào cuối một+
Không phải là Charles

@Charles Gọi tốt. Cảm ơn!
Paul Prestidge

2

PowerShell , 63 86 83 82 byte

+20 byte cảm ơn @Veskah

param($s,$p)-join($p|% *ht($s|% Le*)'*'|% t*y|%{if($_-eq42){$_=$s[$i++]}"$_."[0]})

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

Ít chơi gôn hơn:

param($string,$pattern)

$chars = $pattern |
    % PadRight ($string|% Length) '*' |
    % toCharArray |
    % {
        if($_-eq42){$_=$string[$i++]}    # $_ can become $null
        "$_."[0]                         # $_ or '.' if $_ is $null
    }
-join($chars)


2

T-SQL, 142 byte

@h là văn bản đầu vào

@ là mẫu

DECLARE @h varchar(max)='qwertyuiopasdfg'
DECLARE @ varchar(max)='
***** * ***
*   * * *
*   * * *
***** * ***'

WHILE @ like'%*'SELECT @=left(@,charindex('*',@)-1)+left(@h+'.',1)+stuff(@,1,charindex('*',@),''),@h=substring(@h,2,999)PRINT
concat(@,'
'+@h)

Dùng thử trực tuyến



1

JavaScript - 199

text="qwertyuiopasdfghjklzxcvbnm";
pattern="***** * ***\n*   * * *\n*   * * *\n***** * ***";

function p(a,c){z=c.length,y=a.length,x=0;for(i=z;i-->0;)if(c[i]=="*")x+=1;if(x-y>0)for(i=x-y;i-->0;)a+=".";for(;i++<x;)c=c.replace(new RegExp("[*]"),a[i]);console.log(c);console.log(a.substring(x))}

p(text,pattern);

Xuất ra các ký tự phụ trong nhập văn bản nếu không được sử dụng trong mẫu, sử dụng phần đệm "." nếu không đủ

EDIT: được sửa đổi thành một chức năng chấp nhận văn bản và mẫu


4
Đẹp ... nhưng điều này sử dụng đầu vào mã hóa cứng.
TheDoctor

Tôi không chắc chắn làm thế nào để xử lý stdin từ JS, đặc biệt là với các dòng mới. Gợi ý?
Matt

@Matt Nút? Khỉ nhện?
Không phải Charles

Có lẽ làm cho nó hoạt động ...
TheDoctor

4
136:function p(a,c){x=c.split(s='*').length-1;for(i=x-a.length;i--;)a+='.';for(;i++<x;)c=c.replace(s,a[i]);console.log(c+'\n'+a.substring(x))}
Michael M.

1

JavaScript (ES6) - 96 87

r=(c,p)=>{c=0+c;console.log(p.replace(/\*/g,t=>(c=c.substr(1),c[0]||'.'))+c.substr(1))}

Lưu ý: Theo đề xuất của OP , tôi đang sử dụng một chức năng. Nhưng nếu nó bắt buộc phải có một chương trình, thì đây là một giải pháp 93 ký tự .

c=0+(x=prompt)();p=x();console.log(p.replace(/\*/g,t=>(c=c.substr(1),c[0]||'.'))+c.substr(1))

EDIT1: Thay đổi lớn, tôi không biết tại sao lần đầu tiên tôi không nhận ra điều này: P đã lưu 40 ký tự.


Cách sử dụng :

// r(code, pattern)
r("qwertyuiopasdfghjklzxcvbnm", "***** * ***\n*   * * *\n*   * * *\n***** * ***\n** ** **)

Kiểm tra đầu vào : (không có số tùy chọn không cần thiết theo thông số kỹ thuật)

qwertyuiopasdfghjklzxcvbnm
***** * ***
*   * * *
*   * * *
***** * ***
** ** **

Đầu ra :

qwert y uio
p   a s d
f   g h j
klzxc v bnm
.. .. ..      // not much text was there to fill *s - replaced with dots as per spec

Mã bị hủy bỏ :

function run(code, pattern){
  code = "0" + code;  // prepend a zero; useful for the substring operation ahead

  pattern = pattern.replace(/\*/g, function(){  // replace the dots
    // by removing the first letter of code
    // and replacing dot with the first-letter of leftover code 
    // and if it isn't there (code finished)
    // return a dot

    code = code.substr(1); 
    return c[0] || '.';
  });
  }

  // after this operation; code contains the last letter of the org. code

  console.log(  p +  // the pattern has now code
                "\n" +   // and a newline
                c.substr(1) // if there is more than one letter of code left; display it
             );
}

Sẽ rất tuyệt khi nghe bất kỳ đề xuất nào từ người dùng :)


1

Perl, 70 ký tự

@_=split'',<>=~s/\n//r;<>;print/\*/?shift@_||'.':$_ for map{split''}<>

Hoặc, không có kiểm tra ranh giới, 56 ký tự

@_=split'',<>;<>;print/\*/?shift@_:$_ for map{split''}<>

Lưu ý, mã này không sử dụng dòng thứ hai như trong thông số kỹ thuật và có thể rút ngắn ba ký tự <>;


1

Bash, 166 156 111 106

Đọc từ đầu vào tiêu chuẩn, không có số lượng dòng. Dòng đầu tiên là mã bạn muốn đưa vào nghệ thuật ascii, tất cả các dòng tiếp theo là nghệ thuật ascii, bao gồm @ký tự. Đầu vào có độ dài tối đa 999 ký tự và không được phép chứa dấu gạch chéo về phía trước . (Tôi đã chọn không sử dụng *hoặc #vì chúng có ý nghĩa đặc biệt trong Bash).

read -n999 -d/ i p
while [[ $p =~ @ && -n $i ]];do
p="${p/@/${i:0:1}}"
i=${i:1}
done
tr @ .<<<"$p"
echo $i

CẢNH BÁO: Chương trình này sử dụng một tệp gọi là p. Sau khi thực hiện chương trình, xóa p- nó sẽ gây nhầm lẫn cho chương trình lần thứ hai bạn chạy nó.

Hầu hết các công việc ở đây được thực hiện bởi

p="${p/@/${i:0:1}}"
i=${i:1}

Dòng đầu tiên thay thế dòng đầu tiên @trong nghệ thuật bằng ký tự đầu tiên của mã. Dòng thứ hai loại bỏ ký tự đầu tiên của mã.

Nếu không có đủ mã để điền vào hình dạng, một dòng mới sẽ được in sau đầu ra nghệ thuật ascii chính bởi echo $i.


1

C, 98 , 91 ký tự

Đây là một giải pháp C khá đơn giản dưới 100 ký tự. Điều này không sử dụng đầu vào đếm số dòng. (Khác một giây không cần thiết được () sẽ là cần thiết).

char b[999],*s;c;main(){gets(s=b);while(~(c=getchar()))putchar(c^42?c:*s?*s++:46);puts(s);}

vô dụng:

char b[999],*s;c;
main(){
    gets(s=b);
    while(~(c=getchar()))
        putchar(c^42?c:*s?*s++:46);
    puts(s);
}

Bạn có thể sử dụng puts(s)thay vì printf("%s",s)để lưu 7 byte.
nyuszika7h

@ nyuszika7h Cảm ơn! Nhưng tôi không biết nếu bổ sung \nlà một vấn đề.
MarcDefiant

1

Python 2.7, 165 155 150 138 119 ký tự

Được rồi, khá nhiều nhưng tôi đoán đó là cách nhỏ nhất để làm điều đó với Python.

import sys
r=raw_input
l=list(r())
w=sys.stdout.write
for c in"\n".join([r()for _ in[1]*input()]):w(c=='*'and(l and l.pop(0)or'.')or c)
w("".join(l))

Chỉnh sửa: phiên bản mới chức năng 1.0.1 với ít byte hơn được sử dụng:

Edit2: map(r,['']*input()) thay vì [r()for _ in[1]*input()]và loại bỏ nhập không sử dụng

Edit3: '>'*input() thay vì ['']*input()lưu một ký tự và thêm ký tự nhắc cho mẫu :)

r=raw_input
l=list(r())
print''.join(map(lambda c:c=='*'and(l and l.pop(0)or'.')or c,"\n".join(map(r,'>'*input())))+l)

Bạn có thể sử dụng (['.']+l).pop(0)thay vì (len(l)and l.pop(0)or'.')để lưu 9 byte. Và input()thay vì int(r())để tiết kiệm 1 byte.
nyuszika7h

Cảm ơn vì input! Thật không may, lời khuyên đầu tiên của bạn không hoạt động vì nó xuất ra các dấu chấm miễn là độ dài chuỗi> 0.
trước

Tôi thấy lý do tại sao đề nghị của tôi không chính xác. (l+['.']).pop(0)Thay vào đó, hãy thử , nhưng nếu nó không hoạt động, bạn vẫn có thể lưu 4 byte bằng cách sử dụng l andthay vì len(l)and.
nyuszika7h

(l+['.']).pop(0)không xóa các thành phần khỏi lnên chỉ có ký tự đầu tiên được in nhưng lđiều kiện hoạt động :)
trong


0

05AB1E , 18 17 15 byte

s0¢.$«0¹S.;0'.:

Lấy mã làm đầu vào đầu tiên, mẫu là thứ hai ( 0thay vì #).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

18 15 byte thay thế bằng cách lấy các đầu vào theo thứ tự đảo ngược:

0¢.$¹ì0IS.;0'.:

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

Giải trình:

s                # Swap with implicit inputs, so the stack order is now: [code, pattern]
 0¢              # Count the amount of "0" in the pattern
   .$            # Remove that many leading characters from the code
     «           # Append it to the (implicit) pattern input
      0¹S.;      # Replace every "0" one by one with the characters of the first code input
           0'.: '# Then replace any remaining "0" with "."
                 # (after which the result is output implicitly as result)
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.