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