Простий спосіб кодування-гольфу мистецтва ассії!


18

Завдання:

На цьому сайті є багато відповідей, які впорядковані в мистецтво ascii, як це . Зазвичай влаштування відбувається вручну, але чи не допомогла б програма в цьому? :)

Ваша програма займе 3 входи:

  • Код, як один єдиний рядок
  • Кількість рядків у шаблоні (при необхідності їх можна опустити)
  • Сам візерунок, як *s або інший знак

Правила:

  • Ви повинні написати програму (не функцію), яка читає з stdin
  • Текст розміщується зліва направо на рядок
  • Якщо для заповнення шаблону не вистачає тексту, поставте .s в пробіли
  • Якщо тексту для заповнення шаблону занадто багато, роздрукуйте його після виведення
  • , тому виграє найкоротший код у байтах

Зразок виконання:

Вхідні дані (Exact Fit test) :

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

Вихід :

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

Введення (тест додаткових символів) :

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

Вихід :

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

Введення (тест на недостатню кількість символів) :

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

Вихід :

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

2
Які припущення слід робити про те, де допустимо вставляти пробіли та нові рядки, не змінюючи семантику програми?
Пітер Тейлор

1
@PeterTaylor, здається, немає місця для розміщення / розділення коду, тому я вважаю, що семантика ігнорується?
Мартін Ендер

1
Чи означають, що частини "може бути пропущена" та "чи інша символіка" означає, що ми вільні, скажімо, вказати, що кількість рядків потрібно опустити, а зірочки повинні бути замінені, скажімо, Xна наші програма для роботи?
Ільмарі Каронен

1
@Bakuriu Я не розумію ваш коментар. Якщо ви пишете програму в ASCII, то кожен символ є байтом. Якщо ви пишете в UTF-32, то кожен символ має 4 байти. Найкоротший код у байтах , а не символи, виграє відповідно до поточної специфікації. Здається, ви хочете, щоб кодування стало вимогою, але я не бачу, чому це потрібно. Я неправильно зрозумів ваш коментар?
Rainbolt

1
На підставі деяких відповідей, у яких відсутні деякі правила, я додав два приклади і перемістив весь блок прикладу нижче блоку правил для додаткової ясності.
Вешка

Відповіді:


5

GolfScript, 30 символів

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

Запустити онлайн .

Приклади:

> 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 символів EDIT : 38 балів (див. Низ)

  #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#       #!#

Якщо ви не цінуєте мої страшні мистецькі навички, ось гольф:

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

Цей робить дивні речі з часом оцінки.

По-перше, BEGINключове слово змушує [get.comb, "." xx *]спочатку оцінюватися, вводячи в масив список символів, що складають "код", а потім нескінченну кількість "."s.

Далі getв кінці оцінюється, отримуючи кількість рядків шаблону мистецтва ASCII. xxОператор повторює першу частину програми це багато разів. Це має більше сенсу, коли ви розумієте, що code() xx count()в основному це цукор для code() for 1..count(): count()слід оцінити спочатку.

Нарешті, на getпочатку програми отримується рядок шаблону мистецтва ASCII та замінює кожне "*"значення, зміщене від початку масиву, який ми створили перед усім іншим ( {shift BEGIN …}).

Редагувати:

На 37 символів плюс один для перемикання командного рядка:

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

Це те саме поняття, що і оригінал, -pперемикання ітерації над кожним рядком (після того, BEGINяк прочитано "Код"), і заміщення всіх *s наступною літерою з "коду" перед друком. Формат введення для цього не повинен включати кількість рядків формату.


6

Ruby 2.0, 53 52 символи

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

Відповідно до специфікації, не використовується параметр "кількість рядків".

Приклад виконання:

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

Вихід:

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'
Не те, що Чарльз

@Charles Я не можу отримати цю помилку в будь-якій інстальованій мені версії Ruby. Ось код, який працює на IDEONE: ideone.com/3HG3Fb
Paul Prestidge

дивно. IDEONE працював чудово. У всякому разі, ви можете зберегти символ (пробіл), замінивши puts з $><<і змінюючи ,в кінці кінців до+
Чи не те,

@Charles Добрий дзвінок. Спасибі!
Пол Престидж



2

T-SQL, 142 байти

@h - вхідний текст

@ - візерунок

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)

Спробуйте в Інтернеті



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

Виводить зайві символи при введенні тексту, якщо вони не використовуються в шаблоні, використовується "". якщо недостатньо

EDIT: змінено, щоб бути функцією, що приймає текст та шаблон


4
Приємно ... але для цього використовується жорсткий кодування.
TheDoctor

Я не був впевнений, як впоратися з stdin від JS, особливо з новими рядками. Пропозиції?
Метт

@Matt Node? Spidermonkey?
Не те, що Чарльз

Можливо, зробивши це функцією ...
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))}
Майкл М.

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

Примітка: За пропозицією ОП , я використовую функцію. Але якщо для цього потрібна програма, ось рішення на 93 символи .

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

EDIT1: Основна зміна, я не знаю, чому я цього не усвідомив вперше: P Зберег 40 символів.


Використання :

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

Тестовий ввід : (без зайвого необов'язкового номера за специфікацією)

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

Вихід :

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

Код без вогню :

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

Було б дуже приємно почути будь-які пропозиції від користувачів :)


1

Perl, 70 символів

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

Або без граничної перевірки 56 символів

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

Зауважте, що цей код не використовує другий рядок, як у специфікації, і його можна скоротити на три символи <>;


1

Bash, 166 156 111 106

Читається зі стандартного введення, кількість ліній не приймається. Перший рядок введення - це код, який ви хочете ввести в мистецтво ascii, всі наступні рядки - це мистецтво ascii, що складається з @символу. Максимальна довжина вводу становить 999 символів, і заборонено містити косої риски вперед . (Я вирішив не використовувати *або #тому, що вони мають особливі значення в Bash).

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

УВАГА: Ця програма використовує файл під назвою p. Виконавши програму, видаліть p- вона сплутає програму вдруге, коли ви її запустите.

Більша частина роботи тут виконується

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

Перший рядок замінює перший @у цій галузі першим символом коду. Другий рядок видаляє перший символ коду.

Якщо для заповнення форми недостатньо коду, після виведення основного мистецтва ascii art друкується новий рядок echo $i.


1

C, 98 , 91 символів

Тут досить прямолінійне рішення C на рівні менше 100 символів. При цьому не використовується введення підрахунку рядків. (Інакше буде потрібна секунда непотрібної ().

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

неозорений:

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

Ви можете використовувати puts(s)замість того, printf("%s",s)щоб зберегти 7 байт.
nyuszika7h

@ nyuszika7h Дякую! Але я не знаю, чи є додаткова \nпроблема.
MarcDefiant

1

Python 2.7, 165 155 150 138 119 символів

Гаразд, дуже багато, але я думаю, що це найменший спосіб зробити це з 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))

Редагувати: нова функціональна версія 1.0.1 з ще меншим числом байтів:

Edit2: map(r,['']*input()) замість [r()for _ in[1]*input()]та не видалений невикористаний імпорт

Edit3: '>'*input() замість ['']*input()збереження одного символу та додавання швидкого символу для шаблону :)

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)

Ви можете використовувати (['.']+l).pop(0)замість того, (len(l)and l.pop(0)or'.')щоб зберегти 9 байт. І input()замість того, int(r())щоб зберегти 1 байт.
nyuszika7h

Дякую за input! На жаль, ваша перша порада не працює, оскільки вона видає крапки, поки довжина рядка> 0.
avall

Я бачу, чому моя пропозиція не правильна. Спробуйте (l+['.']).pop(0)замість цього, але якщо це не працює, ви можете зберегти 4 байти, використовуючи l andзамість len(l)and.
nyuszika7h

(l+['.']).pop(0)не видаляє елементи, lтому друкується лише перший символ, але lумова працює :)
avall

1

C # (Visual C # Interactive Compiler) , 122 байти

var n=ReadLine();int k=0;foreach(var z in In.ReadToEnd())Write(z>33?(n+new string('.',999))[k++]:z);Write(n.Substring(k));

Спробуйте в Інтернеті!


Через брак конкретики та інших відповідей на це, ймовірно, ви можете "\n"+піти на додавання зайвих символів до того ж рядка
Veskah

0

05AB1E , 18 17 15 байт

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

Приймає код як перший вхід, шаблон як другий (з 0замість #).

Спробуйте в Інтернеті чи перевірте всі тестові випадки .

18 15 байт альтернативно, приймаючи введення у зворотному порядку:

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

Спробуйте в Інтернеті .

Пояснення:

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.