Pull to refresh

Все решения к задачке к Дню Программиста

Reading time 8 min
Views 1.5K

Я решил объединить все отправленные решения к задаче «С Днем Программиста» в одном топике. При появлении новых решений топик будет обновляться. За понравившиеся решения предлагаю кормить плюсиками авторов, а хабрачитателей награждать инвайтами.
Код на картинке, кстати, тоже решает эту задачу :)

Первым кодом был код на brainfuck'е от nobr, который не совсем решает задачу, но выводит требуемый вывод:
++++++++++++[>++>+++>++++>+++++>++++++>
+++++++>++++++++>+++++++++>++++++++++
<<<<<<<<<-]++++++++++++>>>>>>-.<<<<----.
>>>>>++++.>++.<+.>-.<<<<<<.>>>>>>+++.++.
---.<++.>+++.<------.>-----..----.>-----.
+.<<.<<<<<+.<<+.---.>>>>>>.<<<<-.>>>>>+++.
>+++++.<+.>-.<<<<<<.>>>>>>+++.++.---.<++.
>>--.<<------.>--..----.>+.+.<<.<<<<<+.
<<+++.---.>>>>>>.<<<<-.>>>>>+++.>+++++.<+.
>-.<<<<<<.>>>>>>+++.++.---.<++.>>--.<<------.
>--..----.>+.+.<<.<<<<<+.<<+++.---.>>-...
>>>>>>+++++.<++++.>-.<<<<<<.>>>>>>+++.++.---.
<++.>>--.<<------.>--..----.>+.+.<<.<<<<<+.
<<+++.---.>>-...>>>>>>+++++.<++++.<<<<<..
>>>>>>++.++.---.<++.>>--.<<------.<<<<<..
>>>>>>------.>+.+.<<.<<<<<+.<<+++.---.>>-...
>>>>>>+++++.<++++.<<<<<..>>>>>>++.<<<<<<.
>>>>>>-.<++.<<<<<.>>>>>------.<<<<<..
>>>>>>------.>-.+.<<.<<<<<+.
В теге source оказывается поддерживается и brainfuck

Вторым решением было уже полноценное решение от бывшего хабрачитателя m1el на perl в 120 символов из которых 38 было сама фраза-образец:
$a=<>;for(;;){$c=$s="";$s.=$a=~s/$_//?$c=$_:" "for split//,"Congratulations on a programmer`s day!";$c?print"$s\n":exit}


Третьим решением было решение impwx:
<?php
$src = 'ССС дддннннннеееееемммм ппппппрррррооооооггггггрррррааааааммммммммииииииссссссттттттаааааа!!!!!!';
$required = 'С днем программиста!';
$letters = array();

foreach(str_split($src) as $letter)
  $letters[$letter]++;
  
while(count($letters))
{
  $result = '';
  foreach(str_split($required) as $letter)
  {
    if($letters[$letter])
    {
      $result .= $letter;
      $letters[$letter]--;
      if($letters[$letter] == 0) unset($letters[$letter]);
    }
    else
      $result .= ' ';
  }
  echo $result . '<br />';
}


Следующим решением было от RiderSx
<?php
$entry = "ССС дддннннннеееееемммм ппппппрррррооооооггггггрррррааааааммммммммииииииссссссттттттаааааа!!!!!!";
$phrase = 'С днем программиста!';

$phrase_array = preg_split('/(?<!^)(?!$)/u', $phrase);
$global_letters_count = 0;
$letters_count = array();
foreach($phrase_array as $letter) {
	$count = substr_count($entry, $letter);
	if(!$letters_count[$letter]) {
		$letters_count[$letter] = $count;
		$global_letters_count += $count;
	}
}

while($global_letters_count) {
	$result = '';
	foreach($phrase_array as $v) {
		if($letters_count[$v]) {
			$result .= $v;
			$letters_count[$v]--;
			$global_letters_count--;
		} else {
			$result .= ' ';
		}
	}
	echo $result."<br/>\r\n";
}


Следующее решение было от Sartor, после «ненормализации» от Lertmind ставшее вот таким кратким:
# -*- coding: utf-8 -*-
src = u"ССС дддннннннёёёёёёмммм ппппппрррррооооооггггггррррра\
ааааамммммммммммммммииииииссссссттттттаааааа!!!!!!"
samp = u"С днём программиста!"
a = dict([(c, src.count©) for c in src if c!=" "])
while sorted(a.items(), key=lambda (k,v): (v,k)).pop()[1]:
    for c in samp:
        if c!=" " and a[c]>0:
            print c, #maybe c.encode("utf8")
            a[c] -= 1
        else:
            print " ",
    print


Решение на Javascript от lacki:
console.clear();
i='ССС дддннннннеееееемммм ппппппрррррооооооггггггрррррааааааммммммммииииииссссссттттттаааааа!!!!!!'.split('')
e='С днем программиста!'
o=[]
while(i.length>0){t=e.split('');for(k in t)if(0<=(r=i.indexOf(t[k])))i.splice(r,1);else t[k]=' ';o.push(t.join(''))}
console.log(o);


Еще некоторые(наиболее интересные) решения от хабрачитателей


Дмитрий Дудкин, dmitriy.tmwh@gmail.com, C#:
using System;
 
namespace ProgrammersDay
{
    class Program
    {
        static void GetStrings(string input, string etalon)
        {
            string result = "";
            int wordCount = input.Split(' ').Length;
            while (input.Length > wordCount)
            {
                foreach(char c in etalon)
                {
                    int pos = input.IndexOf(c);
                    result += pos == -1 ? ' ' : c;
                    if (c != ' ' && pos > -1)
                        input = input.Remove(pos, 1);
                }
                Console.WriteLine(result);
                result = "";
            }
        }
 
        static void Main(string[] args)
        {
            GetStrings("ССС дддннннннеееееемммм ппппппрррррооооооггггггрррррааааааммммммммииииииссссссттттттаааааа!!!!!!", "С днем программиста!");
            GetStrings("CCCCCCCCoooooooonnnnnnnnggggraaaaaaaatttttuuulaaaaatttiiiiooooonnnnsssss ooooooonnnnn aaaaaa pppprrooggggrrrrraaaaammmmmeeeeerrr\'\'\'\'\'ssss dddaaaaaaayy!!!", "Congratulations on a programmer\'s day!");
        }
    }
}


Артем Карпов, artyomkarpov@gmail.com, C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ProgramerDayProblem
{
	class Program
	{
		static void Main(string[] args)
		{
			string str = "ССС дддннннннеееееемммм ппппппрррррооооооггггггрррррааааааммммммммииииииссссссттттттаааааа!!!!!!";
			foreach (string outStr in GetProgramersDayStrings(str))
				Console.WriteLine(outStr);
			Console.WriteLine();
			str = "ССССС днееееееееем прооооооггггграаааааааааммммиста!!";
			foreach (string outStr in GetProgramersDayStrings(str))
				Console.WriteLine(outStr);
			Console.WriteLine();
			str = "фыдвлмткушщзпр зущшктукшо у тущшко  мтЁ!!!!!фываз ывСС пднём ее профывагрма миста !!!";
			foreach (string outStr in GetProgramersDayStrings(str))
				Console.WriteLine(outStr);
			Console.Read();
		}
		public static List<string> GetProgramersDayStrings(string messedUp)
		{
			string programersDayString = "С днем программиста!";
			List<int> takenChars = new List<int>();
			List<StringBuilder> result = new List<StringBuilder>();
			while (takenChars.Count != messedUp.Length) 
			{
				StringBuilder stringBuilder = new StringBuilder();
				result.Add(stringBuilder);
				for (int j = 0; j < programersDayString.Length; j++)
				{
					char charInTemplate = programersDayString[j];
					bool isFound = false;
					for (int i = 0; i < messedUp.Length; i++)
					{
						if (!takenChars.Contains(i))
						{
							Char charInMessedUp = messedUp[i];
							if (charInMessedUp == charInTemplate)
							{
								stringBuilder.Append(charInMessedUp);
								isFound = true;
								takenChars.Add(i);
								break;
							}
							if (!programersDayString.Contains(charInMessedUp))
							{
								messedUp = messedUp.Replace(charInMessedUp, ' ');
								takenChars.Add(i);
							}
						}
					}
					if (!isFound) stringBuilder.Append(' ');
				}
			}
			int h = 1;
			return (from stringBuilder in result select string.Format("{0}) {1}", h++, stringBuilder.ToString())).ToList<string>();
		}
	}
}

Климов Антон, rufus-90@mail.ru, Borland С++:
int main(int argc, char* argv[])
{
AnsiString Greetings = "CCC dddnnnnnneeeeeemmmm pppppprrrrrooooooggggggrrrrraaaaaammmmmmmmiiiiiissssssttttttaaaaaa!!!!!!"; // из-за проблем с кодировками пришлось использовать транслитерацию
int kol = 0, k = 1;   // для количества возможных поздравлений
char h;         // т.к. в слове программист две "m", то необходимо это отслеживать
for (int i=1; i<Greetings.Length()-1; i++)
        {
        if (Greetings.operator [](i) == Greetings.operator[] (i+1))
                {
                k++;
                if (i != Greetings.Length() - 1) continue;     // чтобы не прозошла ошибка выхода за пределы массива
                }
        if (k>kol)                                        // поиск максимального количества фраз
                {
                h = Greetings.operator[] (i);
                if (h == 'm')                             // частный случай (в слове "програММиста")
                        {
                        kol = (k - 4)/2;
                        }
                else
                        {
                        kol = k;
                        }
                }
                k = 1;                                   // устанавливаем начальное значение для счётчика букв
        }
AnsiString *A = new AnsiString[kol+1];                   // объявление динамического массива
for (int i = 1; i<Greetings.Length(); i++)                       // заполнение фраз
        {
        A[0] += Greetings.operator[] (i);
        for (int j = 1; j<kol; j++)
                {
                if (Greetings.operator[](i) == Greetings.operator[] (i+1))    // если буква совпадает, то записываем её в фразу
                        {
                        A[j] += Greetings.operator[](i+1);
                        i+=1;
                        if (i == Greetings.Length()) break;                   //дошли до конца строки, выход из цикла
                        }
                else                                           // если далее идёт новая буква, то вместо неё ставим пробел
                        {
                        A[j] += ' ';
                        }
                }
        }
for (int i=0; i<kol; i++) cout << A[i] << endl;            // вывод результатов
cin >> h;
delete []A;
        return 0;
}


Неожиданное решение на HiASM от Николая, lukaville@gmail.com:
Add(MainForm,2953706,210,357)
{
 link(onCreate,16732599:doData,[])
}
Add(DoData,16732599,266,371)
{
 Data=String(CCC дддннннннеееееемммм ппппппрррррооооооггггггрррррааааааммммммммииииииссссссттттттаааааа!!!!!!)
 link(onEventData,13823035:doWork1,[])
}
Add(MultiElement,13823035,322,371)
{
 link(onEvent1,13023161:doMessage,[])
}
BEGIN_SDK
 Add(EditMulti,12743634,21,21)
 {
  EventCount=1
  WorkCount=1
  Width=1105
  Height=557
  link(doWork1,2551932:doReplace,[(45,27)(45,111)])
 }
 Add(StrList,1790778,252,161)
 {
  Point(onGetIndex)
  Point(doGetIndex)
  link(onGetIndex,237252:doValue,[])
 }
 Add(CharArray,8767582,119,105)
 {
  link(onLoad,8650060:doCount,[(165,111)(165,149)(107,149)(107,167)])
 }
 Add(ArrayCountRepeats,8650060,119,161)
 {
  link(onCount,10877864:doSeparateMT,[])
  link(onEndCount,1774722:doWork1,[(160,174)])
  link(Array,8767582:Array,[])
 }
 Add(MT_MultiData,10877864,175,161)
 {
  link(onData1,1790778:doAdd,[])
  link(onData2,13408080:doAdd,[(236,174)(236,132)])
 }
 Add(StrList,13408080,357,126)
 {
  Point(onGetString)
  Point(doGetString)
  link(onGetString,3117069:doCase,[])
 }
 Add(Case,3117069,413,133)
 {
  Value=String(0)
  link(onNextCase,5362397:doValue,[])
  link(onTrue,3555161:doData,[(457,146)(457,177)(648,177)(648,146)])
 }
 Add(ArrayEnum,14767397,182,294)
 {
  link(onItem,1790778:doGetIndex,[(233,300)(233,209)])
  link(onEndEnum,14095146:doData,[(503,307)(503,202)])
  link(Array,13226017:Array,[])
 }
 Add(ArrayRW,15067827,371,217)
 {
  link(Array,16418868:Var2,[])
  link(Index,237252:Value,[(384,207)(307,207)])
 }
 Add(Memory,5362397,469,133)
 {
  link(onData,3731564:doCalc,[])
 }
 Add(DoData,11682113,609,133)
 {
  link(onEventData,877187:doWork2,[])
  link(Data,7779374:Var,[])
 }
 Add(LineBreak,4088562,182,350)
 {
  Caption="b"
  Type=1
  link(Data,14767397:Item,[])
  Primary=[7779374,427,-245]
 }
 Add(StrList,13536637,770,133)
 {
 }
 Add(MathParse,3731564,525,133)
 {
  DataCount=1
  MathStr="%1 - 1"
  link(onResult,931945:doEvent1,[])
 }
 Add(Hub,931945,574,133)
 {
  link(onEvent1,11682113:doData,[])
  link(onEvent2,15067827:doWrite,[(595,146)(595,190)(359,190)(359,230)])
 }
 Add(HubEx,877187,700,133)
 {
  link(onEvent,13536637:doAdd,[])
 }
 Add(DoData,3555161,658,140)
 {
  Data=String( )
  link(onEventData,877187:doWork3,[(704,146)])
 }
 Add(DoData,14095146,770,196)
 {
  link(onEventData,11364581:doReplace,[])
  link(Data,13536637:Text,[])
 }
 Add(StrList,13226017,168,224)
 {
  Strings=#1:C|1: |1:д|1:н|1:е|1:м|1: |1:п|1:р|1:о|1:г|1:р|1:а|1:м|1:м|1:и|1:с|1:т|1:а|1:!|
 }
 Add(Memory,237252,301,168)
 {
  link(onData,13408080:doGetString,[])
 }
 Add(Replace,11364581,819,196)
 {
  SubStr="\r\n"
  link(onReplace,9166956:doEvent1,[])
 }
 Add(ArraySum,372869,413,252)
 {
  ArrayType=1
  link(onSum,5547542:doCase,[])
  link(Array,16418868:Var3,[(419,194)])
 }
 Add(GetDataEx,16418868,371,189)
 {
  link(Data,13408080:Array,[])
 }
 Add(LineBreak,14917506,364,252)
 {
  Caption="wo"
  link(Out,372869:doSum,[])
  Primary=[6832758,539,-49]
 }
 Add(Case,5547542,455,252)
 {
  Value=Integer(0)
  link(onNextCase,1774722:doWork3,[(494,258)(494,286)])
  link(onTrue,4931312:doOperation,[])
 }
 Add(StrList,13771164,945,196)
 {
 }
 Add(Hub,9166956,868,196)
 {
  link(onEvent1,13771164:doAdd,[])
  link(onEvent2,6832758:In,[])
 }
 Add(HubEx,1774722,156,280)
 {
  Angle=1
  link(onEvent,14767397:doEnum,[(160,300)])
 }
 Add(Replace,2551932,70,105)
 {
  SubStr=" "
  link(onReplace,8767582:doLoad,[])
 }
 Add(ArrayRW,5657784,959,259)
 {
  link(onRead,6531054:doReplace,[])
  link(Array,13771164:Array,[])
 }
 Add(Math,4931312,910,259)
 {
  OpType=1
  Op2=1
  link(onResult,5657784:doRead,[])
  link(Op1,13771164:Count,[(916,250)(958,250)])
 }
 Add(Replace,6531054,1008,259)
 {
  SubStr="!"
  DestStr="!\r\n"
  link(onReplace,12743634:onEvent1,[(1083,265)(1083,27)])
 }
END_SDK
Add(Message,13023161,378,371)
{
}

PS. Просьба отписываться, если дали кому-то инвайт из этих хабрачитателей.
Tags:
Hubs:
+46
Comments 28
Comments Comments 28

Articles