টারমোর আসকি মুদ্রণের ভাষা, 46 বাইট। (অ-প্রতিদ্বন্দ্বী)
1 /\| /_/\|/__\_\2 \__|/ 0n{n-a-1{~}1a{2#1}$}
কেবল সিজেমের মতো অদ্ভুত প্রোগ্রামিং ভাষাগুলির দিকে তাকিয়ে এটি আমাকে কিছুটা জটিল করে তোলে, অপ্রাকৃত এবং ক্রিপ্টিক ভাষা কী হতে পারে, আমি "সাহস করে সেখানে যেতে চেয়েছিলাম যেখানে কোনও মানুষ আগে যায়নি" এবং নিজের ভাষা আবিষ্কার করতে চেয়েছিল। ফলস্বরূপ আমি ascii নিদর্শন মুদ্রণের জন্য আমার নিজস্ব ভাষা তৈরি করেছি।
প্রাথমিক ধারণাটি হ'ল আপনি প্রথমে প্যাটেন এবং তারপরে মুদ্রণ - একই ধরণের অক্ষর '1' বা '2' বা যে কোনও সংখ্যার ব্যবহার করে সংজ্ঞায়িত করতে পারেন - আপনি নিজের মুদ্রণ প্যাটার্নটি সংজ্ঞায়িত করতে পারেন।
একবার প্যাটার্ন সংজ্ঞায়িত হয়ে গেলে (সংখ্যা থেকে শেষ অবধি শুরু হয়) - পরবর্তী সংখ্যাগুলি প্যাটার্ন প্রিন্টিং কার্যকর করবে।
উদাহরণ স্বরূপ
1 /\| /_/\|/__\_\01
এর মতো ফলাফল:
/\
/_/\
/__\_\
প্যাটার্ন 1 সংজ্ঞায়িত করবে এবং এরপরে এটি মুদ্রণ করবে। প্যাটার্নটি '|' দিয়ে আলাদা করে সমস্ত কিছু সংজ্ঞায়িত করা হয় অক্ষর। 0 শেষে - প্যাটার্ন সমাপ্তির মতো কাজ করে।
'$' এর মতো বিশেষ অক্ষরগুলি লাইন-ফিড হিসাবে সংরক্ষিত থাকে এবং '~' নির্দিষ্ট প্যাটার্নের ব্যবধান - অর্ধেকের জন্য সংরক্ষিত থাকে।
1 /\| /_/\|/__\_\01$~11$~1~11
এই পাঠ্য আউটপুট দেয়:
/\
/_/\
/__\_\
/\
/_/\
/__\_\
/\
/_/\
/__\_\
এরপরে লুপগুলি যায়। এটির জন্য সহজেই দৃশ্যমান হওয়া দরকার - সুতরাং আমি for-loops এর জন্য} rac বন্ধনীগুলি ধরে রেখেছি, তবে ভেরিয়েবলের নামগুলি স্বয়ংক্রিয় নামযুক্ত - সুতরাং প্রথম বন্ধনীটি 'a' ভেরিয়েবল, দ্বিতীয় 'বি' এবং আরও কিছু ব্যবহার করবে। Iteration সর্বদা 0 থেকে নির্দিষ্ট সংখ্যায় চলে যাবে - এবং that rac বন্ধনীগুলির আগে এই সংখ্যাটি সংজ্ঞায়িত করা হয়।
'এন' পুরো ফাংশন ইনপুট জন্য সংরক্ষিত পরিবর্তনশীল।
সুতরাং কোড:
1 /\| /_/\|/__\_\0n{1$}
আউটপুটস (এন == 4 সহ):
/\
/_/\
/__\_\
/\
/_/\
/__\_\
/\
/_/\
/__\_\
/\
/_/\
/__\_\
এবং '#' ট্রিম লিড হোয়াইটস্পেসের জন্য বিশেষ সংশোধক।
এবং শেষ পর্যন্ত সম্পূর্ণ সমাধান:
DrawPatterns.cs:
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.CSharp;
class DrawPatterns
{
//Command line parameters - for example like this: "1 /\| /_/\|/__\_\2 \__|/ 0n{n-a-1{~}1a{2#1}$}" 3
static Dictionary<char, String[]> patterns = new Dictionary<char,string[]>();
static string Tabs(int n)
{
if( n < 0 ) n = 0;
String r = "";
for( int i = 0; i < n ; i++ )
r += " ";
return r;
}
static int[] left = new int[10];
static int top = Console.CursorTop;
static int lastTop = Console.CursorTop;
static public void DoPrint(char c, char modifier = ' ')
{
if (c == '$')
{
for (int i = 0; i < left.Length; i++)
left[i] = 0;
top = lastTop + 1;
return;
}
if (!patterns.ContainsKey(c))
return;
if (modifier == '½' || modifier == '~')
{
int maxSize = patterns[c].Select(x => x.Length).Max();
for( int i = 0; i < left.Length; i++ )
left[i] += maxSize / 2;
return;
}
int iLine = 0;
foreach (var l in patterns[c])
{
Console.SetCursorPosition(left[iLine], top + iLine);
if( top + iLine > lastTop )
lastTop = top + iLine;
String s = l;
if (modifier == '#')
s = s.TrimStart(' ');
Console.WriteLine(s);
left[iLine] += s.Length;
iLine++;
}
}
static void Main(string[] _args)
{
List<String> args = _args.ToList();
String todo = "";
String code = "";
char nextVar = 'a';
String lf = "\r\n";
int align = 1;
char lastModifier = ' ';
int nextArg = 1;
Dictionary<String, String> argValues = new Dictionary<string,string>();
bool bDebug = false;
if (args.Count != 0 && args[0].ToLower() == "-d")
{
bDebug = true;
args.RemoveAt(0);
}
if (args.Count == 0)
{
Console.WriteLine("Usage: DrawPatterns.cs [options] \"script\" <arguments to script>");
Console.WriteLine("[options] allowed:");
Console.WriteLine("-d - debug");
return;
}
String prog = args[0];
for( int i = 0; i < prog.Length; i++ )
{
char c = prog[i];
// Define pattern.
if (c >= '0' && c <= '9' && !patterns.ContainsKey(c))
{
String p = Regex.Match(prog.Substring(i + 1), "[^0-9]*").Groups[0].Value;
patterns[c] = p.Split('|');
i += p.Length;
if( prog[i + 1] == '0' ) i++;
continue;
}
String procRemain = prog.Substring(i);
// modifier specified, but pattern number is not provided - use first pattern.
if( lastModifier != ' ' && ( c < '0' || c > '9' ) )
{
code += Tabs(align);
code += "print('1' , '" + lastModifier + "');" + lf;
lastModifier = ' ';
}
switch ( c )
{
case '{':
code += Tabs(align);
code += "for ( int " + nextVar + " = 0; " + nextVar + " < " + todo + " ; " + nextVar + "++ )" + lf;
// Check for all variable names if they can be used in program.
foreach ( var m in Regex.Matches(todo, "[a-zA-Z_][a-zA-Z0-9_]*", RegexOptions.Singleline) )
{
String varName = m.ToString();
if( varName.Length == 1 && varName[0] <= nextVar )
// Already declared as a loop.
continue;
if( argValues.ContainsKey(varName ) )
continue;
if( nextArg >= args.Count )
{
Console.WriteLine("Insufficient parameters provided to script - argument '" + varName + "' value is needed");
return;
}
argValues[varName] = args[nextArg];
nextArg++;
}
code += Tabs(align);
code += "{" + lf;
nextVar++;
todo = "";
align++;
break;
case '}':
align--;
code += Tabs(align);
code += "}" + lf;
break;
default:
if (((c >= '0' && c <= '9') || c == '<' || c == '$') && todo == "")
{
code += Tabs(align);
code += "print('" + c + "' , '" + lastModifier + "');" + lf;
lastModifier = ' ';
continue;
}
if (c == '½' || c == '~' || c == '#')
{
lastModifier = c;
continue;
}
if( c == '\r' || c == '\n' )
continue;
todo += c;
break;
}
} //for
String code2 = "";
code2 += "using System;" + lf;
code2 += "public class ExecClass { static void Exec( Action<char, char> print";
object[] invokeArgs = new object[ argValues.Count+1];
invokeArgs[0] = new Action<char, char>(DoPrint);
int iValueIndex = 1;
foreach ( var kv in argValues )
{
code2 += ",";
code2 += "int " + kv.Key;
invokeArgs[iValueIndex] = Int32.Parse(kv.Value);
iValueIndex++;
}
code2 += ") {" + lf;
code2 += code;
code2 += "} };";
if( bDebug )
{
int line = 1;
String lineNumberedCode =Regex.Replace(code2, "^(.*)$",
delegate(Match m) { return (line++).ToString("d2") + ": " + m.Value; },
RegexOptions.Multiline
);
Console.WriteLine(lineNumberedCode);
Console.WriteLine();
Console.WriteLine();
}
left[0] = Console.CursorLeft;
for( int i = 1; i < left.Length; i++ )
left[i] = left[0];
top = Console.CursorTop;
try
{
var compileResult = new CSharpCodeProvider().CompileAssemblyFromSource( new CompilerParameters() { GenerateExecutable = false, GenerateInMemory = true }, code2);
if (compileResult.Errors.HasErrors)
{
foreach (CompilerError ce in compileResult.Errors)
{
if (ce.IsWarning) continue;
Console.WriteLine("{0}({1},{2}: error {3}: {4}", ce.FileName, ce.Line, ce.Column, ce.ErrorNumber, ce.ErrorText);
}
return;
}
var method = compileResult.CompiledAssembly.GetType("ExecClass").GetMethod("Exec", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
method.Invoke(null, invokeArgs);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.SetCursorPosition(1, lastTop);
Console.WriteLine();
Console.WriteLine();
} //Main
}
কমান্ড লাইনের যুক্তিগুলির সাথে: -d "1 / \ | / _ / \ | / ___ \ 2 __ | / 0n {না-1 {½} 1a {2 # 1} $}" 3
এটির ফলস্বরূপ:
01: using System;
02: public class ExecClass { static void Exec( Action<char, char> print,int n) {
03: for ( int a = 0; a < n ; a++ )
04: {
05: for ( int b = 0; b < n-a-1 ; b++ )
06: {
07: print('1' , '~');
08: }
09: print('1' , ' ');
10: for ( int c = 0; c < a ; c++ )
11: {
12: print('2' , ' ');
13: print('1' , '#');
14: }
15: print('$' , ' ');
16: }
17: } };
/\
/_/\
/__\_\
/\ \__/\
/_/\/ /_/\
/__\_\/__\_\
/\ \__/\ \__/\
/_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\