1
0
mirror of https://github.com/rudollee/TheLoopCodingTest.git synced 2025-06-07 07:56:08 +00:00
2018-05-03 03:59:26 +09:00

145 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UnicodeAndPermutation
{
public partial class Form1 : Form
{
private List<string> Words = new List<string>();
public Form1()
{
InitializeComponent();
txtWord.Focus();
}
#region Show Permuted real words
private async void ShowRealwords()
{
Words.Clear();
Permute(txtWord.Text.ToCharArray());
var wordFiltered = new List<string>();
foreach (var word in Words)
{
var json = await GetWordsFromDic(word);
if (json.Length - word.Length > 100)
{
wordFiltered.Add(word);
}
}
if (wordFiltered.Any())
{
ListboxWords.DataSource = wordFiltered;
}
}
#endregion
#region Sum Unicode Numbers
/// <summary>
/// 받은 string의 각 character들의 Unicode 값을 구하여 합산함
/// </summary>
/// <param name="word"></param>
private void SumUnicodeNumbers(string word)
{
int n = 0;
foreach (var c in word)
{
n += (int)c;
}
lblSum.Text = n.ToString();
}
#endregion
#region Permutation
/// <summary>
/// 1. 길이가 할당되지 않은 경우, 단어의 길이를 계산
/// 2. 새롭게 조합된 string을 collection에 추가
/// 3. 재귀적으로 Permute 함수를 호출하여 새로운 조합을 찾아냄
/// </summary>
/// <param name="chars"></param>
/// <param name="k"></param>
/// <param name="length"></param>
private void Permute(char[] chars, int k = 0, int length = -1)
{
if (length == -1)
{
length = chars.Length;
}
if (k == length)
{
Words.Add(new string(chars));
Words = Words.Distinct().ToList();
return;
}
for (int i = k; i < length; i++)
{
Swap(ref chars[k], ref chars[i]);
Permute(chars, k + 1, length);
Swap(ref chars[k], ref chars[i]);
}
}
/// <summary>
/// XOR Opertation을 이용하여 두 character를 치환
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
private void Swap(ref char a, ref char b)
{
if (a == b) return;
a ^= b;
b ^= a;
a ^= b;
}
#endregion
#region Get word information via open api
/// <summary>
/// https://glosbe.com/gapi/translate?from=eng&dest=eng&format=json&pretty=false&phrase= ?
/// 비동기적으로 단어의 뜻을 json 파일로 받아서 return
/// </summary>
/// <param name="word"></param>
/// <returns>Json format</returns>
private async Task<string> GetWordsFromDic(string word)
{
using (var client = new WebClient())
{
var uri = new Uri($"https://glosbe.com/gapi/translate?from=eng&dest=eng&format=json&pretty=false&phrase={word}");
return await client.DownloadStringTaskAsync(uri);
}
}
#endregion
#region Events
private void buttonPorcess_Click(object sender, EventArgs e)
{
SumUnicodeNumbers(txtWord.Text);
ShowRealwords();
}
private void txtWord_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyData)
{
case Keys.Enter:
SumUnicodeNumbers(txtWord.Text);
ShowRealwords();
break;
}
}
#endregion
}
}