Виведіть першу позицію у вашій програмі для кожного символу введення


43

Виклик

Напишіть не порожню програму / функцію, pяка, даючи не порожній рядок вводу s, виводить позицію першого появи кожного символу sу вихідному коді p.

Наприклад, якщо ваша програма

main() { cout << magic << cin }
^0   ^5   ^10  ^15  ^20  ^25

і він отримує вхід abcd{, вихід повинен бути

[1, x, 9, x, 7] (0-based)        [2, x, 10, x, 8] (1-based)

Тут, xпредставляє будь-якої висновок , який не є допустимим для виведення позиції символу (наприклад, негативне число, 0якщо ви використовуєте індексацію 1 на основі, NaN, Inf, рядок potato, число більше довжини вашої програми, і т.д.).

Обмеження

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

Введення і виведення можуть бути зроблені в прийнятному форматі, але вони повинні бути однозначними (тільки додаткові роздільники, немає randпотоку , і стверджуючи , що відповідь де - то там), в відповідності (наприклад, xзверху завжди має бути таким же значення) і людино читабельний ; наприклад, рядок або символьний масив. Можна припустити, що вхід - це рядок (або масив) друкованих символів ASCII; не потрібно обробляти весь набір Unicode.


Користувацька кодова сторінка або недрукований файл ascii у вашому коді?

Якщо у вашій мові використовується користувацька сторінка коду (Jelly, APL тощо), ви повинні це врахувати (тому програма €æÆповинна виводити [1, x, 2]для введення даних €%æ). Використання лише символів, що не належать до ASCII, для виводу -1завжди (оскільки вхід є лише ASCII), не є правильним рішенням. Ви можете припустити, що ваша програма спочатку приймає вашу власну кодову сторінку, тобто якщо у вашій програмі є метод перетворення символу Aв ціле число 65(кодування ASCII), ви можете припустити, що тепер він перетворює 65-й символ у вашій кодовій сторінці 65.


Натхненний наступним викликом: Позитивна обізнаність


Чи має значення капіталізація?
Kritixi Lithos


@KritixiLithos Це дійсно так.
Санчіз

Якщо моя програма використовує лише індекси від 0 до 9 , чи потрібен мені роздільник або я можу вивести, наприклад 01030708070,?
Денніс

@Dennis Ні, ти ні. Це однозначно, послідовно і легко читається. Потрібний роздільник не додасть нічого цікавого до виклику, тому явно зловживайте вашою низькою кількістю байтів. ;)
Санчіз

Відповіді:


24

Python2, 55 байт

a=" )dfi(+m,nprut.';";print map(('a="'+a).find,input())

Починається з рядка, який містить усі символи, використані в коді, а потім здійснює пошук в індексах


5
Я не бачу, як це нудна відповідь. Я думаю, що використовувати стандартну квінку набагато менш цікаво, ніж це. :)
Мартін Ендер

Оскільки це Python 2, невже це не буде перервою на більшості входів ?. Якщо вона зламається, вам доведеться скористатися raw_input.
TidB

@TidB хм, я думаю, ні? який ви маєте на увазі?
Прут

@Rod Nevermind, я просто був трохи тупий. Він завжди працюватиме, коли ви введете ітерабельний файл. Дурний мене.
TidB

12

Ленгуага , 56 623 байти

Нижче - шестинадцять перших 256 байт. Решта байтів можна вибрати довільно.

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

Вихід є в байтах, як це прийнято для brainfuck та ін.

Як це працює

Це спеціально проста програма для котів ,[.,].

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


4
Хммм, я вважаю, ленгуага є єдиною мовою, де люди випереджають на три порядки ...
Санчіз

2
Lenguage - це також єдина мова, яка постійно знаходить способи обману, які навіть не могли бути конкурентоспроможними на інших мовах. : P
Денніс

Не +[,.]став би для кращого результату?
Санчіз

@Sanchises Це дозволить заощадити приблизно 12 000 байт, але також буде надруковано додатковий нульовий байт в кінці.
Денніс

2
Ну, я припускаю, що нульовий байт знаходиться на вході (навіть якщо його функція полягає у припиненні рядка), і він би
знаходився

10

Ленгуага , 1,22е7 байт

Складається з 12263215 NULбайтів, (Hex 0x00) .

Виводить а NULдля кожного символу, який не відображається в джерелі.

Порушення полягає в тому, що вхід ніколи не буде містити а NUL, тому ми завжди виводимо кількість NULs, що є в символі.

Це означає наступну програму Brainfuck

,[[-].,]

І з поломкою ...

,[[-].,]
,[    ,]    #Basic Input loop.
  [-]       #Zero out the cell.
     .      #Print it (A NUL).

Це якраз показує абсолютну силу Ленгуага як мови для гольфу. Побоюйтеся цього.


2
Такий хитрий хитрість, ви майже виграли ... Чи ви також спробували реверс, тобто 0x00 байт та 1-індексація?
Санчіз

Мені б хотілося, але Brainfuck / Lenguage (або, принаймні, перекладач, який я використовую) не може розмежовувати EOF від 0x00, тому я б не зміг реально відповісти на виклик.
Атако

Brainfuck та ін. зазвичай дозволено друкувати цілі числа у байтах, тобто ви надрукували SOH за 1, NUL за 0.
Денніс

@Sanchises Не могли б ви підтвердити, що тут справа?
Денніс

1
Не ,[>.,]буде коротше?
Джо Кінг

8

Желе , 10 9 байт

“ṾiЀƓv”v

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

Як це працює

“ṾiЀƓv”v  Main link. No arguments.

“ṾiЀƓv”   Set the left argument and the return value to s := 'ṾiЀƓv'.
        v  Execute the string s as a monadic Jelly program with argument s.

 Ṿ         Uneval; yield a string representation of s, i.e., r := '“ṾiЀƓv”'.
     Ɠ     Read one line from STDIN and evaluate it like Python would.
  iЀ      Find the index of each character in the input in r.
      v    Eval the list of indices as a monadic Jelly program with argument s.
           Why?
             This is the shortest way to add the character 'v' to the string s,
             meaning that we can use r without having to append anything.
           What?
             The v atom vectorizes at depth 1 for its left argument, meaning that
             it acts on arrays of numbers and/or characters. When fed an array of
             integers, it first converts them to strings, then concatenates the
             strings and evaluates them as a Jelly program. For example, the array
             [1, 2, 3] gets cast to the string '123', then evaluates, yielding 123.
             Something slightly different happens if the array starts with a 0. For
             example, the array [0, 1, 2] gets cast to '012' just as before, but
             Jelly views '0' and '12' as two separate tokens; numeric literals
             cannot start with a 0. Since the Jelly program is monadic, the first
             token – '0' – sets the return value to 0. Since the second token –
             '12' – is also a niladic link, the previous return value is printed
             before changing the return value to 12. Then, the program finishes
             and the last return value is printed implicitly.

8

pbrain, 402 356 340 338 329 байт

[(:<>)+,-.](>>>>>>)+([-]<<[->+>+<<]>>[-<<+>>]>>[-<+<+>>]<[->+<]<[-<->]<)+([-]+++++++[>+++++++++++++<-]>)+([-]+++++[>++++++++<-]>)+(-:<+++[->++++++<]>)+(-:++)+(-:++)+(----:+)+(-:++)+(-:+)+(-:+)+(-:+)+([-]++:++)+([>[->+>+<<]>>[-<<+>>]<:>>+:[[-]>+<]>-[<<<<[-.>]>>>>>>+>>>>>]<<[-]<<+<-]>>>)[-]>>>>>>>,[<<<<<<++<+++++++++++++:>>>>>>,]

Phew, @KritixiLithos і я працюю над цим вже 4 дні.

Друкує, 0x00якщо введення char не в програмі, індекс char (на основі 1) у шістнадцятковій формі. Спробуйте в Інтернеті!

Пояснення:

[(:<>)+,-.]
All chars listed here; like other submissions 
(>>>>>>)
@KritixiLithos added this part; I don't know what it does but saves the program
+([-]<<[->+>+<<]>>[-<<+>>]>>[-<+<+>>]<[->+<]<[-<->]<)
Comparison ;calculates z=x!=y and puts it in between x and y
Start; X _ _ _ Y
           ^
End;   X Z _ _ Y
         ^
+([-]+++++++[>+++++++++++++<-]>)
Function to add 91 to the tape
+([-]+++++[>++++++++<-]>)
Function to add 40 to the tape
+(-:<+++[->++++++<]>)
Function to add 58 to the tape
+(-:++)
Function to add 60 to the tape
+(-:++)
Function to add 62 to the tape
+(----:+)
Function to add 41 to the tape
+(-:++)
Function to add 43 to the tape
+(-:+)
Function to add 44 to the tape
+(-:+)
Function to add 45 to the tape
+(-:+)
Function to add 46 to the tape
+([-]++:++)
Function to add 93 to the tape
+([>[->+>+<<]>>[-<<+>>]<:>>+:[[-]>+<]>-[<‌​<<<[-.>]>>>>>>+>>>>>]<<[-]<<+<-]>>>)

Останньою функцією є цикл. Він проходить цикл через вибрані символи [(:<>)+,-.]за порядком і порівнює вхід з символом. Зараз я дам більш глибоке пояснення, як працює ця петля.

12-n n+2 _ n+2: _ _ _ i _ _ _ _ _ _;  n=loop counter
                  ^                ;  i=input

Стек виглядає так, перебуваючи в циклі. Цикл буде працювати, поки не 12-nбуде 0. Тоді у нас є лічильник, який є n+2. Цей лічильник також є номером функції для кожного з обраних символів. Тож коли n=0, n+2буде відповідати першому символу, тобто [. >[->+>+<<]>>[-<<+>>]<:робить саме це, перетворює лічильник на персонажа.

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

12-n n+2 _ n+2: Z _ _ i _ _ _ _ _ _;  n=loop counter
                ^                  ;  i=input

Zє, 0коли символ дорівнює вхідному чи іншому ненульовому цілому числу.

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

[[-]>+<]

Якщо Zнемає нуля, тобто символ і вхід не однакові, ми збільшуємо наступне місце пам'яті.

Після того, як ми вийдемо з цього if-заяви, ми декрементуємо наступне місце пам'яті. Тепер це місце пам’яті містить !Z. Нарешті, використовуючи це, ми виводимо індекс символу, якщо він збігається з входом, а потім насильно виходимо з циклу. В іншому випадку ми продовжуємо цикл, поки не закінчиться або не знайдеться відповідність.

[-]>>>>>>>
Clears first byte; goes to position to start program
,[<<<<<<++<+++++++++++++:>>>>>>,]
Loops inputs


6

Javascript, 34 байти

f=a=>a.map(v=>('f='+f).indexOf(v))

Він приймає введення як масив рядків, xце -1(індексація на основі 0).


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

1
@ mbomb007 Я не можу говорити про всі двигуни JavaScript, але у Firefox Function.toString працює, читаючи джерело. В один момент він випаде з ладу у налагодженнях, якби джерела вже не було, коли він намагався його прочитати. (Я нещодавно не пробував цього, оскільки налагодження налагодження настільки катастрофічні.)
Ніл

Я не думаю, що це інакше, ніж робити s='s=%s;print s%%s';print s%sв Python. Він не включає в себе f=, так що це нормально
mbomb007

1
Ти не можеш цього зробити, тому що вхід aповинен бути рядком. Для mapрядків немає функції.
манотематика

@manonthemat "Ви можете припустити, що вхід - це рядок (або масив)"
LarsW


5

Рубі, 41 88 86 71 69 67 61 56 байт

a='p$<.chrs{| #index};"';$<.chars{|c|p"a='#{a}".index c}

Thx Lynn за вбивство 6 байт


1
a='p$<.chrsm{| #index};"';p$<.chars.map{|c|"a='#{a}".index c}також повинен працювати, беручи дані від STDIN.
Лінн

4

> <> (Риба) 70 байт

 #.0+4*a5;!?l|!?f4*b+l1--naolc3*1+0.01?!|~ed+0.0+2e-{:;!?+1:i-1:r}+2:"

Напевно, найдовший> <> 1 вкладиш, який я коли-небудь робив.

Він буде друкувати вихід для кожного символу, знайденого в окремому рядку (0 індексовано).

Не знайдений символ завжди надрукує довжину коду + 1 (я міг би змінити це, якщо вважаю, що це не нормально в його поточному стані), тому в цьому випадку 71 завжди буде символом "Не знайдено".

Я підберу пояснення, як тільки знайду час.

Деякі тестові випадки;

## K = 1 \ n1 \ n71

# "# = 1 \ n69 \ n1

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

> <> мова


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


3

Clojure, 43 56 48 байт

Редагувати: Чорт про що я забув 2! Зросла з 43 до 56.

Редагувати 2: оновив зразок коду під цим текстом, оновив кількість байтів, які не включати (def f ...), а лише частину хеш-карти.

{\{ 0\\   1\  3\0   4\1 10\3 14\4 20\2 34 \} 43}

Хеш-карта складається лише з символів 01234{\\}, і вона кодує їх розташування. У хеш-картах Clojure можна використовувати функції, як показано в цьому повному прикладі ( fможе бути замінено визначенням хеш-карти):

; Keeping track of the zero-based index:
;      00000000001111111111222222222233333333334444444444
;      01234567890123456789012345678901234567890123456789
(def f {\{ 0\\   1\  3\0   4\1 10\3 14\4 20\2 34 \} 43})

(map f "0123456789{} \\abcdef") ; (4 10 34 14 20 nil nil nil nil nil 0 43 3 1 nil nil nil nil nil nil)
(apply str (keys f))            ; " 01234{\\}"

Я думаю, це враховується :)


2

JavaScript, 39 байт

p=s=>[...s].map(c=>`p=${p}`.indexOf(c))

console.log( p('mapP') )


1
Ви можете пояснити, [...s]будь ласка?
Ерресен

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

2
Читання вихідного коду заборонено
Арнольд

2

Pyth, 11 байт

xL_+N"N+_Lx

Програма, яка приймає введення а "quoted string", з будь-якими цитатами в рядку, що вийшли з попереднього \, і надрукує список нульових індексованих значень з -1для символів, що не знаходяться в джерелі.

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

Як це працює

xL_+N"N+_Lx    Program. Input: Q
xL_+N"N+_Lx"Q  Implicit quote closure and implicit input
     "N+_Lx"   Yield the string "N+_Lx"
   +N          Prepend a quote
  _            Reverse
 L          Q  Map over Q:
x               Yield the index of the character in the string
               Implicitly print

2

05AB1E , 19 байт

"'ìsvDyk,"'"ìsvDyk,

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

Це виводить -1 замість відсутніх символів.


Луїс Мендо опублікував це (злегка модифіковане) на Golf you quine for great good! , додаючи "s" і "k" до цієї квітини, також є результатом цієї відповіді. Однак я не можу взяти на себе відповідальність за цю дрібницю модифікації ... Луїс, ти можеш надіслати мені повідомлення, якщо ти хочеш переробити це, і я просто видалю його. Якщо ви хочете побачити мій успіх, перш ніж знайти це питання, перегляньте правки. Ну ... Це було значно схоже на його в один момент.


@Sanchises працює для мене!
Чарівна восьминога урна

Класно круто класно!
Санчіз

@MagicOctopusUrn Молодці !!
Луїс Мендо

2

SmileBASIC, 128 96 88 86 байт

?R<3+CD,4LINPUT(S$)WHILE""<S$?INSTR("?R<3+CD,4LINPUT(S$)WHILE"+CHR$(34),SHIFT(S$))WEND

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

Я ставлю щонайменше 1 кожного символу на початку коду: ?R<3+CD,4LINPUT(S$)WHILE"тому мені залишається зберігати лише копію програми до першого лапки.


1

Пітон, 90 88 байт

a,b,d=" ()+.7:[]efilmnor","a,b,d=\"",lambda e:[[b.find(d),a.find(d)+7][d in a]for d in e]

Тестовий випадок:

print(d("a,b(]q"))
#[0, 1, 2, 8, 15, -1]

1

З накопиченням , неконкурентоспроможним, 36 байт

Коли я сказав, що ця мова ще розвивається, я мав на увазі її. Мабуть, promptзвикли споживати всю стеку. Ось чому я не можу мати приємних речей. Спробуйте тут!

[tostr ':!' + prompt CS index out]:!

Це стандартні рамки для квінтів. В основному, :дублює функцію [...]на стеці, яка потім виконується за допомогою !. Потім внутрішня частина [...]виконується з функцією на стеку. Він кидає його в рядок, додає :!(сама програма), а потім бере рядок із prompt. CSперетворює його в символьний рядок. Рядок символів трохи відрізняється від звичайного рядка тим, що в ньому є векторні оператори. У цьому випадку indexвекторизується над входом, виводячи кожен індекс вхідного рядка в програмі, нарешті, ставиться out.

Для введення Hello, World!це дає:

(-1 27 -1 -1 2 -1 6 -1 2 5 -1 26 9)

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


1

Лушпиння , 12 байт

m€`:'""m€`:'

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

Пояснення

Пояснення використовується ¨для розмежування рядків та 'розмежування символів:

m€`:'""m€`:'  -- implicit input, for example: ¨m"a1`¨
      "m€`:'  -- string literal: ¨m€`:'¨
  `:'"        -- append character '"': ¨m€`:'"¨
m             -- map function over each character (example with 'a'):
 €            -- | index of first occurrence (1-indexed): 0
              -- : [1,6,0,0,3]

1

Java 8, 172 122 байти

a->{/*.indexOf(c)+\" ;}orh:Systmup*/for(char c:a)System.out.print("a->{/*.indexOf(c)+\\\" ;}orh:Systmup".indexOf(c)+" ");}

0-індексується та дає -1символи, які не входять до вихідного коду.

Пояснення:

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

a->{                         // Method with character-array parameter and no return-type
  /*.indexOf(c)+\" ;}orh:Systmup*/
                             //  Comment containing the remaining characters of the code
  for(char c:a)              //  Loop over the input-array
    System.out.print(        //   Print:
      "a->{/*.indexOf(c)+\\\" ;}orh:Systmup"
                             //    String containing all the characters used in the code
      .indexOf(c)+" ");}     //    Print the index of the char, plus a space as delimiter



1

Perl 5 с -pl, 43 байти

Використовується введення та друк розділених рядків для рядків -1для символів, які не відображаються в програмі.

$s=q{$_=index"\$s=q{$s};eval\$s",$_};eval$s

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


@Sanchises Виправлено зараз, вибачте за це. Ясно не читав належним чином!
Дом Гастінгс

Нема проблем. Дякуємо за те, що залучили до цього виклику нове життя!
Санчіз

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