Двойные простые пары в гольфе и последовательность Коллатца


12

Это новый тип задач, вдохновленный проблемой « Восстановить измененный исходный код» .

Вы должны написать две программы или функции на одном языке. Первый должен решить задачу № 1, а второй должен решить задачу № 2.

Ваша оценка будет суммой более длинной программы и расстояния Левенштейна между исходным кодом двух программ. Чем меньше балл, тем лучше, поэтому вы должны попытаться сделать два решения одинаковыми, оставляя программы короткими.

Задание 1

Вам дано положительное целое число , Nи вы должны выводить последовательность Коллатца из Nразделенных пробелами или переводом строки. Конечный разделитель допускается.

Первым элементом последовательности Коллатца является N. Остальные элементы генерируются на основе их преемника :ai1

ai={ai12 if ai1 is even3ai1+1 if ai1 is odd

Как только последовательность достигает, 1новые элементы не генерируются.

Input => Примеры вывода:

6 => 6 3 10 5 16 8 4 2 1
8 => 8 4 2 1
1 => 1

Задача № 2

Пара двойных простых чисел - это пара натуральных чисел, разница которых равна 2, и они оба простые.

Вам дано положительное целое число, Nи вы должны вывести наименьшую пару двойных простых чисел, где оба простых числа больше, чем Nпервое. Число должно быть меньшим, а два простых числа должны быть разделены пробелами или символом новой строки. Конечный разделитель допускается.

Input => Примеры вывода:

6 => 11 13
42 => 59 61
1 => 3 5

Фрагмент для подсчета очков

(Модификация одного в Восстановить проблему с измененным исходным кодом .)

редактировать

В шапке ответов воспользуемся форматом

[Language], [longer length] + [distance] = [final score],

Например

Python 2, 60 + 32 = 92

Ответы:




3

CJam, 25 + 16 = 41

Программа Collatz:

l~2*{_2%{3*)}{2/}?_p_(}g;

Программа двойных простых чисел:

l~_2+]{:)_{mp}/&!_&}gS*

Проверьте это здесь.

Я просто играл в гольф оба из них на данный момент. Я посмотрю, смогу ли я как-нибудь уменьшить счет.


2

Пиф, 20 + 14 = 40 34

Коллатец:

QWtQ=Q@,/Q2h*3QQQ

Prime Pairs:

~Q1WttP*Q+Q2~Q1;Q+Q2

Обе программы, которые принимают ввод из STDIN и выводят числа в новых строках. Просто покажите оба ответа, используя пока один и тот же примитив цикла. Возможно, это можно было бы немного улучшить.

Редактировать: Добавлена ​​улучшенная проверка состояния украденного из @isaacg. Похоже, использование фильтра по-прежнему короче, чем использование цикла while для простых пар.

Попробуйте это онлайн здесь.


Это выводит 3 5для входа 3 на простых парах. Это должно вывести 5 7.
Исаак

@isaacg Исправлено, стоило 3 :(
FryAmTheEggman

2

05AB1E , 14 + 13 10 9 = 27 24 23

-4 балла благодаря ASCII-только

Последовательность Коллатца (14 байтов):

[DÉi3*>ë2÷}Ð,#

Попробуйте онлайн!

Двойные простые числа (14 байтов):

[DÅND>>Dp#}s,,

Попробуйте онлайн!


Двойные простые числа в гольфе (11 байт):

[ÅNDÌp#]DÌ»

Попробуйте онлайн!


Ссылка на Collatz неверна
только ASCII

Спасибо, исправили это!
Вислав

простые числа -3 балла. Вероятно, стоит оставить в ответе в качестве дополнительной информации версию для игры в гольф, если есть другой, лучший гольф (что именно делает пара, кстати? например, почему я должен это делать ,,, и почему он Ð,там работает)
только ASCII,

-1 больше (правка: неважно, первое число должно быть меньше. На данный момент 24 балла
только ASCII


1

Ява 8, 118 + 84 = 202

Коллатец:

n->{for(System.out.println(n);n>1;System.out.println(n=n%2<1?n/2:3*n+1));}

Двойные простые числа:

n->{t:for(int p,z;;n++){for(z=n;z<n+3;z=z+2)for(p=2;p<z;p++)if(z%p<1)continue t;System.out.print(n+" "+(n+2));break;}}

упомянуть Java 8 ..
Оптимизатор

1

Mathematica, 53 + 29 = 82

Последовательность Коллатца:

Print/@(NestWhileList[If[OddQ@#,3#+1,#/2]&,#,#>1&]);&

Программа двойных простых чисел:

Print/@(NestWhile[NextPrime,#,!PrimeQ[#+2]&]+{0,2});&

1

> <> , 116 + 86 = 202

Программа Collatz (46):

0i:0(?v$a*$'0'-+!
?v6,>:>~:nao:1=?;3*:2%
 >1+^

Программа двойных простых чисел (116):

0i:0(?v$a*$'0'-+!
v&2+1~<:-2
<v!?%&+1:&:v?=&:&:
 >&~0$2&2+v>&~143.
:&:1+&%?!v>:&:&=?v
0v?*r$0~&< .561~&<.1
:<;noan-2

Уч. Обе программы запускаются с одной и той же atoiфункцией, но после этого двойные простые числа идут вниз. Один и тот же кусок кода повторяется дважды для проверки простоты - может быть немного короче, чтобы как-то повторно использовать этот кусок, но настройка для него не сэкономит много байтов.

Может быть намного лучше, если бросить заднюю половину двойных простых чисел в неиспользуемые места программы Collatz, но я не уверен, разрешено ли это.


3
"Гольф это, Гольф это НАО!" - Ноанольд Гольфзенеггер. Тем не менее, вопрос, похоже, не говорит о том, что добавление мусора для уменьшения расстояния Левенштейна является табу, поэтому я бы
сошел с

0

C ++ Расстояние = 114 Большая длина = 155 Оценка = 269

Задание 1

void c(int N){while(N>1){cout<<N<<' ';N=(N%2==0)?N/2:N*3+1;}cout<<N;}

Задача 2

int p(int x){int z=0;for(int i=2;i<x;i++){if(x%i==0){z=1;break;}}return z;}
void c(int N){N=(N%2==0)?N+1:N+2;int M=N+2;while(p(N)+p(M)>0){N=M;M+=2;}cout<<N<<' '<<M;}

Задача 2 улучшена

int p(int N){int z=0;for(int i=2;i<N;i++){if(N%i==0){z=1;break;}}return z;}
void c(int N){N=(N%2==0)?N+1:N+2;while(p(N)+p(N+2)>0){N+=2;}cout<<N<<' '<<N+2;}

Я думаю, что вы даже не пытались уменьшить счет. Например, у вас разные имена функций, разные имена аргументов, разные типы возвращаемых данных и что нет, которые увеличивают ваше расстояние.
Оптимизатор

@ Оптимизатор Я не знаю другого способа проверки на простые числа? На других языках это встроено.
bacchusbeale

1
Я даже не говорил об изменении алгоритма. Например, этот код имеет только 102 расстояния:int p(int x){int z=0;for(int i=2;1<x;i++){cout<<x<<' ';x=(x%2==0)?x/2:x*3+1;}cout<<x;return z;}
Оптимизатор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.