Wyzwanie
Napisz niepusty program / funkcję, p
która, biorąc pod uwagę niepusty ciąg wejściowy s
, wyświetla pozycję pierwszego wystąpienia każdego znaku s
w kodzie źródłowym p
.
Na przykład, jeśli twój program to
main() { cout << magic << cin }
^0 ^5 ^10 ^15 ^20 ^25
i otrzymuje wejście abcd{
, wyjście powinno być
[1, x, 9, x, 7] (0-based) [2, x, 10, x, 8] (1-based)
Tutaj x
oznacza dowolną moc, która nie jest ważne wyjście na pozycji znaku (np liczba ujemna, 0
jeśli używasz indeksowanie 1 oparte NaN
, Inf
, łańcuch potato
, większa liczba niż długość Twojego programu, itp).
Ograniczenia
Czytanie kodu źródłowego jest niedozwolone (jak w prawidłowym quine). Używanie komentarzy jest dozwolone, ale wlicza się do twojego wyniku.
Dane wejściowe i wyjściowe mogą być wykonane w rozsądnym formacie, ale muszą być jednoznaczne (tylko dodatkowe ograniczniki, brak rand
strumienia i twierdzenie, że gdzieś tam jest odpowiedź), spójne (np. x
Powyższe powinno zawsze mieć tę samą wartość) i ludzkie czytelny ; na przykład ciąg znaków lub tablica znaków. Możesz założyć, że dane wejściowe to ciąg (lub tablica) drukowalnych znaków ASCII; nie trzeba obsługiwać całego zestawu Unicode.
Niestandardowa strona kodowa lub ascii do wydruku w kodzie?
Jeśli twój język używa niestandardowej strony kodowej (Jelly, APL itp.), Musisz to wziąć pod uwagę (więc program €æÆ
musi wyświetlać [1, x, 2]
dane wejściowe €%æ
). Używanie tylko znaków spoza ASCII do -1
zawsze wyjściowego (ponieważ dane wejściowe są tylko ASCII) nie jest prawidłowym rozwiązaniem. Możesz założyć, że twój program natywnie akceptuje twoją niestandardową stronę kodową, tj. Jeśli twój program ma metodę konwersji znaku A
na liczbę całkowitą 65
(kodowanie ASCII), możesz założyć, że teraz konwertuje on 65 znak na twojej stronie kodowej 65
.
Inspirowany następującym wyzwaniem: świadomość pozycyjna
01030708070
?Odpowiedzi:
Python2, 55 bajtów
Zaczyna się od ciągu zawierającego wszystkie znaki użyte w kodzie, a następnie przeszukuje indeksy
źródło
raw_input
.Lenguage , 56 623 bajtów
Poniżej znajduje się zrzut szesnastkowy pierwszych 256 bajtów. Pozostałe bajty można wybrać dowolnie.
Dane wyjściowe wyrażone są w bajtach, co jest zwyczajowo stosowane w „pieprzeniu mózgu” i in.
Jak to działa
W szczególności jest to prosty program dla kotów
,[.,]
.Kod źródłowy zawiera wszystkie 256 bajtowe wartości w kolejności, więc indeks każdego bajtu w nim odpowiada jego wartości.
źródło
+[,.]
lepszy wynik?Lenguage , 1,22e7 bajtów
Składa się z
12263215
NUL
bajtów (Hex 0x00) .Generuje znak
NUL
dla każdego znaku, który nie pojawia się w źródle.To przekłada się na następujący program Brainfuck
I z podziałem ...
To po prostu pokazuje siłę Lenguage jako języka golfowego. Bój się tego.
źródło
,[>.,]
byłby krótszy?Galaretka ,
109 bajtówWypróbuj online!
Jak to działa
źródło
pbrain,
402356340338329 bajtówUff, @KritixiLithos i ja pracujemy nad tym już od 4 dni.
Wyświetla,
0x00
jeśli znak wejściowy nie jest w programie, w przeciwnym razie indeks znaku (na podstawie 1) w postaci szesnastkowej. Wypróbuj online!Wyjaśnienie:
Ta ostatnia funkcja to pętla. Pętla przechodzi przez wybrane znaki
[(:<>)+,-.]
w kolejności i porównuje dane wejściowe ze znakiem. Teraz wyjaśnię dokładniej, jak działa ta pętla.Stos wygląda tak, gdy jest w pętli. Pętla będzie działać, dopóki nie
12-n
będzie0
. Mamy więc licznik, który jestn+2
. Ten licznik jest także liczbą funkcji dla każdego z wybranych znaków. Więc kiedyn=0
,n+2
zostaną odpowiadające pierwszego znaku, tj[
.>[->+>+<<]>>[-<<+>>]<:
robi to, konwertuje licznik na postać.Gdy wskaźnik znajdzie się w miejscu karetki, porównamy znak wytworzony ze zmiennej licznika z danymi wejściowymi, zachowując je.
Z
jest,0
gdy znak jest równy wejściowi lub innej niezerowej liczbie całkowitej w przeciwnym razie.Teraz wymyślamy instrukcję if, aby sprawdzić tę równość.
Jeśli
Z
jest niezerowe, tzn. Znak i dane wejściowe nie są takie same, zwiększamy kolejne miejsce w pamięci.Po wyjściu z tego wyrażenia if zmniejszamy następne miejsce pamięci. Teraz to miejsce pamięci zawiera
!Z
. Na koniec, używając tego, wypisujemy indeks znaku, jeśli pasuje do wejścia, a następnie wymuszamy wyjście z pętli. W przeciwnym razie kontynuujemy pętlę, dopóki się nie skończy lub nie zostanie znalezione dopasowanie.źródło
CJam ,
1412 bajtówWykorzystuje indeksowanie oparte na 0 i
-1
dla znaków, które nie pojawiają się w źródle.Wypróbuj online!
źródło
JavaScript, 34 bajty
Pobiera dane wejściowe jako tablicę ciągów,
x
jest-1
(indeksowanie 0).źródło
s='s=%s;print s%%s';print s%s
w Pythonie. Nie obejmujef=
, więc jest w porządkua
powinny być ciągiem znaków. Nie mamap
funkcji dla ciągów.C,
153152143 bajtyWypróbuj online!
źródło
Rubinowy,
41 88 86 71 69 67 6156 bajtówDzięki Lynn za zabicie 6 bajtów
źródło
a='p$<.chrsm{| #index};"';p$<.chars.map{|c|"a='#{a}".index c}
powinien również działać, pobierając dane wejściowe ze STDIN.> <> (Ryba) 70 bajtów
Prawdopodobnie najdłuższa wkładka> <> 1, jaką kiedykolwiek stworzyłem.
Wydrukuje dane wyjściowe dla każdego znaku znalezionego w osobnej linii (indeksowane 0).
Nieznany znak zawsze wydrukuje długość kodu + 1 (mógłbym to zmienić, jeśli uzna się za nie w porządku w jego obecnym stanie), więc w tym przypadku 71 zawsze będzie znakami „Nie znaleziono”.
Kiedy tylko będę miał czas, znajdę wyjaśnienie.
Niektóre przypadki testowe;
## K = 1 \ n1 \ n71
# "# = 1 \ n69 \ n1
Wypróbuj online
> <> język
źródło
Perl 6 ,
5052 bajtówTłumaczenie rozwiązania GB Ruby i rozwiązania Rod's Python .
Lambda, która wprowadza listę znaków i wyświetla listę indeksów
Nil
liczonych od zera ( dla nieistniejących znaków).EDYCJA: Naprawiono niedopatrzenie - wymagane dodanie 2 bajtów :(
źródło
Clojure,
435648 bajtówEdycja: Cholera, zapomniałem
2
! Zwiększono z 43 do 56.Edycja 2: Zaktualizowałem przykładowy kod pod tym tekstem, zaktualizowałem liczbę bajtów, których nie należy uwzględniać
(def f ...
), ale tylko część mapy mieszania.Mapa skrótów składa się tylko z postaci
01234{\\}
i koduje ich lokalizacje. W mapach skrótów Clojure można używać funkcji, jak pokazano w tym kompletnym przykładzie (f
można je zastąpić definicją map skrótów):Chyba to się liczy :)
źródło
JavaScript, 39 bajtów
źródło
[...s]
?Pyth, 11 bajtów
Program, który pobiera dane wejściowe z
"quoted string"
, z dowolnymi cudzysłowami w łańcuchu poprzedzonym znakiem poprzedzającym\
, i drukuje listę wartości o indeksie zerowym-1
dla znaków spoza źródła.Wypróbuj online!
Jak to działa
źródło
05AB1E , 19 bajtów
Wypróbuj online!
Daje to -1 zamiast brakujących znaków.
Luis Mendo opublikował to (nieco zmodyfikowane) na Golf you quine dla wielkiego dobra! dodanie „s” i „k” do tego quine również skutkuje tą odpowiedzią. Nie mogę jednak przypisać sobie tej trywialnej modyfikacji ... Luis, możesz wysłać mi wiadomość, jeśli chcesz to ponownie opublikować, a ja po prostu ją usunę. Jeśli chcesz zobaczyć moje postępy przed znalezieniem tego pytania, zobacz zmiany. Cóż ... W pewnym momencie było znacznie podobnie jak jego.
źródło
SmileBASIC,
128968886 bajtówWażną rzeczą do zrozumienia jest to, że nie jest to tak naprawdę wyzwanie. Potrzebujesz tylko kodu źródłowego do ostatniego unikalnego znaku .
Umieszczam co najmniej 1 każdego znaku na początku kodu:
?R<3+CD,4LINPUT(S$)WHILE"
więc muszę tylko przechowywać kopię programu do pierwszego znaku cudzysłowu.źródło
Python,
9088 bajtówPrzypadek testowy:
źródło
Skumulowane , niekonkurencyjne, 36 bajtów
Kiedy powiedziałem, że ten język wciąż się rozwija, miałem na myśli to. Najwyraźniej
prompt
używany do zużywania całego stosu. Dlatego nie mogę mieć miłych rzeczy. Wypróbuj tutaj!To jest standardowy szkielet quine. Zasadniczo
:
duplikuje funkcję[...]
na stosie, która jest następnie wykonywana za pomocą!
. Następnie wnętrze programu[...]
wykonuje się z funkcją na stosie. Rzuca go na ciąg, dołącza:!
(sam program), a następnie pobiera ciąg znaków za pomocąprompt
.CS
konwertuje go na ciąg znaków. Ciąg znaków różni się nieco od zwykłego ciągu tym, że ma wektoryzację operatorów. W tym przypadkuindex
wektoryzuje dane wejściowe, uzyskując każdy indeks ciągu wejściowego w programie, w końcuout
umieszczany.W przypadku danych wejściowych
Hello, World!
daje to:Próbowałem użyć tego bez quine (tj. Kodowania ciągu znaków, które pojawiają się w twoim źródle), ale w Stacked jest tylko jeden rodzaj cudzysłowu, a
'
więc dłuższe byłoby zrobienie tego rodzaju rozwiązania.źródło
Łuska , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Wyjaśnienie służy
¨
do rozdzielania ciągów znaków i'
ograniczania znaków:źródło
Java 8,
172122 bajtówIndeksowane 0 i podaje
-1
znaki, które nie są częścią kodu źródłowego.Wyjaśnienie:
Wypróbuj online.
źródło
J ,
3122 bajtówWypróbuj online!
1-indeksowany, 0 dla znaków, których nie ma w kodzie.
''
oznacza pojedynczy cytat. Znajdź każdy znak w ciągu11|1+i.~&'
, dodaj 1, modulo 11.źródło
> <> , 31 bajtów
Wypróbuj online!
Dane wyjściowe są indeksowane 1,
32
co oznacza, że znaku nie ma w kodzie.źródło
Perl 5 z
-pl
, 43 bajtówUżywa wprowadzania oddzielonego znakiem nowej linii i drukuje
-1
znaki, które nie pojawiają się w programie.Wypróbuj online!
źródło
Stax , 19 bajtów
Uruchom i debuguj
Generuje indeks oparty na 0, jeden znak na linię. Okazuje się, że jest krótszy niż modyfikacja
"34bL"34bL
napisanego wcześniej quine.źródło