Мы все ругаем ИИ, и за дело, но вот в ходе дискуссии возник спор: можно ли с помощью ИИ написать код, который будет работать, если человек вообще не владеет нужным языком программирования, но хотя бы чуть-чуть помнит предметную область.
И вот что получилось:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
class LZ77Compressor
{
const int WINDOW_SIZE = 4096;
const int LOOKAHEAD_BUFFER_SIZE = 18;
public static void Compress(string inputPath, string outputPath)
{
byte[] input = File.ReadAllBytes(inputPath);
using var output = new BinaryWriter(File.Create(outputPath));
int pos = 0;
while (pos < input.Length)
{
int bestMatchDistance = 0, bestMatchLength = 0;
int startIndex = Math.Max(0, pos - WINDOW_SIZE);
for (int i = startIndex; i < pos; i++)
{
int matchLength = 0;
while (matchLength < LOOKAHEAD_BUFFER_SIZE &&
pos + matchLength < input.Length &&
input[i + matchLength] == input[pos + matchLength])
{
matchLength++;
}
if (matchLength > bestMatchLength)
{
bestMatchDistance = pos - i;
bestMatchLength = matchLength;
}
}
if (bestMatchLength >= 3)
{
output.Write((byte)1); // флаг: это ссылка
output.Write((ushort)bestMatchDistance); // расстояние
output.Write((byte)bestMatchLength); // длина
pos += bestMatchLength;
}
else
{
output.Write((byte)0); // флаг: это литерал
output.Write(input[pos]); // байт как есть
pos++;
}
}
}
public static void Decompress(string inputPath, string outputPath)
{
using var input = new BinaryReader(File.OpenRead(inputPath));
using var output = new BinaryWriter(File.Create(outputPath));
List<byte> buffer = new();
while (input.BaseStream.Position < input.BaseStream.Length)
{
byte flag = input.ReadByte();
if (flag == 1)
{
int distance = input.ReadUInt16();
int length = input.ReadByte();
int start = buffer.Count - distance;
for (int i = 0; i < length; i++)
{
byte b = buffer[start + i];
buffer.Add(b);
output.Write(b);
}
}
else
{
byte b = input.ReadByte();
buffer.Add(b);
output.Write(b);
}
}
}
}
class Program
{
static void Main()
{
string input = "input.txt";
string compressed = "compressed.lz";
string decompressed = "output.txt";
LZ77Compressor.Compress(input, compressed);
LZ77Compressor.Decompress(compressed, decompressed);
Console.WriteLine("Сжатие и распаковка завершены.");
}
}
Я не знаю С#, и даже не помню LZ - кто-нибудь может попытаться это скомпилировать - оно работает или нет?
Или опять ИИ всё навыдумывал?