Вывести PPCG Prime

69

Это PPCG Prime

624 цифры в длину

777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777111111111111111111111111111111111111111111111111111111111111111111111111111111188888888118888888811188888811188888811188111118818811111881881111881881111881188111118818811111881881111111881111111188888888118888888811881111111881118888188111111118811111111881111111881111881188111111118811111111881111881881111881188111111118811111111188888811188888811111111111111111111111111111111111111111111111111111111111111111111111111111111333333333333333333333333333333333333333



Если мы разделим каждые 39 цифр, мы получим

777777777777777777777777777777777777777
777777777777777777777777777777777777777
777777777777777777777777777777777777777
777777777777777777777777777777777777777
111111111111111111111111111111111111111
111111111111111111111111111111111111111
188888888118888888811188888811188888811
188111118818811111881881111881881111881
188111118818811111881881111111881111111
188888888118888888811881111111881118888
188111111118811111111881111111881111881
188111111118811111111881111881881111881
188111111118811111111188888811188888811
111111111111111111111111111111111111111
111111111111111111111111111111111111111
333333333333333333333333333333333333333

Ваша задача - вывести PPCG-Prime

Это короткий код в байтах побеждает.

Если вы введете PPCG-Prime в функции Mathematica ниже, вы получите этот результат

ArrayPlot@Partition[IntegerDigits@#,39]&   

введите описание изображения здесь


источник
37
Как, черт возьми, ты нашел это?
Стьюи Гриффин
5
@StewieGriffin Средняя вероятность того, что число nбудет простым, пропорциональна 1/log(n), которая, в любом случае, не очень мала. Просто проверьте много цифр, пока не станет простым.
user202729
2
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Деннис
1
@ user202729 log(n)примерно 1436.6в этом случае.
Джеппе Стиг Нильсен
3
@Fabian Я не думаю, что этот метод был бы эффективен ... Для такого большого прайма (624 цифры), номер, который вы спрашиваете, имеет 621 цифру (и еще сложнее для игры в гольф), если только это не 10 ^ 621-й премьер !!! Если вы хотите найти свой номер, вот простое приближение x/logxпо Гауссу

Ответы:

22

Желе , 55 54 52 47 46 байт

“=÷¡v⁺ʋiṂYR¤"bİɲ}Ñ1Ṇ⁴ẠV⁹yȥGẇ’“¿mŻ“p’Dx39jBo88V

В истории пересмотров есть более запутанные подходы, но этот простой превосходит их все.

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

Как это устроено

“=÷¡v⁺ʋiṂYR¤"bİɲ}Ñ1Ṇ⁴ẠV⁹yȥGẇ’

Это числовой литерал, закодированный в биективной базе 250, где цифры взяты из кодовой страницы желе. Аргумент цепочки (слева) и возвращаемое значение устанавливаются в закодированное целое число,
n: = 0x21871c77d7d7af6fafafeff0c37f72ff7fbfbdbfdfef5edfeff8e3 .

“¿mŻ“p’

Буква, аналогичная приведенной выше, но вторая отделяет два закодированных целых числа. Возвращаемое значение заменяется кодированным массивом, [777711, 113] .

Dx39

Dпреобразует возвращаемое значение в десятичное ( [[7, 7, 7, 7, 1, 1], [1, 1, 3]] ), а затем x39повторяет каждое отдельное целое число / цифру в результате 39 раз. В результате получается пара массивов, которые содержат цифры до и после 7-значного верхнего текста соответственно. Давайте назовем этот массив A .

jB

Сначала Bпреобразует (левый) аргумент n в двоичный файл. Это дает цифры, которые образуют 7-значный высокий текст, где каждый 88 был заменен на 0 .

Затем jприсоединяется к массиву A , используя двоичный массив в качестве разделителя.

o88

Это выполняет логическое ИЛИ с 88 , заменяя каждый 0 на 88 .

V

Теперь у нас есть правильные цифры, но в массиве 7 , 1 , 88 и 3 . Vнеявно превращает этот массив в строку, а затем уничтожает ее, получая одно целое число.

Деннис
источник
6

SOGL V0.12 , 52 51 байтов

≡=vā⁷H↕↕jΥ_Ν↑∆∫▲pΖo	‘θδžΟwd╬2n?q[‘²Κ7n⌡"α¼■╤ģ⅞¹‘¹H∑

галстуки жвачки!
обратите внимание, что этот ответ содержит вкладку

Попробуй здесь!

Пытается сохранить байты, используя одну и ту же строку для обоих из Ps.

Объяснение:

...‘...‘²Κ7n⌡"..‘¹H∑  compressed strings replaced with ellipses to shorten the width
...‘                  pushes "1111111188888188888888111118811111881111188111118881118818111811111111188888188888888111118811111881111188118118888818818881811118111" - CG
    ...‘              pushes "1111111888888888888881118118111811811181181118118111811811188881111881" - P
        ²             join with itself - double the P
         Κ            reverse add - prepend the PP to CG
          7n          split to line lengths of 7
            ⌡         for each
             "..‘       push "311ŗ117777" with ŗ replaced with the ToS - current item looping over
                 ¹    wrap the results tn an array
                  H   rotate it counter-clockwise
                   ∑  join to a single string

Числа там сохраняются как от оригинала, начиная с левого нижнего угла, повышаясь, затем 1 вправо и вниз, затем вверх, и т. Д.

Версия сжатия в 52 байта:

#⅓→9E■Ν►1&⅝θ⅞%øøμ←N═]y)u⅝↓$A○░(ZF16Φ⅓Mč▓d⅛Hι‼∑υnη▲Z‘

Попробуй здесь!

dzaima
источник
Я не уверен, что то, что вы опубликовали, является правильным кодом вообще ...
Эрик Outgolfer
1
как ...‘получить эти цифры?
Pureferret
1
@Pureferret Струнное сжатие.
полностью человек
@totallyhuman, как он «кодирует» / сжимает эти строки в ...‘?
Pureferret
@dzaima Я не думаю, что это на самом деле помогает мне понять, к сожалению. Ввод первой части, которая кодирует CGв этот инструмент, ...‘нигде в этом инструменте не дает .
Pureferret
4

Mathematica, 107 байт

Uncompress@"1:eJxTTMoP8ixgYmAwH8TAkLrAAgqQWYbYGFDVGCxkBh5lCDNwWIqqDCyGrAGDhWEpFmXY3IaiDItPqQqMiQMA+yaAoA=="


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

J42161217
источник
Поправьте меня, если я ошибаюсь, но это решение только для REPL? Это не похоже на функцию (которую, я думаю, вы могли бы исправить с помощью сингла &на конце).
Числовой маньяк
это не должно быть функцией. этот код просто выводит простое число PPCG, точно так же, как запросил OP
J42161217
4

CJam, ASCII, 61

Hs78f*~_@"'hfv;HH`>O4RU(_o^.U)9q&-1iadr`4tk"90b2b88fe|1$'339*

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

Добавить ]s39/N*для хорошей упаковки.

Объяснение:

Hs         generate "17" (H=17)
78f*       repeat each character 78 times, getting an array of 2 strings
~_         dump the 2 strings on the stack, and duplicate the '7's
@          move the '1's to the top of the stack (first 6 lines done so far)
"…"90b     convert that string from base 90 (treating characters as numbers)
2b         convert the resulting number to base 2,
            obtaining a bit map for the "PPCG" part, with 1 for "1" and 0 for "88"
88fe|      replace (boolean OR) all the zeros with 88
1$         copy the string of 78 '1's
'339*      repeat '3' 39 times
aditsu
источник
4

C 519 427 414 396 377 байтов

Спасибо Тасу, Феликсу Пальмену и Линн.

#define p(n,l)for(i=40*l;i;)putchar(--i%40?n+48:10);
f(i){p(7,4)p(1,2)puts("188888888118888888811188888811188888811\n188111118818811111881881111881881111881\n188111118818811111881881111111881111111\n188888888118888888811881111111881118888\n188111111118811111111881111111881111881\n188111111118811111111881111881881111881\n188111111118811111111188888811188888811");p(1,2)p(3,1)}

Для вашего интереса, вот более длинная и удобная для чтения версия:

#define p(n,l) for(i=40*l;i;) putchar(--i%40?n+48:10);
f(i) {
    p(7,4)
    p(1,2)
    puts("188888888118888888811188888811188888811\n\
       188111118818811111881881111881881111881\n\
       188111118818811111881881111111881111111\n\
       188888888118888888811881111111881118888\n\
       188111111118811111111881111111881111881\n\
       188111111118811111111881111881881111881\n\
       188111111118811111111188888811188888811");
    p(1,2)
    p(3,1)
}
xanoetux
источник
1
Вы можете получить намного ниже (~ 450 иш), просто напечатав 1 и 8 как есть, и определив 7, 3 и 1
Tas
@Keyu Gan: я компилирую с текущей версией GCC (7.2.0-debian11), которая позволяет это в течение пары лет. Я не совсем уверен, если синтаксис, возможно, в одном из новых стандартов Си.
xanoetux
2
@Keyu Gan: это разрешено в C99 и C11.
xanoetux
1
414 байт
Феликс Пальмен,
Эта версия очень хитрая. По крайней мере, я понимаю это; Благодарю.
xanoetux
4

Java (OpenJDK 8) , 165 байт

n->{for(int i=0;++i<566;)System.out.print(i<157?7:i>526?3:i<236|i>446||new java.math.BigInteger("vnku5g6l0zenpa1kydel5rxw162k4fk4xapa154o",36).testBit(446-i)?1:88);}

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

кредиты

  • -10 байт благодаря адицу!
Оливье Грегуар
источник
165:n->{for(int i=0;++i<566;)System.out.print(i<157?7:i>526?3:i<236|i>446||new java.math.BigInteger("vnku5g6l0zenpa1kydel5rxw162k4fk4xapa154o",36).testBit(446-i)?1:88);}
aditsu
Хороший улов, двойник 88, спасибо!
Оливье Грегуар
2

Пакет, 364 335 333 байта

@set a=888888&set b=1111111111111&set e=1881111&set d=1%e%&set f=333333333&for /L %%x in (1,1,156) do @cd|set/p=7
@echo %b%%b%%b%%b%%b%%b%1%a%8811%a%88111%a%111%a%1%d%188%e%188%e%88%e%88%d%188%e%188%e%1%d%1111%a%8811%a%88%d%111881118888%e%11%d%11%d%1%d%88%d%11%d%11%d%88%e%88%d%11%d%11111%a%111%a%%b%%b%%b%%b%%b%%b%11%f%%f%%f%%f%333
schnaader
источник
1
Сохраните два байта, изменив echo|наcd|
stevefestl
Спасибо, я знал, что было что-то короче, но не мог вспомнить
schnaader
Кроме того, (1,1,156) doможет быть сокращено до(1,1,156)do
stevefestl
2

Javascript (ES6), 187 181 байт

-6 байт благодаря @JustinMariner

r=s=>s[0].repeat(39),a=r`7`,b=r`1`,i="8888881",c=188+i,d=11+i,j="188111",e=j+1188,f=j+188,g=j+111,h=g+1,k=r`3`
z=>"aaaabbccdd1eeff1eeghccgj8888hhgf1hhff1hhdd1bbk".replace(/./g,eval)

Супер простой подход; вероятно, можно было бы сыграть в гольф еще немного.

объяснение

r=s=>s[0].repeat(39),                               // helper function to repeat character
a=r`7`,b=r`1`,i="8888881",c=188+i,d=11+i,j="188111",// Set the variables (a-k) to different
e=j+1188,f=j+188,g=j+111,h=g+1,k=r`3`               // parts of the prime       

_=>"aaaabbccdd1eeff1eeghccgj8888hhgf1hhff1hhdd1bbk" // Replace all letters in the string
    .replace(/./g,eval)                             // with the value of the variable

Пример кода (с некоторым вспомогательным кодом для добавления разрывов строк в выводе)

Герман Л
источник
Вы можете сохранить несколько байт , если вы определяете вспомогательную функцию , rкак r=s=>s[0].repeat(39)и заменить a, bи kс и r`7` т.д. Попробуйте его в Интернете! ,
Джастин Маринер,
2

C (gcc) , 269 267 байт

функция, использует простой RLE.

x[]={39,79,80,156};k;f(i){for(char*c="d7b1882188316831683128512811285128112841281128412821285128112851281128712881882188212871283148112881288128712841282128812881284128112841282128812891683168c1a3";i=*c++;++c)for(i=i<97?i-48:x[i-97];i--;++k%39||puts(""))putchar(*c);}

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

Феликс Палмен
источник
Предлагаю L"'OP\x9c"вместоx
floorcat
2

C (gcc) , 224 байта

f(i,j,c){for(i=0;c="wwdfFdfFDfFDfFDFDDFFDDFFDddDDFdDDddDDddDDDdDDDDffDffDFDDDFDfdDDDDFDDDdDDDdDDFdDDDDFDDDdDDFFDdDFDDDdDDDDdfDdfD"[i/2]>>i++%2*4&15;c-6?putchar(c-4?c+48:49):printf("88"))for(j=0;j++<c%2*38;)putchar(c+48);}

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

Содержит некоторые непечатаемые, строковый литерал "ww\x11dfFdfFDfFDfFDFDDFFDDFFDddDDFdDDddDDddDDDdDDDDffDffDFDDDFDfdDDDDFDDDdDDDdDDFdDDDDFDDDdDDFFDdDFDDDdDDDDdfDdfD\x11\x03".

Линн
источник
1

Желе , 86 байт

Lẋ@1,8żḣLẋ/€F
7ẋ156;1ẋ78¤©;“½Ẹ^o“2FẒ⁶ġbȥ“¡E⁷£cṿ“t¡ɗḋ“£F¢Xȥ“¡McṾbȥ“¬3Ṭo’DÇ€F¤;®;3rẋ39¤Ḍ

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

-12 байт благодаря пользователю 202729

HyperNeutrino
источник
88 байт: TIO ( можно separates a list of strings inside a string literal)
user202729
Какое сейчас время в твоей стране? Почему ты не спишь сейчас?
user202729
@ user202729 Хорошо, спасибо. И я в UTC-4, я сделал глупость, и мне пришлось ложиться спать поздно, поэтому я чувствовал, что должен бросить вызов перед сном, так как это вновь открылось. Я могу уточнить в чате, если вы хотите: P
HyperNeutrino
1

Желе , 85 байт

”7ẋ“ɓ’80“¡Ȯ⁶LÑɓĠ⁶-€Øġ°$¤ṛọḳƓƒṭ⁽@^ḥ⁷Ofạ<e½Ṇż;,RṘ¶ṀḊ+`⁸ⱮḃĿþṛ9.wƑ¡kḟUẎgLLµ’ḃĖŒṙị⁾1839”3ẋ

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

Основанный на подходе Денниса к вызову Тринити-Холла, минус симметрия, плюс ведущие 7s и конечные 3s.

Эрик Аутгольфер
источник
3
Денис подошел к этому вызову по-другому, потому что это другой. Я думаю, что вы были вне игры!
@JoseZaman Он сделал Jelly BTW.
Эрик Outgolfer
1

PowerShell , 164 байта

$a='136361616151315131531532513151315215436365213213315454521532545453153254541616';6..2|%{$a=$a-replace$_,(11,88,22,34,3332)[$_-2]};'7'*156+'1'*78+$a+'1'*78+'3'*39

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

Умножение строк, конкатенация и замены. PowerShell не имеет базы 36 или аналогичной, поэтому варианты сжатия большого числа ограничены. Возможно, есть лучший способ «сжать» среднюю часть - я все еще проверяю это.

AdmBorkBork
источник
1

Wolfram Language (Mathematica) , 89 (17 + 71 + 1) байт

Сначала вы экспортируете номер в файл GZIP. Этот файл с именем "o" без расширения будет ровно 71 байт, что соответствует общему количеству. По умолчанию он пойдет на ваш $TemporaryDirectory. Пропускать цифры для удобства чтения.

Export["o",777777...,"GZIP"]

затем

"o"~Import~"GZIP"

восстановит номер. Имя файла - один байт, так что отсюда берется +1.

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

Келли Лоудер
источник
1

Рубин, 109 байт

Скрипт вызывает Zlib.inflateдля распаковки номера. Для этого нужен как минимум Ruby 1.9.3. Он содержит непечатаемые байты, поэтому я не могу вставить его здесь.

Я вставляю вывод vis prime-inflate.rb:

require'zlib'
puts Zlib.inflate DATA.read
__END__
x\M-Z37\^_\M-<\M-@\M^P\M-:\M-@\^B
\M^PY\M^F\M-X\^XP\M-U\^X,d\^F\^^e\^H3pX\M^J\M-*\^L,\M^F\M-,\^A\M^C\M^Ea)\^Ve\M-X\M-\\M^F\M-"\^L\M^KO\M-)
\M^L\M^I\^C\^@\^P\M-p~\M-!

Если у вас есть unvis (1), запустите, unvis prime-inflate.vis > prime-inflate.rbчтобы восстановить 109-байтовый скрипт. Или вы можете декодировать Base64, ниже, с помощью ruby -e 'print *STDIN.read.unpack(?m)' < prime-inflate.b64 > prime-inflate.rb.

cmVxdWlyZSd6bGliJwpwdXRzIFpsaWIuaW5mbGF0ZSBEQVRBLnJlYWQKX19F
TkRfXwp42jM3H7zAkLrAAgqQWYbYGFDVGCxkBh5lCDNwWIqqDCyGrAGDhWEp
FmXY3IaiDItPqQqMiQMAEPB+oQ==

Я звоню, Zlib.inflateчтобы мне не нужно было разрабатывать и обрабатывать собственный алгоритм декомпрессии. Я использую DATAс, __END__потому что сжатая строка не является допустимой UTF-8. Код Ruby должен быть действительным ASCII (в Ruby 1.9.x) или UTF-8 (из Ruby 2.0) или иметь магический комментарий #coding:binaryдля изменения кодировки, но Ruby не проверяет кодировку после __END__.

kernigh
источник
1

6502 машинный код (C64), 142 122 байта

00 C0 A9 27 85 FB A2 00 86 FC A2 04 CA 10 01 60 BC 70 C0 BD 74 C0 20 D2 FF C6
FB D0 0B 48 A9 27 85 FB A9 0D 20 D2 FF 68 88 D0 EB E0 02 D0 DD 48 A5 FC 4A A8
B9 4A C0 90 04 4A 4A 4A 4A 29 0F F0 08 E6 FC A8 68 49 09 D0 CD 68 D0 C0 28 38
36 36 52 12 52 12 42 12 42 22 52 12 52 12 72 82 28 28 72 32 14 82 82 72 42 22
82 82 42 12 42 22 82 92 36 06 27 50 4F 9C 33 31 31 37

Онлайн демо

Использование: sys49152

  • -20 байт с лучшей реализацией того же метода и таблиц данных для больших блоков.

объяснение

Это также использует длины 1и 8последовательностей в средней части; поскольку они все короче 16, два из них кодируются на байт.

Комментарий к разборке:

         00 C0        .WORD $C000       ; load address
.C:c000  A9 27        LDA #$27          ; counter for newlines (39)
.C:c002  85 FB        STA $FB
.C:c004  A2 00        LDX #$00          ; index for run-length data
.C:c006  86 FC        STX $FC
.C:c008  A2 04        LDX #$04          ; index for "blocks" (counting down)
.C:c00a   .blockloop:
.C:c00a  CA           DEX
.C:c00b  10 01        BPL .continue     ; block index underflow -> done
.C:c00d  60           RTS
.C:c00e   .continue:
.C:c00e  BC 70 C0     LDY .lseqlens,X   ; load length of next block to Y
.C:c011  BD 74 C0     LDA .chars,X      ; load character of next block to A
.C:c014   .outloop:
.C:c014  20 D2 FF     JSR $FFD2         ; output character
.C:c017  C6 FB        DEC $FB           ; decrement newline counter
.C:c019  D0 0B        BNE .skipnl
.C:c01b  48           PHA               ; newline needed -> save accu
.C:c01c  A9 27        LDA #$27          ; restore newline counter
.C:c01e  85 FB        STA $FB
.C:c020  A9 0D        LDA #$0D          ; load newline character
.C:c022  20 D2 FF     JSR $FFD2         ; output character
.C:c025  68           PLA               ; restore accu
.C:c026   .skipnl:
.C:c026  88           DEY               ; decrement repeat counter
.C:c027  D0 EB        BNE .outloop      ; repeat until 0
.C:c029  E0 02        CPX #$02          ; check for block index of text part
.C:c02b  D0 DD        BNE .blockloop    ; not in text part -> repeat
.C:c02d   .textpart:
.C:c02d  48           PHA               ; save accu
.C:c02e  A5 FC        LDA $FC           ; load index for run-length data
.C:c030  4A           LSR A             ; and shift right
.C:c031  A8           TAY               ; -> to Y register
.C:c032  B9 4A C0     LDA .seqlens,Y    ; load run-length data
.C:c035  90 04        BCC .lownibble    ; carry clear from shift -> low nibble
.C:c037  4A           LSR A             ; shift high nibble into low nibble
.C:c038  4A           LSR A
.C:c039  4A           LSR A
.C:c03a  4A           LSR A
.C:c03b   .lownibble:
.C:c03b  29 0F        AND #$0F          ; mask low nibble
.C:c03d  F0 08        BEQ .textdone     ; run-length zero? then text block done
.C:c03f  E6 FC        INC $FC           ; increment index for run-length data
.C:c041  A8           TAY               ; run-length to y-register
.C:c042  68           PLA               ; restore accu
.C:c043  49 09        EOR #$09          ; toggle between '8' and '1'
.C:c045  D0 CD        BNE .outloop      ; and back to output loop
.C:c047   .textdone:
.C:c047  68           PLA               ; restore accu
.C:c048  D0 C0        BNE .blockloop    ; back to loop for next block
.C:c04a   .seqlens:
.C:c04a  28 38 36 36  .BYTE $28,$38,$36,$36
.C:c04e  52 12 52 12  .BYTE $52,$12,$52,$12
.C:c052  42 12 42 22  .BYTE $42,$12,$42,$22
.C:c056  52 12 52 12  .BYTE $52,$12,$52,$12
.C:c05a  72 82 28 28  .BYTE $52,$82,$28,$28
.C:c05e  72 32 14 82  .BYTE $72,$32,$14,$82
.C:c062  82 72 42 22  .BYTE $82,$72,$42,$22
.C:c066  82 82 42 12  .BYTE $82,$82,$42,$12
.C:c06a  42 22 82 92  .BYTE $42,$22,$82,$92
.C:c06e  36 06        .BYTE $36,$06
.C:c070   .lseqlens:
.C:c070  27 50 4F 9C  .BYTE $27,$50,$4F,$9C
.C:c074   .chars:
.C:c074  33 31 31 37  .BYTE "3117"
Феликс Палмен
источник
1

C (gcc) , 188 187 185 байт

-1 спасибо Джонатану Фречу.

-2 благодаря потолку.

#define F(c,n)for(c=0;c<n;c++)
i,j,k;r(d,n){F(k,n)printf("%d",d);}f(){r(7,156);r(1,79);F(i,45)F(j,6)r("pdpi8pIa7]R>=4gQ>Q2iPoX2=O4a1=QRJ17QR>=4a1i8p"[i]-49>>j&1?8:1,1);r(1,80);r(3,39);}

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

gastropner
источник
2
Добро пожаловать в PPCG, хороший первый ответ!
овс
Я думаю, что вы можете сдвинуть свою строку, чтобы получить строку, которая не нуждается в экранировании от обратной косой черты, в результате чего получается 187 байт .
Джонатан Фрех
@JonathanFrech Ах, хорошо!
гастропнер
@ceilingcat Хороший улов!
гастропнер
0

Befunge-93 , 500 байт

v F         >20g1-20p
>"3"20g10g`#^_>52*"F"20p30g10g`#v_"^!1"21p30p84*2+1p
^                       p03-1g03<
^>"81118888888811888888881>!"30p84*2+1p52*
^^"8888811188888811"*25"188111118"<>">#7"21p30p57*5p
>*"188111188188111188188111118818"^ $>:#,_@
^25"18811111881881111188188111111"<
>"8888811888888881"25*"1111111881"^
^"88811881111111881118888"*25"188"<
>"1188111111188111111118811111111"^
^"11881"*52"188111111118811111111"<
>"11111881"52*"188111188188111188"^
^"1118811111111188888811188888811"<

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

ItsJ0el
источник