การ์ดตัวอักษรที่เหมาะสมสำหรับการสะกดคำ


15

สมมติว่าคุณมีรายการคำและคุณต้องการที่จะใช้การ์ดตัวอักษรเพื่อสะกดแต่ละคำ ตัวอย่างเช่นหากต้องการสะกดคำว่าcatคุณจะต้องใช้ไพ่สามใบที่มีป้ายกำกับ C, A, T

สมมติว่าการ์ดแต่ละใบเป็นสองด้านให้ส่งโปรแกรมเพื่อกำหนดจำนวนขั้นต่ำของการ์ดที่สามารถใช้สะกดคำทั้งรายการ

อินพุตเป็นรายการคำสามารถเป็นไฟล์บรรทัดคำสั่งอะไรก็ได้ ผลลัพธ์คือรายการของการ์ดที่ฟอร์แมตและจัดเรียงตามที่เห็นสมควรโดยมีความชัดเจนว่าการ์ดถูกระบุว่าอย่างไร

กรณีไม่สำคัญ: กอล์ฟ, กอล์ฟและ GOLF เทียบเท่า

คำแนะนำบางอย่าง:

  • จำนวนของการ์ดต้องไม่น้อยกว่าความยาวของคำที่ยาวที่สุด
  • มันไม่มีเหตุผลที่การ์ดจะมีตัวอักษรเหมือนกันทั้งสองด้าน
  • ในขณะที่ตัวพิมพ์เล็กไม่สำคัญแนะนำให้ใช้ตัวพิมพ์เล็กเพื่อใช้ประโยชน์จากความสมมาตรบางอย่าง

ตัวอย่างเหล่านี้ใช้ประโยชน์จากความสมมาตรบางอย่าง :

อินพุต: ben, บึง, บั๊ก, den, do, doe, สุนัข, เนื่องจาก, ขุด, Ed, จบ, gob, พระเจ้า, เน็ด, บทกวี, บทกวี, ปากกา, Poe, ปั๊ก

เอาต์พุต: b / d, e / g, o / n

อินพุต: และ, ape, เป็น, เป็น, เตียง, หน่อ, หนาม, แดน, Deb, dub, หู, เอ็ด, ยุค, งีบหลับ, แพน, ถั่ว, ผับ, Rae, วิ่ง, ถู

เอาต์พุต: a / b, d / r, e / n

ทำให้การประกวดเป็นที่นิยมความสวยงามของโค้ดประสิทธิภาพในการใช้งานและความฉลาด (รวมถึงกฎการดัดและช่องโหว่) มีความสำคัญ!

เพิ่มเติม : บางคนถามเกี่ยวกับ symmetries "อนุญาต" ไม่ว่าจะเป็นแบบอักษรพิเศษสามารถใช้และว่าบัตรสามารถพับ

สมมาตรที่อนุญาตคือตัวอักษรใด ๆ ที่มีลักษณะคล้ายกันหลังจากการหมุน 0, 90, 180 หรือ 270 องศา ซึ่งรวมถึง b / q, d / p และ n / u ฉันก็จะพูดว่า M / W, Z / N และแน่นอนฉัน / l (เมืองหลวงฉันตัวพิมพ์เล็ก L) ฉันอาจเป็นรอยขีดข่วนพื้นผิวดังนั้นหากมีคนอื่นที่คุณไม่แน่ใจให้ถาม

เพื่อให้ง่ายขึ้นโปรด จำกัด แบบอักษรมาตรฐาน sans-serif ที่ใช้ใน SE

เท่าที่พับได้ในขณะที่คุณสามารถทำการทดแทนที่น่าอัศจรรย์เช่น B สามารถ D, E, F, I, P หรือ R และอาจ C หรือ L ถ้าคุณพับอย่างสร้างสรรค์จริงๆฉันคิดว่ามันโค้งมากเกินไป !

ฉันพบปัญหานี้ขณะเล่นกับการ์ดที่คล้ายกันกับลูก ๆ ของฉัน ฉันสังเกตเห็นว่ามันง่ายที่จะเกิดขึ้นกับไพ่หน้าเดียวกับวิธีที่ยากที่จะเกิดขึ้นกับการ์ดสองด้าน

นอกจากนี้ : ได้มอบรางวัลให้กับคำตอบที่ได้รับความนิยมมากที่สุด หากมีการเสมอกันจะมอบรางวัลให้กับผู้ที่ส่งมาก่อน

คำแนะนำอื่น:

  • การแก้ปัญหาด้านเดียวจะช่วยให้คุณทราบจำนวนขั้นต่ำของการ์ดที่ต้องการ (เช่น 20 การ์ดด้านเดียวแปลเป็นการ์ดหน้าคู่อย่างน้อย 10 ใบ)

เพิ่มเติม : โอ้ฉันยุ่งและลืมเกี่ยวกับเงินรางวัลที่หมดอายุ มันจะจบลงที่ไม่มีใครเพราะคำตอบเดียวที่ถูกส่งมาก่อนที่เงินรางวัลจะเริ่มขึ้น! ขอโทษสำหรับเรื่องนั้น.


3
เพียงชี้แจงสิ่งที่ได้รับอนุญาต? เป็นเพียงคู่สมมาตรn/u, d/p? สิ่งที่เกี่ยวกับb/qและm/w? และถ้าฉันพับPไพ่สองใบครึ่งบนจะกลายเป็นDอย่างไร
Sp3000

3
1. เป็นรายการของพวกเขาได้รับการอนุมัติ "สมมาตร" ฉันคิดว่ามันอาจจะแตกต่างกันไปขึ้นอยู่กับตัวอักษรซึ่งเป็นหลุมวงที่มีศักยภาพ (ใช้ตัวอักษรที่ตัวละครที่มีทั้งหมดเดียวกันเช่นบัตรมักจะเท่ากับ/หรืออะไรทำนองนั้น) 2. "กรณีไม่สำคัญ" ดังนั้น "N" จึงสามารถแทนด้วย "u" ได้?
David Rogers

ฉันคิดว่าคุณกำลังทำคำถามของคุณเกี่ยวกับความอยุติธรรมด้วยการทำให้การประกวดเป็นที่นิยม คุณไม่ได้รับความคิดสร้างสรรค์โดยการบอกให้คนอื่นมีความคิดสร้างสรรค์คุณจะได้รับมันโดยให้ความท้าทายอย่างหนักกับพวกเขาและให้พวกเขาบีบทุกอย่างที่ทำได้
xnor

@ sp3000 - b / q แน่นอน เกี่ยวกับคำถามอื่น ๆ ของคุณฉันจะอธิบายกฎ

1
การมีสิ่งนี้เป็นการประกวดความนิยม (ไม่พูดถึงความโปรดปรานด้วย) ก็ไม่ถูกต้องนัก มีผู้รับประกันอะไรบ้างที่คำตอบนั้นเหมาะสมที่สุด เกิดอะไรขึ้นถ้าคำตอบเดียวให้ผลที่ไม่ดี แต่ด้วยเหตุผลบางอย่างมีคะแนนสูงสุด ..
เครื่องมือเพิ่มประสิทธิภาพ

คำตอบ:


5

C # - CardChooser

สรุป

แอปพลิเคชันนี้ใช้วิธีการเดรัจฉานเพื่อพยายามแก้ปัญหาแต่ละรายการ ก่อนอื่นฉันสร้างรายการของการ์ดที่เป็นไปได้ที่จะเลือกจากนั้นฉันกำหนดว่าแบบไหนดีที่สุด (ลบตัวอักษรส่วนใหญ่ + คำที่สั้นที่สุดให้สั้นที่สุด) เพิ่มสิ่งนี้ลงในรายการผลลัพธ์และดำเนินการต่อด้วยกระบวนการนี้จนกว่าฉันจะเลือกการ์ดที่มีศักยภาพเพียงพอ เพื่อลบทุกคำในรายการจากนั้นฉัน rematch การ์ดเหล่านั้นให้แต่ละคำและพิมพ์ผลลัพธ์

หากคุณต้องการดูรหัสนี้แบบ จำกัด มากขึ้นโดยไม่ต้องดาวน์โหลดและสร้างแอปพลิเคชั่นฟอร์ม windows ที่จัดมาให้คุณสามารถใช้ลิงค์ที่ให้ไว้เพื่อเรียกใช้โปรแกรมของฉันในชุดข้อมูลขนาดเล็กโปรดทราบว่านี่เป็นเวอร์ชั่นของแอปพลิเคชันคอนโซล การ์ดจะไม่หมุน: http://ideone.com/fork/VD1gJF

ประวัติการแก้ไข

ปัจจุบัน - เพิ่มการเพิ่มประสิทธิภาพผลลัพธ์ที่ดีกว่าที่แนะนำโดย @Zgarb

อัปเดต 3 - การล้างรหัสเพิ่มเติมแก้ไขข้อผิดพลาดเพิ่มเติมได้ผลลัพธ์ที่ดีขึ้น

อัปเดต 2 - แบบฟอร์ม Windows เอาต์พุต verbose เพิ่มเติม

อัปเดต 1 - รองรับใหม่ / ดีกว่าสำหรับตัวละครสมมาตร

ต้นฉบับ - แอปพลิเคชันคอนโซล

ตัวอย่าง

acr, aft, ain, sll, win, พูด, พูดอย่างรวดเร็ว, มหากาพย์ เอาท์พุท 0

นะจะด้วยเคยชินจะ, wouldve, wouldnt ยังคุณคุณคุณจะ เอาท์พุท 1

aaaa, bbbb, cccc
เอาท์พุท 2

รหัส

ฉันยังคงต้องรวมสิ่งนี้ไว้ในโครงการขนาดใหญ่หนึ่งเดียวกับรหัส ConsoleApp และ WindowsForms ทั้งหมดที่ใช้คลาสและวิธีการเดียวกันร่วมกันจากนั้นแยกพื้นที่ต่าง ๆ ในวิธี RunButton_Click เพื่อให้ฉันสามารถเขียนหน่วยรอบ ๆ พวกเขาได้ทุกเวลา ฉันจะสำหรับตอนนี้นี่คือสิ่งที่ฉันมี:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CardChooserForms
{
    public partial class CardChooser : Form
    {
        private class Solution : IEquatable<Solution>
        {
            public List<string> Cards { get; set; }
            public List<string> Remaining { get; set; }

            public int RemainingScore
            {
                get
                {
                    return this.Remaining.Sum(b => b.ToCharArray().Count());
                }
            }

            public bool Equals(Solution other)
            {
                return new string(Cards.OrderBy(a => a).SelectMany(a => a).ToArray()) == new string(other.Cards.OrderBy(a => a).SelectMany(a => a).ToArray());
            }

            public override int GetHashCode()
            {
                return (new string(Cards.OrderBy(a => a).SelectMany(a => a).ToArray())).GetHashCode();
            }
        }
        private class Symmetry
        {
            public char Value { get; set; }
            public Int16 RotationDifference { get; set; }
        }

        /// <summary>
        /// This is where Symmetries are stored, right now it only has support for pairs(two values per array)
        /// </summary>
        private static Symmetry[][] _rotatableCharacters = new Symmetry[][] {                 
                new Symmetry[] { new Symmetry {Value = 'Z'}, new Symmetry {Value = 'N', RotationDifference = 90}}, 
                new Symmetry[] { new Symmetry {Value = 'd'}, new Symmetry {Value = 'p', RotationDifference = 180 }}, 
                new Symmetry[] { new Symmetry {Value = 'u'}, new Symmetry {Value = 'n', RotationDifference = 180 }}, 
                new Symmetry[] { new Symmetry {Value = 'm'}, new Symmetry {Value = 'w', RotationDifference = 180 }}, 
                new Symmetry[] { new Symmetry {Value = 'b'}, new Symmetry {Value = 'q', RotationDifference = 180 }}, 
                new Symmetry[] { new Symmetry {Value = 'l'}, new Symmetry {Value = 'I', RotationDifference = 0}},                 
            };

        //These all control the output settings
        private readonly static int _defualtSpacing = 25;
        private readonly static int _defualtFontSize = 8;
        private readonly static Font _defualtFont = new Font("Microsoft Sans Serif", _defualtFontSize);
        private readonly static Brush _defualtBackgroundColor = Brushes.Beige;
        private readonly static Brush _defualtForegroundColor = Brushes.Black;


        public CardChooser()
        {
            InitializeComponent();
        }

        private void RunButton_Click(object sender, EventArgs e)
        {            
            #region Input Parsing
            //Get input                         
            string input = InputRichTextBox.Text;

            if (!input.Contains(","))
                throw new ArgumentException("Input must contain more than one value and must be seprated by commas.");

            //Parse input
            var inputLowercasedTrimedTransformed = input.Split(',').Select(a => a.ToLowerInvariant().Trim()).ToArray();
            var inputSplitTrimIndex = input.Split(',').Select(a => a.Trim()).ToArray().Select((a, index) => new { value = a, index }).ToArray();
            #endregion Input Parsing

            #region Card Formation
            var inputCharParsed = inputLowercasedTrimedTransformed.Select(a => a.ToCharArray()).ToArray();
            var possibleCards = GetAllCasesTwoLengthArrayElements(
                UniqueBiDirection(
                //Get unique characters
                    inputCharParsed
                    .SelectMany(a => a)
                    .Distinct()
                    .Select(a => new
                    {
                        Character = a,
                        PossibleCharacters = inputCharParsed.SelectMany(b => b).Where(b => b != a).ToList()
                    })
                //Now get distinct cards(ie NB == BN, NB != NE)
                    .SelectMany(a => a.PossibleCharacters.Select(b => new string(new char[] { a.Character, b })).ToArray()).ToArray()
                    ).ToArray()
                ).ToArray();

            //Now get every possible character each card can eliminate
            var possibleCharsFromCards = GetAllPossibleCharsFromACards(possibleCards).ToArray();

            //Now set up some possibilities that contain only one card
            var possibleCardCombinations = possibleCards.Select((a, index) => new Solution
            {
                Cards = new List<string> { a },
                //Use the index of each card to reference the possible characters it can remove, then remove them per card to form a initial list of cards
                Remaining = inputLowercasedTrimedTransformed.Select(b => b.RemoveFirstInCharArr(possibleCharsFromCards[index].ToLowerInvariant().ToCharArray())).ToList()
            })
            //Take the best scoring card, discard the rest
            .OrderBy(a => a.RemainingScore)
            .ThenBy(a => a.Remaining.Max(b => b.Length))
            .Take(1).ToList();
            #endregion Card Formation

            #region Card Selection
            //Find best combination by iteratively trying every combination + 1 more card, and choose the lowest scoring one 
            while (!possibleCardCombinations.Any(a => a.Remaining.Sum(b => b.ToCharArray().Count()) == 0) && possibleCardCombinations.First().Cards.Count() < possibleCards.Count())
            {
                //Clear the list each iteration(as you can assume the last generations didn't work
                var newPossibilites = new List<Solution>();
                var currentRoundCardCombinations = possibleCardCombinations.ToArray();
                possibleCardCombinations.Clear();

                foreach (var trySolution in currentRoundCardCombinations)
                    foreach (var card in possibleCards.Select((a, index) => new { value = a, index }).Where(a => !trySolution.Cards.Contains(a.value)).ToArray())
                    {
                        var newSolution = new Solution();
                        newSolution.Cards = trySolution.Cards.ToList();
                        newSolution.Cards.Add(card.value);
                        newSolution.Remaining = trySolution.Remaining.ToList().Select(a => a.RemoveFirstInCharArr(possibleCharsFromCards[card.index].ToLowerInvariant().ToCharArray())).ToList();
                        newPossibilites.Add(newSolution);
                    }

                //Choose the highest scoring card
                possibleCardCombinations = newPossibilites
                    .OrderBy(a => a.RemainingScore)
                    .ThenBy(a => a.Remaining.Max(b => b.Length))
                    .Distinct().Take(1).ToList();
            }
            var finalCardSet = possibleCardCombinations.First().Cards.ToArray();
            #endregion Card Selection

            #region Output
            using (var image = new Bitmap(500, inputSplitTrimIndex.Count() * _defualtSpacing + finalCardSet.Count() * (_defualtFontSize / 2) + _defualtSpacing))
            using (Graphics graphic = Graphics.FromImage(image))
            {
                //Background
                graphic.FillRectangle(_defualtBackgroundColor, 0, 0, image.Width, image.Height);

                //Header                
                graphic.DrawString("Total Number of Cards Required: " + finalCardSet.Count(), _defualtFont, _defualtForegroundColor, new PointF(0, 0));
                graphic.DrawString(
                    "Cards: " + String.Join(", ", finalCardSet.Select(a => a[0] + "/" + a[1])),
                    _defualtFont,
                    _defualtForegroundColor,
                    new RectangleF(0, _defualtSpacing, image.Width - _defualtSpacing, finalCardSet.Count() * 5));

                //Results
                foreach (var element in inputSplitTrimIndex)
                {
                    //Paint the word
                    graphic.DrawString(element.value + " -> ", _defualtFont, _defualtForegroundColor, new PointF(0, element.index * _defualtSpacing + finalCardSet.Count() * (_defualtFontSize / 2) + _defualtSpacing));

                    //Now go through each character, determining the matching card, and wether that card has to be flipped
                    foreach (var card in GetOrderedCardsRequired(inputLowercasedTrimedTransformed[element.index].ToLowerInvariant(), finalCardSet.ToArray()).ToArray().Select((a, index) => new { value = a, index }))
                        using (var tempGraphic = Graphics.FromImage(image))
                        {
                            //For cards that need to flip
                            if (Char.ToUpperInvariant(element.value[card.index]) != Char.ToUpperInvariant(card.value[0]) &&
                                Char.ToUpperInvariant(element.value[card.index]) != Char.ToUpperInvariant(card.value[1]))
                            {
                                //TODO this is hacky and needs to be rethought
                                var rotateAmount = _rotatableCharacters
                                    .OrderByDescending(a => a.Any(b => b.Value == Char.ToLowerInvariant(element.value[card.index])))
                                    .First(a => a.Any(b => Char.ToUpperInvariant(b.Value) == Char.ToUpperInvariant(element.value[card.index])))
                                    [1].RotationDifference;

                                //Rotate
                                tempGraphic.TranslateTransform(
                                    _defualtSpacing * (_defualtFontSize / 2) + card.index * _defualtSpacing + (rotateAmount == 90 ? 0 : _defualtSpacing / 2) + (rotateAmount == 180 ? -(_defualtSpacing / 4) : 0),
                                    finalCardSet.Count() * (_defualtFontSize / 2) + _defualtSpacing + element.index * _defualtSpacing + (rotateAmount == 180 ? 0 : _defualtSpacing / 2));
                                tempGraphic.RotateTransform(rotateAmount);

                                //Print string
                                tempGraphic.DrawString(
                                String.Join("/", card.value.ToCharArray().Select(a => new string(new char[] { a })).ToArray()),
                                _defualtFont,
                                Brushes.Black,
                                new RectangleF(-(_defualtSpacing / 2), -(_defualtSpacing / 2), _defualtSpacing, _defualtSpacing));
                            }
                            else
                                tempGraphic.DrawString(
                                     String.Join("/", card.value.ToCharArray().Select(a => new string(new char[] { a })).ToArray()),
                                     _defualtFont,
                                     _defualtForegroundColor,
                                     new RectangleF(
                                         _defualtSpacing * (_defualtFontSize / 2) + card.index * _defualtSpacing,
                                         finalCardSet.Count() * (_defualtFontSize / 2) + _defualtSpacing + element.index * _defualtSpacing,
                                         _defualtSpacing, _defualtSpacing));
                        }
                }

                OutputPictureBox.Image = new Bitmap(image);
            }
            #endregion Output
        }

        private IEnumerable<string> GetAllPossibleCharsFromACards(string[] cards)
        {
            return cards.Select(a => 
                new string(a.ToCharArray().Concat(_rotatableCharacters
                                    .Where(b => b.Select(c => c.Value).Intersect(a.ToCharArray()).Count() > 0)
                                    .SelectMany(b => b.Select(c => c.Value))
                                    .Distinct().ToArray()).Distinct().ToArray()));
        }

        private IEnumerable<string> GetOrderedCardsRequired(string word, string[] cards)
        {
            var solution = new List<string>();
            var tempCards = GetAllPossibleCharsFromACards(cards).Select((a, index) => new { value = a, index }).ToList();

            foreach (var letter in word.ToCharArray())
            {
                //TODO this still could theoretically fail I think                
                var card = tempCards
                    //Order by the least number of characters match
                    .OrderBy(a => word.ToLowerInvariant().Intersect(a.value.ToLowerInvariant()).Count())
                    .ThenByDescending(a => tempCards.Sum(b => b.value.ToLowerInvariant().Intersect(a.value.ToLowerInvariant()).Count()))
                    //Then take the least useful card for the other parts of the word
                    .First(a => a.value.ToLowerInvariant().Contains(Char.ToLowerInvariant(letter)));
                solution.Add(cards[card.index]);
                tempCards.Remove(card);
            }
            return solution;
        }

        private static IEnumerable<string> UniqueBiDirection(string[] input)
        {
            var results = new List<string>();
            foreach (var element in input)
                if (!results.Any(a => a == new string(element.ToCharArray().Reverse().ToArray()) || a == element))
                    results.Add(element);
            return results;
        }

        private static IEnumerable<string> GetAllCasesTwoLengthArrayElements(string[] input)
        {
            if (input.Any(a => a.Length != 2))
                throw new ArgumentException("This method is only for arrays with two characters");

            List<string> output = input.ToList();
            foreach (var element in input)
            {
                output.Add(new string(new char[] { Char.ToUpperInvariant(element[0]), Char.ToUpperInvariant(element[1]) }));
                output.Add(new string(new char[] { element[0], Char.ToUpperInvariant(element[1]) }));
                output.Add(new string(new char[] { Char.ToUpperInvariant(element[0]), element[1] }));
            }
            return output;
        }

        private void SaveButton_Click(object sender, EventArgs e)
        {
            using (var image = new Bitmap(OutputPictureBox.Image))
                image.Save(Directory.GetCurrentDirectory() + "Output.png", ImageFormat.Png);
        }
    }

    public static class StringExtensions
    {
        public static string RemoveFirstInCharArr(this string source, char[] values)
        {
            var tempSource = source.ToUpperInvariant();
            foreach (var value in values)
            {
                int index = tempSource.IndexOf(Char.ToUpperInvariant(value));
                if (index >= 0) return source.Remove(index, 1);
            }
            return source;
        }        
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CardChooserForms
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new CardChooser());
        }
    }
}


namespace CardChooserForms
{
    partial class CardChooser
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.InputRichTextBox = new System.Windows.Forms.RichTextBox();
            this.EnterInputLabel = new System.Windows.Forms.Label();
            this.RunButton = new System.Windows.Forms.Button();
            this.OutputPictureBox = new System.Windows.Forms.PictureBox();
            this.OutputPanel = new System.Windows.Forms.Panel();
            this.SaveButton = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.OutputPictureBox)).BeginInit();
            this.OutputPanel.SuspendLayout();
            this.SuspendLayout();
            // 
            // InputRichTextBox
            // 
            this.InputRichTextBox.Location = new System.Drawing.Point(60, 40);
            this.InputRichTextBox.Name = "InputRichTextBox";
            this.InputRichTextBox.Size = new System.Drawing.Size(400, 100);
            this.InputRichTextBox.TabIndex = 0;
            this.InputRichTextBox.Text = "";
            // 
            // EnterInputLabel
            // 
            this.EnterInputLabel.AutoSize = true;
            this.EnterInputLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.EnterInputLabel.Location = new System.Drawing.Point(57, 20);
            this.EnterInputLabel.Name = "EnterInputLabel";
            this.EnterInputLabel.Size = new System.Drawing.Size(81, 17);
            this.EnterInputLabel.TabIndex = 1;
            this.EnterInputLabel.Text = "Enter Input:";
            // 
            // RunButton
            // 
            this.RunButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.RunButton.Location = new System.Drawing.Point(60, 147);
            this.RunButton.Name = "RunButton";
            this.RunButton.Size = new System.Drawing.Size(180, 52);
            this.RunButton.TabIndex = 2;
            this.RunButton.Text = "Run";
            this.RunButton.UseVisualStyleBackColor = true;
            this.RunButton.Click += new System.EventHandler(this.RunButton_Click);
            // 
            // OutputPictureBox
            // 
            this.OutputPictureBox.Location = new System.Drawing.Point(3, 3);
            this.OutputPictureBox.Name = "OutputPictureBox";
            this.OutputPictureBox.Size = new System.Drawing.Size(500, 500);
            this.OutputPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
            this.OutputPictureBox.TabIndex = 3;
            this.OutputPictureBox.TabStop = false;
            // 
            // OutputPanel
            // 
            this.OutputPanel.AutoScroll = true;
            this.OutputPanel.Controls.Add(this.OutputPictureBox);
            this.OutputPanel.Location = new System.Drawing.Point(4, 205);
            this.OutputPanel.Name = "OutputPanel";
            this.OutputPanel.Size = new System.Drawing.Size(520, 520);
            this.OutputPanel.TabIndex = 4;
            // 
            // SaveButton
            // 
            this.SaveButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.SaveButton.Location = new System.Drawing.Point(280, 147);
            this.SaveButton.Name = "SaveButton";
            this.SaveButton.Size = new System.Drawing.Size(180, 52);
            this.SaveButton.TabIndex = 5;
            this.SaveButton.Text = "Save";
            this.SaveButton.UseVisualStyleBackColor = true;
            this.SaveButton.Click += new System.EventHandler(this.SaveButton_Click);
            // 
            // CardChooser
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(534, 737);
            this.Controls.Add(this.SaveButton);
            this.Controls.Add(this.RunButton);
            this.Controls.Add(this.EnterInputLabel);
            this.Controls.Add(this.InputRichTextBox);
            this.Controls.Add(this.OutputPanel);
            this.Name = "CardChooser";
            this.Text = "Card Chooser";
            ((System.ComponentModel.ISupportInitialize)(this.OutputPictureBox)).EndInit();
            this.OutputPanel.ResumeLayout(false);
            this.OutputPanel.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.RichTextBox InputRichTextBox;
        private System.Windows.Forms.Label EnterInputLabel;
        private System.Windows.Forms.Button RunButton;
        private System.Windows.Forms.PictureBox OutputPictureBox;
        private System.Windows.Forms.Panel OutputPanel;
        private System.Windows.Forms.Button SaveButton;
    }
}

1
คุณสะกด "อาจ" โดยไม่มีiการ์ดได้อย่างไร
Claudiu

"แน่นอนฉัน / l (เมืองหลวงฉัน, ตัวพิมพ์เล็ก L)" ดังนั้นตัวพิมพ์เล็กควรยืนสำหรับเมืองหลวง I.
David Rogers

โอ้ดูเหมือนว่าคุณควรระบุในผลลัพธ์
Claudiu

@Claudiu ใช่ฉันคิดเกี่ยวกับเรื่องนี้สักครู่จริง ๆ แล้วมาถึงคำถามที่สองที่ฉันถาม Yimin Rong และฉันคิดว่าเขาชี้แจงอย่างถูกต้องหากฉันส่งออก "l" ในการ์ดควรสรุปเช่นเดียวกับตัวอย่างที่มัน สามารถใช้ได้ทั้งบนกล่องใส่ I และล่าง l ซึ่งจะให้ผลลัพธ์ที่ไม่ตรงกับตัวเคสอย่างสมบูรณ์ แต่ฉันคิดว่าเป็น "ตกลง" เนื่องจากยังคงเป็นไปตามเงื่อนไขของคำถาม แต่ฉันเปิดอีกครั้ง เพื่อชี้แจงหากจำเป็นอาจจะในรุ่นที่ใหม่กว่าฉันสามารถส่งออกสตริงที่สร้างขึ้นผลกับตัวละครหมุนหรือสิ่งที่ ...
David Rogers

ฉันคิดว่ามีข้อผิดพลาด saidจดหมายฉบับสุดท้ายไม่ใช่ W หรือ p
ภูมิใจ haskeller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.