Програми автограми


34

У цьому реченні використовуються два, два, два, два, двадцять вісім е, п’ять, три г, вісім годин, одинадцять, три л, два м, тринадцять п ’ять, дев'ять о, два п’ я, п ’ять, двадцять п’ять s, двадцять три t, шість v, десять w, два x, п'ять y, і один z.

Такі речення називаються аутограмами . Ваше завдання полягає в тому, щоб написати програму або функцію, яка має подібну властивість: вона приймає як вхід байт і виводить ціле число, що відображає кількість разів, коли байт з'являється у вихідному коді програми. Він повинен вивести 0, якщо його вхід не відображається в його джерелі.

Ваша програма не повинна читати власний вихідний код прямо чи опосередковано, але натомість усі дані, необхідні для надання результатів, повинні бути жорстко кодованими, стилем quine. Ваша програма повинна мати принаймні один байт у довжину.

Це , тому найкоротший запис (у байтах) виграє. Я не прийму відповіді, тому сміливо змагайтесь за найкоротше рішення на своїй улюбленій мові.

Вам настійно рекомендується включити пояснення у свій пост.

Табло лідерів

Нижче наводяться таблиці лідерів як за загальною оцінкою, так і за мовою:


5
Пісочниця . (Це там з 2014 року!)
Натаніел

Чи дозволені функції чи лише повні програми?
Уріель

1
Примітка. Відповіді, подібні до цієї, вже не вважаються дійсними.
користувач202729

1
FWIW, правильне визначення quine трохи сильніше, ніж мені б дуже хотілося для цього завдання. Наприклад, я був би дуже радий побачити програму, яка використовує всіх символів у деякому суміжному діапазоні, і просто виводить 1, якщо його вхід знаходиться в цьому діапазоні, навіть якщо в цьому немає "розділу програми, який кодує інша частина програми ". З цієї причини я був би готовий дозволити приклад сітківки, хоча було б розчаровувати, якби він відмовив інших від публікації, через те, що вже був лише 1 байт. (@ user202729)
Натаніел

1
Через мій вище коментар я видалив твердження про те, що діють правила quine. (Я дотримувався частини про те, щоб не читати вихідний код.)
Натаніел

Відповіді:


15

Октава , 44 байти

@(x)sum([[39,'(())*,239==@[[]]msuxx']]==x)*2

Спробуйте в Інтернеті!

Результат функції при використанні кожного з символів функції як вхідного:

'  (  )  *  ,  2  3  9  =  @  [  ]  m  s  u  x  
2  4  4  2  2  2  2  2  4  2  4  4  2  2  2  4  

Усі інші символи введення повертають нуль.

Те, що мені довелося рятуватися, 'зробило це набагато довше. Для того, щоб врахувати 4 круглі дужки, у мене просто був дублікат у рядку. Однак дублювання апострофів займає апострофи, тож це просто відводить нас від правильного результату. Тому мені довелося підрахувати кількість апострофів з його ASCII-значення, 39. Це, звичайно, означало, що я повинен перевірити наявність персонажів, 3а 9також зробити це набагато довше.


2
Це та річ, яку я сподіваюся побачити більше. (Оптимізація проблеми, а не просто взяття стандартної королеви та додавання коду для підрахунку символів.)
Натаніел

7

Excel, 84 байти

=IFERROR(MID("65496331125442343343233",FIND(A1,"""123456789,()=MINORFADEOMEN"),1),0)

Find()буде шукати значення в комірці A1всередині рядка "123456789,()=MINORFADEOMEN( """на початку - це уникнути символу і буде оцінено просто ").

На основі результату Find(), Mid()функція поверне відповідний символ із рядка чисел. Цей рядок створювався за допомогою ітерації, поки він не перестав змінюватися.

Якщо символ A1не знайдено, Find()повертає помилку, тому IfError()функція уникає цього, щоб повернутися 0замість нього.

В OMENкінці рядка, який шукається у Find()функції, є дублікати букв, тому їх положення ніколи не повертається, але вони були потрібні для коригування кількості символів. Без них залишився нескінченний цикл зміни рахунків. Композиція літер є стилістичним вибором.


5

JavaScript (ES6), 70 байт

Не читає джерело функції, але це досить довго. Вводить введення як 1-символьний рядок.

i=>~(n='\\34=\'in(|)0257?:.>[]Odefx~'.indexOf(i))?'3733544333'[n]||2:0

Спробуйте в Інтернеті!


Ви можете скоротити цю купу, трохи переробивши, щоб зменшити кількість чітко виражених символів: i=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2(8 байтів збережено)
Yair Rand,

5

Сітківка , 1 байт

Це не було б дійсним, якщо суворо дотримуватись правил квоти, але ОП явно дозволив це у коментарі .

x

Спробуйте в Інтернеті!

У сітківці однолінійна програма підраховує виникнення цього регулярного виразу на вході. Це завдання вирішується з допомогою якого - небудь одного символу ASCII , за винятком `, ., +, *, ?, [, (, ), ^, $, \і символ нового рядка.


5

C # (компілятор Visual C #) , 88 57 байт

x=>"\\\"(())==>>??..::3300CCaaiinoossttx".Contains(x)?3:0

Спробуйте в Інтернеті!

Повертає 3, якщо рядок містить пропущений char, в іншому випадку повертає 0. Рядок містить кожен символ коду, принаймні один раз, і саме ту кількість, яку потрібно, щоб знак містився 3 рази в коді.

-31 байт завдяки Kevin Cruijssen


Гарний підхід! +1 від мене. Ви можете зберегти кілька байтів, видаливши круглі дужки навколо (a)=>і взявши введення як рядок замість char, так що .ToString()це більше не потрібно (і його a+""можна було б використовувати також для проблем з кодовим гольфом, які вам ніколи не знадобляться .ToString()). Крім того, оскільки він .Containsвже містить a, ви можете зробити вхідну змінну іншим невикористаним символом (наприклад, xабо q), щоб мати 3 для кожного символу замість 4. EDIT. Незважаючи на те, що остання частина, я бачу, "вона використовується також у 4 рази.
Кевін Кройссен

@KevinCruijssen Дякую за пораду. Але чи дійсний рядок як вхід? Вважаючи, що ОП запитував байт як вхід?
Hyarus

Поки це єдиний рядок символів, я майже впевнений, що це так. Більшість мов у будь-якому випадку можуть вводити лише рядкові значення, а деякі, у яких є символи, все ж обирають вводити як рядок (наприклад, Java, JavaScript та Japt. Формати введення та виведення, як правило, досить гнучкі. Але ви завжди можете запитати ОП у коментар, якщо ви все ще сумніваєтесь. :)
Кевін Кройсейсен

1
@KevinCruijssen звучить розумно. І якщо ми
врятуємось

2
Одиночні символьні рядки як вхідні дані мені добре.
Натаніел

4

Хаскелл , 66 байт

Перші дві версії, по суті, є квинтом, який фільтрує потрібні символи, а потім приймає довжину:

q c=length.filter(==c)$id<>show$"q c=length.filter(==c)$id<>show$"

Спробуйте в Інтернеті або випробуйте з усіма персонажами! *


Альтернатива без (<>), 72 байти

q c=length.filter(==c)$(++)<*>show$"q c=length.filter(==c)$(++)<*>show$"

Спробуйте в Інтернеті або випробуйте з усіма персонажами!


Альтернатива, не 87 86 байт

Можливо, ще можна вдосконалитись, але я щасливий, що звів це лише до трьох різних груп.

Мені подобається цей найкращий, хоча він налічує найбільше байтів. Він обчислює кількість символів / байтів на суму 2,3 і 7 (зверніть увагу на те, як деякі символи є у кількох групах):

u t=sum[fst e|e<-[(2," ()-237<=dflnst|"),(3," ()[\\]`mstu"),(7,"\",ee")],t`elem`snd e]

Спробуйте в Інтернеті або випробуйте з усіма персонажами!


* імпорт, (<>)оскільки версія GHC TIO становить 8.0.2


3

Python 2 , 54 52 32 байт

-20 байт завдяки ов

("''+.23cnotu()"*2+'"*'*3).count

Спробуйте в Інтернеті!


1
Чому ти не маєш ні лямбда, ні входу?
Стюі Гріффін

2
@StewieGriffin Python автоматично прив'язує посилання на метод, тому "xxx".countеквівалентно lambda c:"xxx".count(c).
Ніл

@StewieGriffin, і ви використовуєте обидва так само -> f="xxx".countі f=lambda c:"xxx".count(c)будете називатисяf('a')
Rod

3

Лушпиння , 11 10 8 байт

Дякую Лео за -2 байти!

#sD"#sD"

Спробуйте в Інтернеті!

Пояснення

Це гарантує, що він використовує лише ASCII (тому що showце зіпсує його) і що кожен символ міститься двічі:

#sD"#sD"  -- character as input, eg. '"'
   "#sD"  -- string literal (note the redundant '"'): "#sD"
  D       -- double: "#sD#sD"
 s        -- show: "\"#sD#sD\""
#         -- number of occurences: 2

Стандартне розширення quine, 11 байт

#hS+s"#hS+s

Спробуйте в Інтернеті!

Пояснення

#hS+s"#hS+s  -- character as input, eg. '"'
     "#hS+s  -- string literal: "#hS+s"
  S+         -- join with itself: ("#hS+s"++)
    s        -- | and itself shown: "\"#hS+s\""
             -- : "#hS+s\"#hS+s\""
 h           -- init: "#hS+s\"#hS+s"
#            -- number of occurences in string: 1

1
Ви можете керувати цитатами легше, подвоївши рядок, перш ніж показувати її: Спробуйте в Інтернеті!
Лев

3

Java 10, 164 81 57 байт

q->"q-->>\\\"..ccoonttaaiiss(())??33::00".contains(q)?3:0

Порт відповіді @Hyarus C # , тому обов'язково підтримайте його!

Пояснення:

Спробуйте в Інтернеті.

q->      // Method with String parameter and integer return-type
  "q->\\\"..ccoonttaaiiss(())??33::00".contains(q)?
         //  If the string above contains the input character
   3     //   Return 3
  :      //  Else:
   0     //   Return 0

164-байтова відповідь старої :

c->{var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";return s.format(s,34,s).replaceAll("[^"+c+']',"").length();}

Пояснення:

Спробуйте в Інтернеті.

c->{                                  // Method with char parameter and integer return-type
  var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";
                                      //  Unformatted source code
  return s.format(s,34,s)             //  Create the formatted source code (the quine),
          .replaceAll("[^"+c+']',"")  //  remove all characters not equal to the input,
          .length();}                 //  and return the length

-part:

  • Струна s містить неформатоване вихідний код.
  • %s використовується для введення цього рядка в себе за допомогою s.format(...) .
  • %c, %1$c і 34використовуються для форматування подвійних лапок.
  • s.format(s,34,s) зводить це все разом

Частина виклику:

  • .replaceAll("[^"+c+']',"") видаляє всі символи, крім тих, що дорівнюють вводу.
  • .length() то приймає довжину цієї рядка.

ПРИМІТКА: .split(c).length(із Stringвведенням замість char) може здатися коротшим, але має дві проблеми:

  1. Перший символ дає неправильний результат, тож якщо введено cc->основною частиною), він неправильно поверне один символ занадто мало. Це можна виправити, додавши +(c==99?1:0)як вихідний код, так і неформатоване вихідний код String (і змінивши .split(c)на.split(c+"") , але тоді у нас все ще є така проблема:
  2. Якщо введено символ регулярного вираження (тобто $), .splitто інтерпретуватиме його як регулярний вираз, даючи неправильний результат.

3

Хаскелл , 58 байт

f c=sum[2|x<-succ '!':"f c=sum[2|x<-succ '!':,x==c]",x==c]

Спробуйте в Інтернеті! або перевірити рішення .

Ті ж альтернативи підрахунку байтів:

f c=sum[2|x<-tail$show"f c=sum[2|x<-tail$show,x==c]",x==c]
f c=sum[1|x<-id<>show$"f c=sum[1|x<-id<>show$,x==c]",x==c]

Haskell , 90 байт

sum.($zip"1234\"$,.[\\]opu+()iklmsz652"$[4,4,11,3,3,3,16,5,3,3,3,3,3,3,3]++[2,2..]).lookup

Спробуйте в Інтернеті! або перевірити рішення . Використовує той факт, що sum Nothing = 0і напр sum (Just 4) = 4.


3

Малий розмову , 112 132 байт

Smalltalk точно не відомий своєю придатністю для гольфу :-)

Метод, визначений у класі Character (перевірений у VA Smalltalk та Squeak, повинен працювати і в інших діалектах, таких як VisualWorks та Pharo):

a^(0to:6),#(10 18)at:(#('' ',[]^|+68cForu' '#0adefln' '1it' '()' ':s' ' ' '''')findFirst:[:s|s includes:self])+1

Символи, що зустрічаються у джерелі, групуються за кількістю подій. Групи перевіряються на першу, яка містить приймач, і повертається відповідне число виникнення.

Старий метод:

a^('''''((((())))):::[[[[]]]]^^^^^0000066666aaaacccccdddddeefffFFFFFiiilllnnnnnrrrrrsssTTTTTuuuu'includes:self)ifTrue:[6]ifFalse:[0]

Кожен символ, який відображається в методі, з’являється рівно 6 разів (повторюючись у постійній константі), тому метод просто перевіряє, чи міститься приймач у рядку, і повертає 6, якщо він є, 0 інакше.

Визначивши метод як зазначений вище, ви можете перевірити його за допомогою

| code |
code := Character sourceCodeAt: #a.
((0 to: 255) collect: [:b | b asCharacter]) reject: [:c | c a = (code occurrencesOf: c)]

Результат повинен бути порожнім.


1
Ласкаво просимо до PPCG!
Мартін Ендер

2

JavaScript, 31 байт

f=c=>~-`f=${f}`.split(c).length

Спробуйте в Інтернеті


1
Я думаю, що це читає власний вихідний код, чи не так? Це прямо заборонено, жирним шрифтом у питанні.
Натаніел

1
@Nathaniel, дивіться тут .
Кудлатий

2
Хм. Ну, чесно кажучи, я думаю, що це дурно, але я не можу насправді погодитися з мета-консенсусом.
Натаніел

1
@Nathaniel Для всіх програм, які роблять eval легким, вони також роблять quine easy.
користувач202729

1
@ user202729 Я не думаю, що це випливає, чи не так? Наприклад, ви не можете зробити той же трюк у Python. Це зворотний евал, а не еваль
Натаніел



2

Haskell , 96 байт

n"n"=15;n"="=14;n" "=2;n";"=13;n"\\"=3;n"\""=25;n"0"=2;n"1"=4;n"2"=4;n"3"=4;n"4"=5;n"5"=5;n n3=0

Спробуйте в Інтернеті!

Haskell , 109 байт

n 'n'=15;n '='=14;n ' '=14;n ';'=13;n '\\'=3;n '\''=25;n '0'=2;n '1'=5;n '2'=4;n '3'=4;n '4'=5;n '5'=5;n n3=0

Спробуйте в Інтернеті!

Haskell , 122 байти

n 'n'=21
n '='=14
n ' '=14
n '\n'=12
n '\\'=4
n '\''=32
n '0'=2
n '1'=5
n '2'=5
n '3'=3
n '4'=5
n '5'=5
n nnnnnn4'''''''=0

Спробуйте в Інтернеті!

Пояснення

Ці відповіді не дуже страшні. Це серія декларацій, по одній для кожного символу, присутнього в програмі. Зрештою, у нас є спіймання всього, що повертає 0 для символів, відсутніх у програмі.

Я використовую пару хитрощів, щоб мінімізувати кількість знаків, необхідних у програмі, і звідти я поспілкувався з речами, поки цифри не виявились правильно. Ви можете бачити, що я додав ім'я змінної в останній декларації у всіх 3 з них. Різниця між трьома програмами полягає в тому, чи я вирішив використовувати новий рядок, або ;для розривів рядків, і чи вибрав я взяти Chars як вхідний або рядковий. Цей ;підхід по суті не перевершує інших, він просто отримує удачу і закінчується коротше, однак, здається, що використання Strings є кращою ідеєю, ніж Chars, оскільки Chars вимагають пробілів після назви функції Strings.


: | що трапилося з вашим правописом у поясненні
лише ASCII

2

Пробіл , 140 байт

[S S S N
_Push_0][S N
S _Duplicate][S N
S _Duplicate][T N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S S S T  S S T   N
_Push_9][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S T   N
_If_0_Jump_to_Label_TAB][S S S T    N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S N
_If_0_Jump_to_Label_NEWLINE][S S S T    S T T   S N
_Push_22][T S S T   _Subtract][N
T   S T N
_If_0_Jump_to_Label_SPACE][N
S T N
_Jump_to_Label_PRINT][N
S S S T N
_Create_Label_TAB][S S S T  S S T   S T N
_Push_37][N
S T N
_Jump_to_Label_PRINT][N
S S S N
_Create_Label_NEWLINE][S S S T  S S S S T   N
_Push_33][N
S T N
_Jump_to_Label_PRINT][N
S S T   N
_Create_Label_SPACE][S S S T    S S S T T   S N
_Push_70][N
S S N
_Create_Label_PRINT][T  N
S T _Print_as_integer]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

70 використаних пробілів, 37 вкладок та 33 нових рядків.

Зазвичай я використовую створювати етикетки в порядку NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTNі т.д. Але так як друк номер , в якому двійковий S=0/ T=1використовується впливає на кількість , мені потрібно вивести, я використовував етикетки NSSN, NSSSN, NSSTN, іNSSSTN замість того , який дав ідеальна кількість пробілів / вкладок для друку з двійковими номерами SSSTSSSSTN(33; кількість нових рядків), SSSTSSTSTN(37; кількість вкладок) та SSSTSSSTTSN(70; кількість пробілів).

Пояснення в псевдокоді:

Character c = STDIN-input as character
If c is a tab:
  Print 37
Else if c is a new-line:
  Print 33
Else if c is a space:
  Print 70
Else
  Print 0

Приклад виконання:

Вхід: пробіл

Command       Explanation                   Stack       Heap     STDIN   STDOUT   STDERR

SSSN          Push 0                        [0]
SNS           Duplicate top (0)             [0,0]
SNS           Duplicate top (0)             [0,0,0]
TNTS          Read STDIN as character       [0,0]       {0:32}   \n
TTT           Retrieve                      [0,32]      {0:32}
SSSTSSTN      Push 9                        [0,32,9]    {0:32}
TSST          Subtract top two (32-9)       [0,23]      {0:32}
SNS           Duplicate top (23)            [0,23,23]   {0:32}
NTSSTN        If 0: Jump to Label_TAB       [0,23]      {0:32}
SSSTN         Push 1                        [0,23,1]    {0:32}
TSST          Subtract top two (23-1)       [0,22]      {0:32}
SNS           Duplicate top (22)            [0,22,22]   {0:32}
NTSSN         If 0: Jump to Label_NEWLINE   [0,22]      {0:32}
SSSTSTTSN     Push 22                       [0,22,22]   {0:32}
TSST          Subtract top two (22-22)      [0,0]       {0:32}
NTSTN         If 0: Jump to Label_SPACE     [0]         {0:32}
NSSTN         Create Label_SPACE            [0]         {0:32}
SSSTSSSTTSN   Push 70                       [0,70]      {0:32}
NSTN          Jump to Label_PRINT           [0,70]      {0:32}
NSSN          Create Label_PRINT            [0,70]      {0:32}
TNST          Print as integer              [0]         {0:32}            70
                                                                                  error

Програма зупиняється з помилкою: вихід не визначений.
Спробуйте це в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).

Введення: вкладка

Натомість STDIN буде \t( 9), в цьому випадку він буде 0при першій If 0перевірці, перейде до LABEL_TAB/ NSSSTN, і натисне та надрукує37 замість нього .

Спробуйте це в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).

Вхід: новий рядок

Натомість STDIN буде \n( 10), у такому випадку він буде 0під час другої If 0перевірки, перейде до Label_NEWLINE/ NSSSN, а 33натомість натисне та надрукує .

Спробуйте це в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).

Вхід: що-небудь ще

Будь-який інший вхідний символ зробить NSTN(Перейти до Label_PRINT) після третьої If 0перевірки, надрукувавши той, 0що все ще був у стеку (який ми дублювали на самому початку).

Спробуйте це в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).


1
Це чудова мова для цього виклику.
qwr

2

Japt , 27 байт

\Ua"" a a a " ÄU\\\"a "aU Ä
            " ÄU\\\"a "     // Given this string literal,
                       aU   // find the last index of the input
                          Ä // and add +1.
\Ua"" a a a                 // Do nothing useful, but make the results match.

Довше, ніж існуюча відповідь Japt, але використовує інший підхід.
Має вроджене обмеження, що всі символи повинні виникати унікальну кількість разів.

Вводиться як рядок.

Спробуйте в Інтернеті!


2

Perl, 130 байт

+print+0+((0)x40,6,6,0,3,43,0,0,0,22,12,6,3,5,2,4,0,1,0,0,0,1,0,1,(0)x28,1,0,1,(0)x6,1,(0)x4,1,(0)x4,1,1,1,0,2,0,1,0,0,0,5)[ord<>]

Не має нової лінії чи іншого пробілу. Читає рядок зі стандартного виводу, але піклується лише про його перші байти, після чого друкує кількість разів, коли байт виникає у власному вихідному коді у десятковій частині, без нового рядка.

Програма проста. Більшість вихідних кодів займає буквальна таблиця, яка дає відповідь на кожен можливий байт. Останні нулі опущені, а сусідні нулі стискаються під час виконання, але немає іншого спеціального трюку, крім цього. Решта програми просто зчитує вхід і шукає відповідь у таблиці.

Наприклад, частина 22, 12, 6, 3, 5, 2, 4, 0, 1, 0у вихідному коді дає частоту цифр, тому у вихідному коді є 22 нулі, 12 одиниць, 6 двоє тощо. Як результат, якщо ви перейдете 0на стандартний вхід програми, програма надрукує 22.


2

C (gcc) , 1033 байт

#include <stdio.h>
int main(int argc,char *argv[]){int r=0*14811;switch((int)argv[1][0]){case' ':r=6;break;case'"':r=3;break;case'#':r=2;break;case'%':r=2;break;case'\'':r=101;break;case'(':r=5;break;case')':r=5;break;case'*':r=5*1*1;break;case'.':r=2;break;case':':r=51;break;case';':r=103;break;case'<':r=2;break;case'=':r=52;break;case'>':r=2;break;case'[':r=4;break;case'\\':r=3;break;case']':r=4;break;case'0':r=11;break;case'1':r=20;break;case'2':r=20;break;case'3':r=9;break;case'4':r=7;break;case'5':r=12;break;case'6':r=3;break;case'7':r=2;break;case'8':r=5;break;case'9':r=2;break;case'a':r=106;break;case'b':r=51;break;case'c':r=55;break;case'd':r=4;break;case'e':r=102;break;case'f':r=2;break;case'g':r=4;break;case'h':r=4;break;case'i':r=10;break;case'k':r=51;break;case'l':r=2;break;case'm':r=2;break;case'n':r=8;break;case'o':r=2;break;case'p':r=2;break;case'r':r=108;break;case's':r=53;break;case't':r=8;break;case'u':r=2;break;case'v':r=3;break;case'w':r=2;break;case'{':r=3;break;case'}':r=3;break;}printf("%d",r);}

Спробуйте в Інтернеті!

Це НЕ означає відповідь на гольф, але було цікаво намагатися виконати це завдання мовою, якою я не знайомий. Це не було особливо складним викликом, поки не прийшов час знайти цифри появи, тепер ТО це було викликом. Довелося зробити трохи креативного балансування :)


2

C (gcc) , 192 байти

F(J){J=J-70?J-40?J-41?J-74?J-'{'?J-'}'?J-39?J-48?J-49?J-50?J-51?J-52?J-53?J-54?J-55?J-56?J-57?J-47?J-61?J-63?J-45?J-58?J-59?0:1:23:23:23:1:2:3:3:4:4:14:14:10:10:15:6:4:2:2:25:1:1:1;}//84332211

Спробуйте в Інтернеті!

Ймовірно, можна покататися на гольфі далі. Використовуйте коментар наприкінці як "місце нуля" для додавання додаткових цифр. Коли мені потрібно змінити цифру з X на Y, я змінюю один з Y в подряпині на X, щоб компенсувати. Крім цього, це лише функція, яка приймає ціле число, використовуючи трюк присвоєння, щоб повернути значення, засноване на великому потрійному умовному.


Я можу зберегти 1 байт, перемістивши числову константу до нуля, як, 0*84332211як і в іншій відповіді С, але я також можу зберегти байти, переробляючи їх на менший розмір, тому я поки не збираюся заважати.
LambdaBeta

Чи можете ви зберегти байти, використовуючи перевірку діапазону на менш поширені числа? тобто якщо ми вважаємо, що 4-9 є рідкісними символами, ми можемо обробити їх усі відразу за допомогою умовної перевірки.
qwr

Майже напевно. Ми, ймовірно, можемо видалити ще більше, вибравши розумні імена для речей, щоб певні символи ніколи не з’являлися або таким чином, щоб бітові шаблони можна було використовувати (наприклад, J&1?щоб відповідати всім непарним символам). Я можу надалі це гольф, якщо знайду час для цього.
LambdaBeta

2

x86 .COM, 17 байт, суперечливий

0120 BF2001        MOV     DI,0120 (120 be the current address)
0123 B91100        MOV     CX,0011
0126 AE            SCASB
0127 7502          JNZ     012B
0129 FEC4          INC     AH
012B E2F9          LOOP    0126
012D C1E808        SHR     AX,8
0130 C3            RET

36 байт

0100 BF????        MOV     DI,(an copy of this code)
0103 B91200        MOV     CX,0012
0106 AE            SCASB
0107 7503          JNZ     010C
0109 80C402        ADD     AH,02
010C E2F8          LOOP    0106
010E C1E808        SHR     AX,8
0111 C3            RET

2
Чи не це читання - це власний код?
Разван Сокол

@RazvanSocol Я думаю, що це як рішення JavaScript
l4m2

@RazvanSocol добре, це не вимагає збереження у файлі, так що це добре. багато fungeoids та JS також роблять це
лише ASCII

Я стверджую, що ви читаєте виконаний код, який вважається "читанням власного вихідного коду". Тепер ви можете стверджувати, що струнна копія програми, як це робить більшість рішень, - це також "читання вихідного коду", але рядок не виконується.
qwr




1

x86, 42 40 байт

Тут я використовую ту саму стратегію, що й інші: Створіть рядкову копію програми з унікальними байтами, а потім поверніть 2, alякщо вхід alзнаходиться в рядку. Якщо ми дозволимо собі читати код, який фактично виконується, ми отримуємо рішення l4m2 .

Я повинен скористатися класною струнною інструкцією scasb. Наскільки мені відомо, немає дублікатів байтів, але це те, що я з легкістю накручую. Завантаження рядки адреси займає 5 байт , але я не знаю ні одного короткого рішення (64-біт leaз ripзі зміщенням займає 6 байт).

-2, стрибаючи назад, щоб уникнути використання 02 двічі.

.section .text
.globl main
main:
        mov     $0xff, %eax

start:
        push    $20             # program length
        pop     %ecx            # counter
        mov     $str, %edi      # load string

loop:
        scasb                   # if (al == *(edi++))  
        jne     loop1           
        mov     $2, %al         # ret 2
end:    ret             
loop1:
        loop    loop            # do while (--counter)
        xor     %eax, %eax      # ret 0
        jmp     end

str:    .byte 0x6a,0x14,0x59,0xbf,0xf4,0x83,0x04,0x08 
        .byte 0xae,0x75,0x03,0xb0,0x02,0xc3,0xe2,0xf8
        .byte 0x31,0xc0,0xeb,0xf9 

Hexdump (у форматі двійкового файлу elf32-i386, оскільки файл obj, на жаль, має 00байти дляstr адреси):

000003e0  6a 14 59 bf f4 83 04 08  ae 75 03 b0 02 c3 e2 f8  |j.Y......u......|
000003f0  31 c0 eb f9 6a 14 59 bf  f4 83 04 08 ae 75 03 b0  |1...j.Y......u..|
00000400  02 c3 e2 f8 31 c0 eb f9                           |....1...|

x86, 256 байт

Нудна відповідь, що є еквівалентом гігантського коментаря. Вхід cl, одразу повертає 1 дюйм al. Я дійсно відповім, коли матиму вільний час.

00000039  b0 01 c3 00 02 03 04 05  06 07 08 09 0a 0b 0c 0d  |................|
00000049  0e 0f 10 11 12 13 14 15  16 17 18 19 1a 1b 1c 1d  |................|
00000059  1e 1f 20 21 22 23 24 25  26 27 28 29 2a 2b 2c 2d  |.. !"#$%&'()*+,-|
00000069  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
00000079  3e 3f 40 41 42 43 44 45  46 47 48 49 4a 4b 4c 4d  |>?@ABCDEFGHIJKLM|
00000089  4e 4f 50 51 52 53 54 55  56 57 58 59 5a 5b 5c 5d  |NOPQRSTUVWXYZ[\]|
00000099  5e 5f 60 61 62 63 64 65  66 67 68 69 6a 6b 6c 6d  |^_`abcdefghijklm|
000000a9  6e 6f 70 71 72 73 74 75  76 77 78 79 7a 7b 7c 7d  |nopqrstuvwxyz{|}|
000000b9  7e 7f 80 81 82 83 84 85  86 87 88 89 8a 8b 8c 8d  |~...............|
000000c9  8e 8f 90 91 92 93 94 95  96 97 98 99 9a 9b 9c 9d  |................|
000000d9  9e 9f a0 a1 a2 a3 a4 a5  a6 a7 a8 a9 aa ab ac ad  |................|
000000e9  ae af b1 b2 b3 b4 b5 b6  b7 b8 b9 ba bb bc bd be  |................|
000000f9  bf c0 c1 c2 c4 c5 c6 c7  c8 c9 ca cb cc cd ce cf  |................|
00000109  d0 d1 d2 d3 d4 d5 d6 d7  d8 d9 da db dc dd de df  |................|
00000119  e0 e1 e2 e3 e4 e5 e6 e7  e8 e9 ea eb ec ed ee ef  |................|
00000129  f0 f1 f2 f3 f4 f5 f6 f7  f8 f9 fa fb fc fd fe ff  |................|

1

APL (Dyalog Classic) , 30 байт

⊢⊢⊢11-11-11-'''''''1''⊢-⍳⍳0'⍳⊢

Спробуйте в Інтернеті!

Пояснення

У APL одиночні лапки в рядках виходять подвоєнням, '''''''1''⊢-⍳⍳0'як і рядок'''1'⊢-⍳⍳0 , який містить кожен символ, що використовується в програмі.

Масиви APL за замовчуванням є 1-індексованими, а функція index-of, що цікаво, повертається 1 + max index якщо елемент не знайдено.

Отже, використовуючи index-of на рядок і вхід повертається

Input    Index    Count
'        1        10
1        4        7
⊢        6        5
-        7        4
⍳        8        3
0        10       1
<other>  11       0

Як бачимо, 11 - indexдає кількість символів у програмі. Отже, основний алгоритм є

11-'''''''1''⊢-⍳⍳0'⍳⊢

Решта - це здуття персонажів, що дозволяють їм добре вписатися в слоти.


1

R , 135 байт

Натхненний цією відповіддю Python .

Попередні версії були зламані. Завдяки @Giuseppe за вказівку на те, що pasteне потрібно, вона зберегла 18 байт або близько того. lengths(regmatches(z,gregexpr(x,z)))саме з цієї відповіді .

function(x,z=rep(c("afilo2679=:","hmpu15'","nstxz","cgr","e","()",'"',","),c(2:5,7,9,15,16)))sum(lengths(regmatches(z,gregexpr(x,z))))

Спробуйте в Інтернеті!



0

Рубін, 48 байт

->x{%q[->x{%q[].count(x.chr)*2}].count(x.chr)*2}

%q[str]є більш зручним способом написання рядкового літералу, ніж "str"тому, що він може бути вкладений всередині себе, не виходячи з нього. Тому я просто поклав весь код, крім копії всередині нього, а потім подвоїв кількість.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.