Giảm nghệ thuật


10

Thách thức này là một hình dán cắt từ nghệ thuật mở rộng ASCII , nhưng đã đảo ngược , sử dụng các ký tự nửa khối dựa trên PetSCII :

string=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█"

Vì vậy, mục tiêu là giảm bằng cách 1/2gửi . Đối với mẫu, từ chuỗi:

 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OO      OOOOOOO 
OO      OO    OO OO   OO OO          OO       OO    OO OO      OO      
OO      OO    OO OO   OO OOOOO       OO   OOO OO    OO OO      OOOOO   
OO      OO    OO OO   OO OO          OO    OO OO    OO OO      OO      
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OOOOOOO OO      

bạn phải kết xuất:

 ▟▀▀▘▟▀▀▙▐▛▀▙▐▛▀▀  ▗▛▀▀ ▟▀▀▙▐▌  ▐▛▀▀ 
 █   █  █▐▌ █▐▛▀   ▐▌ ▜▌█  █▐▌  ▐▛▀  
 ▝▀▀▘▝▀▀▘▝▀▀▘▝▀▀▀   ▀▀▀ ▝▀▀▘▝▀▀▀▝▘   

(hoặc thậm chí:

▗▛▀▀▗▛▀▜▖█▀▜▖█▀▀▘  ▟▀▀▘▗▛▀▜▖█   █▀▀▘ 
▐▌  ▐▌ ▐▌█ ▐▌█▀▘   █ ▝█▐▌ ▐▌█   █▀▘  
 ▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀▘  ▝▀▀▘ ▀▀▀ ▀▀▀▘▀    

;-)

hoặc nơi đường ống:

wget -O - /codegolf//q/19123/9424 |
    sed -ne '/<pre><code>/,/<\/code><\/pre>/{//{/\//q};s/<pre><code>//;p}'
   ('l2v2l6v2'+  'e1l1v3l2'+
 'v3e1v7e1v7e1v7e1l2v6e1l4v5'+
'e1l6v4e1l8v3e1l7l3v2e1l9l3v1')
 .replace(/[lve]\d/g,function
   (c){return Array(-~c[1]).
      join({l:' ',v:'Love'
         ,e:'\n'}[c[0
             ]])})

có thể cung cấp cho:

▗▟█████▙▟█████▄
▜█████████████▛▘
 ▝▀███▙▛█████▀ 
    ▝▀▜██▀▘

Một số mẫu:

mẫu asciiReduce

Với (khoảng) quy tắc tương tự:

  • Nhập từ STDIN hoặc tệp
  • Mỗi ký tự được gửi phải được đại diện, chỉ có khoảng trắng phải trống .
  • Đây là , vì vậy điểm số thấp nhất sẽ giành chiến thắng. Điểm được tính là:
    • +1bằng ký tự, được tính bằng ký tự, không tính bằng byte tức là: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'đếm 20 ký tự, không phải 52 !!
    • -10 để giải thích;
    • +20 để sử dụng công cụ phông chữ bên ngoài hoặc thư viện.

Vì vậy, để làm rõ: hình ảnh đầu vào được chia thành các hình vuông 2x2 và mỗi bản đồ vào một ký tự?
Peter Taylor

1
-0,5 để thêm các phần thưởng lạ (xác định giải thích) - sau khi làm tròn vẫn là một upvote. Ngoài ra, đây là thử thách mã và không phải mã golf.
Howard

Hầu hết các ký tự này không hiển thị chính xác trong trình duyệt của tôi. :(
Victor Stafusa

Trong linux của tôi, tôi sử dụng xterm -xrm 'XTerm*renderFont:false' &để mở một cửa sổ giao diện điều khiển có thể hiển thị đúng.
F. Hauri

Câu trả lời:


4

GolfScript (90 ký tự)

n/.,1&[""]*+.{,}%$-1=.1&+{1$,-´' '*+}+%2/{zip 2/{~+0\{32=!1$++}/" ▗▝▐▖▄▞▟▘▚▀▜▌▙▛█"3/=}%n}%

Rất nhiều trong số này đi để xử lý các mảng rách rưới. Trường hợp thử nghiệm khó chịu:

xx
xxx
xxx
xx
x

chứa 3 lưới 2x2 khác nhau chỉ có một trong 4 ô chứa bất kỳ ký tự nào.

Để làm cho mọi thứ tồi tệ hơn, việc ziphoán vị để cắt các cột thành cặp cho cùng một đầu ra cho ["xx" "xxx"]zip["xxx" "xx"]zip. Do đó, tôi bắt đầu bằng cách đệm ra để đảm bảo rằng tất cả các dòng có cùng độ dài và có một số dòng chẵn.

Lưu ý rằng chương trình này giả định rằng trình thông dịch sẽ coi "" là một chuỗi có độ dài 48, mặc dù theo hướng dẫn trong câu hỏi tôi đang tính nó là 16 ký tự cộng với dấu phân cách.

Tôi đã kiểm tra điều này với khả năng tốt nhất của mình, nhưng tôi không thể tìm thấy một phông chữ đơn cách mà thực sự kết xuất các ký tự đó một cách chính xác.


Mã của bạn dường như thất bại trong bài kiểm tra thứ hai, với trái tim ... Nhưng thật tuyệt! +1 là bạn đầu tiên!
F. Hauri

1
Hừm. Tôi không có xu hướng sử dụng ziptrên các mảng rách rưới, và tôi khá ngạc nhiên với những gì nó dường như làm trên ví dụ ["##" "###"]. Tôi sẽ phải suy nghĩ lại về cách tiếp cận của tôi.
Peter Taylor

Freemono, Unifont, Code2000 và Fixedsys Excelsior đều hiển thị chính xác các ký tự này.
primo

@primo, Unifont không ở đâu gần với không gian trên các ký tự đó. Fixedsys Excelsior cũng không hoàn toàn chính xác, nhưng nó đủ gần.
Peter Taylor

Đúng! bây giờ bạn có nó Nhận xét nhỏ: có hai dòng trống ở cuối đầu ra. Điều này không phá vỡ bất kỳ quy tắc! (Lưu ý: cách tính điểm có chút thay đổi, bạn có thể tiết kiệm được 10 điểm ;-)
F. Hauri


0

Bash (203 ký tự)

#!/bin/bash
r=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█";while IFS= read -r m;do IFS= read -r n;for((l=${#m}>${#n}?${#m}:${#n},i=0; i<l; i+=2)){
printf -ve %-2s "${n:i:2}" "${m:i:2}";e=${e//[^ ]/1};o+=${r:2#${e// /0}:1};};echo "$o";o=;done

hoặc là

r=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█"
while IFS= read -r m; do
    IFS= read -r n
    for ((l=${#m}>${#n}?${#m}:${#n},i=0; i<l; i+=2)) {
        printf -ve %-2s "${n:i:2}" "${m:i:2}"
        e=${e//[^ ]/1}
        o+=${r:2#${e// /0}:1}
    }
    echo "$o"
    o=
done

0

Perl (268 ký tự)

#!/usr/bin/perl -CS
use utf8;my $r=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█";while(@v=split"",<>){@w=split"",<>;foreach my $i(0..$#v/2){($a,$b,$c,$d)=qw|0 0 0 0|;$a=1if$w[$i*2]=~/\S/;$b=1if$w[$i*2+1]=~/\S/;$c=1if$v[$i*2]=~/\S/;$d=1if$v[$i*2+1]=~/\S/;print substr($r,ord pack("b8",$d.$c.$b.$a),1);};print "\n";};

hoặc là

#!/usr/bin/perl -CS
use utf8;
my $r = " ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█";
while ( @v = split "", <> ) {
    @w = split "", <>;
    foreach my $i ( 0 .. $#v / 2 ) {
        ( $a, $b, $c, $d ) = qw|0 0 0 0|;
        $a = 1 if $w[ $i * 2 ] =~ /\S/;
        $b = 1 if $w[ $i * 2 + 1 ] =~ /\S/;
        $c = 1 if $v[ $i * 2 ] =~ /\S/;
        $d = 1 if $v[ $i * 2 + 1 ] =~ /\S/;
        print substr( $r, ord pack( "b8", $d . $c . $b . $a ), 1 );
    }
    print "\n";
}
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.