var QUESTION_ID=162408,OVERRIDE_USER=21034;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Odpowiedzi:
Oktawa , 44 bajty
Wypróbuj online!
Wynik działania, gdy używasz każdego ze znaków w funkcji jako danych wejściowych:
Wszystkie pozostałe znaki wejściowe zwracają zero.
Fakt, że musiałem uciec,
'
wydłużył to wszystko. Aby uwzględnić 4 nawiasy, właśnie miałem duplikat w ciągu. Jednak powielanie apostrofów wymaga apostrofów, więc to prowadzi nas dalej od prawidłowego wyniku. Dlatego musiałem policzyć apostrofy z jego wartości ASCII,39
. To oczywiście oznaczało, że musieliśmy to sprawdzić dla znaków3
i9
też, co to wszystko o wiele dłużej.źródło
Excel, 84 bajty
Find()
wyszuka wartość w komórceA1
w ciągu znaków"123456789,()=MINORFADEOMEN
("""
na początku jest to znak ucieczki i to po prostu"
).Na podstawie wyniku
Find()
TheMid()
funkcja zwróci odpowiedni znak z ciągiem liczb. Ten ciąg został utworzony przez iterację, aż przestał się zmieniać.Jeśli znak w
A1
nie zostanie znaleziony,Find()
zwraca błąd, więcIfError()
funkcja ucieka przed zwrotem0
.Na
OMEN
końcu przeszukiwanego ciągu wFind()
funkcji znajdują się zduplikowane litery, więc ich pozycja nigdy nie zostanie zwrócona, ale były potrzebne do dostosowania liczby znaków. Bez nich istniała niekończąca się pętla zmieniających się liczb. Układ liter jest wyborem stylistycznym.źródło
JavaScript (ES6), 70 bajtów
Nie odczytuje źródła funkcji, ale jest to dość długie. Pobiera dane wejściowe jako ciąg 1 znaków.
Wypróbuj online!
źródło
i=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2
(zapisano 8 bajtów)Siatkówka , 1 bajt
Nie byłoby to ważne, gdyby ściśle przestrzegał zasad quine, ale OP wyraźnie zezwoliło na to w komentarzu .
Wypróbuj online!
W siatkówce program jednowierszowy zlicza wystąpienia tego wyrażenia regularnego na wejściu. Wyzwanie to jest rozwiązane przez dowolny pojedynczy znak ASCII z wyjątkiem
`
,.
,+
,*
,?
,[
,(
,)
,^
,$
,\
i linią.źródło
C # (kompilator Visual C #) ,
8857 bajtówWypróbuj online!
Zwraca 3, jeśli ciąg zawiera przekazany znak, w przeciwnym razie zwraca 0. Łańcuch zawiera co najmniej jeden znak kodu co najmniej dokładnie tyle, ile potrzeba, aby znak miał 3 razy w kodzie.
-31 bajtów dzięki Kevin Cruijssen
źródło
(a)=>
i przyjmując dane wejściowe jako ciąg zamiast znaku, aby.ToString()
nie było już konieczne (ia+""
mogło być również użyte, do wyzwań związanych z golfem, których nigdy nie będziesz potrzebować.ToString()
). Ponadto, ponieważ.Contains
zawiera juża
zmienną wejściową, możesz zmienić zmienną wejściową na inny nieużywany znak (jakx
lubq
), aby mieć 3 dla każdego znaku zamiast 4. EDYCJA: Nieważne, że ostatnia część, widzę, że"
jest teraz używana 4 razy.Haskell , 66 bajtów
Pierwsze dwie wersje to w zasadzie quine, które filtruje wymagane znaki, a następnie przyjmuje długość:
Wypróbuj online lub przetestuj ze wszystkimi postaciami! *
Alternatywnie bez
(<>)
72 bajtówWypróbuj online lub przetestuj ze wszystkimi postaciami!
Alternatywna wersja quine,
8786 bajtówMoże być jeszcze ulepszony, ale cieszę się, że udało mi się go ograniczyć tylko do trzech różnych grup.
Ten najbardziej mi się podoba, mimo że liczy najwięcej bajtów. Oblicza liczbę znaków / bajtów jako sumę 2,3 i 7 (zwróć uwagę na to, jak niektóre znaki są w wielu grupach):
Wypróbuj online lub przetestuj ze wszystkimi postaciami!
* importuje,
(<>)
ponieważ wersja GHC TIO to 8.0.2źródło
Python 2 ,
545232 bajty-20 bajtów dzięki ovs
Wypróbuj online!
źródło
"xxx".count
is equivalent tolambda c:"xxx".count(c)
.f="xxx".count
andf=lambda c:"xxx".count(c)
will be called asf('a')
Husk,
11 108 bytesThanks Leo for -2 bytes!
Try it online!
Explanation
This makes sure that it only uses ASCII (because
show
would mess it up) and that each character is contained twice:Standard quine extension, 11 bytes
Try it online!
Explanation
źródło
Java 10,
1648157 bytesPort @Hyarus' C# answer, so make sure to upvote him!
Explanation:
Wypróbuj online.
Stary quine 164-bytes answer:
Explanation:
Wypróbuj online.
quine-part:
s
contains the unformatted source code.%s
służy do wprowadzania tego ciągu do siebie za pomocąs.format(...)
.%c
,%1$c
A34
służą do formatowania podwójnych cudzysłowów.s.format(s,34,s)
łączy to wszystkoCzęść wyzwania:
.replaceAll("[^"+c+']',"")
usuwa wszystkie znaki oprócz tych równych wejściowi..length()
następnie przyjmuje długość tego ciągu.UWAGA:
.split(c).length
(zString
wejściem zamiastchar
) może wydawać się krótszy, ale ma dwa problemy:c
(c->
jako część wiodącą) zostanie wprowadzony, zwróci niepoprawnie jeden znak za mało. Można to naprawić, dodając+(c==99?1:0)
zarówno kod źródłowy, jak i niesformatowany ciąg kodu źródłowego (i zmieniając.split(c)
na.split(c+"")
, ale nadal mamy następujący problem:$
),.split
Zinterpretuje go jako wyrażenie regularne, dając niepoprawny wynik.źródło
Haskell , 58 bajtów
Wypróbuj online! lub sprawdź rozwiązanie .
Te same alternatywy dla liczby bajtów:
Haskell , 90 bajtów
Wypróbuj online! lub sprawdź rozwiązanie . Wykorzystuje fakt, że
sum Nothing = 0
i npsum (Just 4) = 4
.źródło
Smalltalk , 112
132bytesSmalltalk nie jest dokładnie znany ze swojej przydatności do gry w golfa :-)
Metoda zdefiniowana w klasie Character (przetestowana w VA Smalltalk i Squeak, powinna również działać w innych dialektach, takich jak VisualWorks i Pharo):
Znaki występujące w źródle są pogrupowane według liczby wystąpień. Grupy są testowane pod kątem pierwszej, która zawiera odbiornik, i zwracana jest liczba zgodnych wystąpień.
Stara metoda:
Every character that does appear in the method appears exactly 6 times (by being repeated in the string constant), so the method just checks whether the receiver is contained in the string and returns 6 if it is, 0 otherwise.
After defining the method as above, you can validate it using
The result should be empty.
źródło
JavaScript, 31 bytes
Try it online
źródło
Python 2, 57 bytes
Try it online!
źródło
05AB1E, 17 bytes
Try it online!
źródło
Haskell, 96 bytes
Try it online!
Haskell, 109 bytes
Try it online!
Haskell, 122 bytes
Try it online!
Explanations
These answers are not terribly sophisticated. It is a series of declarations, one for each character present in the program. At the end we have a catch all that returns 0 for characters not present in the program.
I use a couple of tricks to minimize the number of characters necessary in the program and from there I fiddled with things until the numbers turned out just right. You can see that I've padded the variable name in the last declaration, in all 3 of them. The difference between the 3 programs is whether I chose to use a new line or
;
for line breaks and whether I chose to take Chars as input or Strings. The;
approach doesn't seem inherently superior to the others it just gets luck and ends up shorter, however it does seem that using Strings is a better idea than Chars because Chars require spaces after the function name an Strings do not.źródło
Whitespace, 140 bytes
Letters
S
(space),T
(tab), andN
(new-line) added as highlighting only.[..._some_action]
added as explanation only.70 spaces, 37 tabs, and 33 new-lines used.
Usually I use the Create Labels in the order
NSSN
,NSSSN
,NSSTN
,NSSSSN
,NSSSTN
,NSSTSN
,NSSTTN
, etc. But because printing a number where the binaryS=0
/T=1
is used affects the number I need to output, I used the labelsNSSN
,NSSSN
,NSSTN
, andNSSSTN
instead, which gave the perfect amount of spaces/tabs to be printed with the binary numbersSSSTSSSSTN
(33; amount of new-lines),SSSTSSTSTN
(37; amount of tabs), andSSSTSSSTTSN
(70; amount of spaces).Explanation in pseudo-code:
Example runs:
Input: space
Program stops with an error: No exit defined.
Try it online (with raw spaces, tabs, and new-lines only).
Input: tab
STDIN will be
\t
(9
) instead, in which case it will be0
at the firstIf 0
check, goes toLABEL_TAB
/NSSSTN
, and will push and print37
instead.Try it online (with raw spaces, tabs, and new-lines only).
Input: new-line
STDIN will be
\n
(10
) instead, in which case it will be0
at the secondIf 0
check, goes toLabel_NEWLINE
/NSSSN
, and will push and print33
instead.Try it online (with raw spaces, tabs, and new-lines only).
Input: anything else
Any other input-character will do
NSTN
(Jump to Label_PRINT) after the thirdIf 0
check, printing the0
that was still on the stack (which we've duplicated at the very beginning).Try it online (with raw spaces, tabs, and new-lines only).
źródło
Japt, 27 bytes
Longer than the existing Japt answer, but uses a different approach.
Has the inherent limitation that all chars need to occur a unique number of times.
Takes input as a string.
Try it online!
źródło
Perl, 130 bytes
Has no newline or other whitespace. Reads a line from the standard output, but only cares about its first bytes, then prints the number of times that byte occurs in its own source code in decimal, without a newline.
The program is straightforward. Most of the source code is occupied by a literal table that gives the answer for the each possible byte. Trailing zeros are omitted, and adjacent zeros are run-time compressed, but there's no special trick other than that. The rest of the program simply reads the input and looks up the answer in the table.
For example, the part
22, 12, 6, 3, 5, 2, 4, 0, 1, 0
in the source code gives the frequency of digits, so there are 22 zeroes, 12 ones, 6 twos etc in the source code. As a result, if you enter0
to the standard input of the program, the program will print22
.źródło
C (gcc), 1033 bytes
Try it online!
This is by NO means a golfed answer, but it was fun to try to accomplish this challenge in a language which I am not familiar with. It wasn't a particularly difficult challenge until it came time to find the occurrences of the digits, now THAT was a challenge. Had to do a little creative balancing :)
źródło
C (gcc), 192 bytes
Try it online!
Probably possible to golf down further. Uses a comment at the end as a 'scratch space' to add extra digits. When I have to change a digit from X to Y, I change one of the Y's in the scratch to an X to compensate. Other than that this is just a function that takes an integer, using the assignment trick to return a value based on a large ternary conditional.
źródło
0*84332211
like in the other C answer, but I can also save bytes by refactoring that to be smaller, so I'm not going to bother just yet.J&1?
to match all odd characters). I may further golf this if I find the time to do so.x86 .COM, 17 bytes, controversial
36 bytes
źródło
Japt, 14 bytes
Try it
Explanation
źródło
V, 12 bytes
Try it online!
Hexdump:
źródło
Jelly, 16 bytes
Try it online!
Every character appears exactly twice.
źródło
x86,
4240 bytesHere I use the same strategy as others: Create a string copy of the program with unique bytes, then return 2 in
al
if the inputal
is in the string. If we allow ourselves to read code that is actually run, we get l4m2's solution.I got to make use of a cool string instruction
scasb
. To the best of my knowledge, there are no duplicate bytes, but this is something I'd easily screw up. Loading the string address takes 5 bytes but I'm not aware of any shorter solution (64-bitlea
ofrip
with offset takes 6 bytes).-2 by jumping backwards to avoid using
02
twice.Hexdump (of binary file format elf32-i386, as obj file unfortunately has
00
bytes forstr
address):x86, 256 bytes
Boring answer that is the equivalent of a giant comment. Input in
cl
, immediately returns 1 inal
. I'll make an actual answer when I have the free time.źródło
APL (Dyalog Classic), 30 bytes
Try it online!
Explanation
In APL, single quotes within strings are escaped by doubling, so
'''''''1''⊢-⍳⍳0'
is the string'''1'⊢-⍳⍳0
, which contain every character used in the program.APL arrays are by default 1-indexed, and the index-of function, interestingly, returns
1 + max index
if the element is not found.So, by using index-of on the string and the input returns
As one can see,
11 - index
gives the count of the character in the program. So, the basic algorithm isThe rest is bloating the character counts to allow them to fit nicely into the slots.
źródło
R, 135 bytes
Inspired by this Python answer.
Previous versions were broken. Thanks to @Giuseppe for pointing out that
paste
was not required it saved 18 bytes or so.lengths(regmatches(z,gregexpr(x,z)))
is from this answer.Try it online!
źródło
Pari/GP, 36 bytes
Try it online!
źródło
Ruby, 48 bytes
%q[str]
is a more convenient way to write a string literal than"str"
because it can be nested inside itself without any escaping. So I just put the entire code except for the copy inside it, then double the count.źródło
Jelly,
1210 bytesTry it online!
Reads a character from STDIN.
12 bytes
Try it online!
Using input from command line argument.
Also 12 bytes:
Try it online!
źródło