Skip to content

Commit ab1f804

Browse files
authored
Add K language #446. (#577)
1 parent 8301aff commit ab1f804

File tree

12 files changed

+105
-3
lines changed

12 files changed

+105
-3
lines changed

build-langs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ for %langs{ @langs || * }:p.sort -> (:key($name), :value(%lang)) {
3131
%lang<size> = $proc.out.slurp(:close).chomp.subst: /(.)B$/, {" {$0.uc}iB"};
3232

3333
# Version.
34-
if $id ~~ any <assembly brainfuck fish hexagony> {
34+
if $id ~~ any <assembly brainfuck fish hexagony k> {
3535
"langs/$id/Dockerfile".IO.slurp ~~ / ' VERSION=' (\S+) /;
3636
%lang<version> = $id eq 'assembly' ?? "DefAssembler $0" !! $0;
3737
}

config/langs.toml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,21 @@ for arg in ARGS
433433
end
434434
'''
435435

436+
[K]
437+
size = '864 KiB'
438+
version = 'a52e48b43b'
439+
website = 'https://codeberg.org/ngn/k'
440+
example = '''
441+
/Printing
442+
`0:"Hello, World!"
443+
444+
/Looping
445+
`0:$!10
446+
447+
/Accessing arguments
448+
`0:2_`argv[]
449+
'''
450+
436451
[Lisp]
437452
size = '33.6 MiB'
438453
version = 'GNU CLISP 2.49.92'

css/golfer/holes.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ input.j:not(:checked) ~ .j,
5050
input.java:not(:checked) ~ .java,
5151
input.javascript:not(:checked) ~ .javascript,
5252
input.julia:not(:checked) ~ .julia,
53+
input.k:not(:checked) ~ .k,
5354
input.lisp:not(:checked) ~ .lisp,
5455
input.lua:not(:checked) ~ .lua,
5556
input.nim:not(:checked) ~ .nim,
@@ -91,7 +92,7 @@ main svg:nth-of-type(2) {
9192

9293
@media (min-width: 95rem) {
9394
/* Increase this number when adding a language. */
94-
main { grid-template-columns: 4fr repeat(35, 1fr) }
95+
main { grid-template-columns: 4fr repeat(36, 1fr) }
9596

9697
main a { height: 1.9rem }
9798

db/a-schema.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ CREATE TYPE keymap AS ENUM ('default', 'vim');
4141
CREATE TYPE lang AS ENUM (
4242
'assembly', 'bash', 'brainfuck', 'c', 'c-sharp', 'cpp', 'cobol', 'crystal',
4343
'f-sharp', 'fish', 'fortran', 'go', 'haskell', 'hexagony', 'j', 'java',
44-
'javascript', 'julia', 'lisp', 'lua', 'nim', 'pascal', 'perl', 'php',
44+
'javascript', 'julia', 'k', 'lisp', 'lua', 'nim', 'pascal', 'perl', 'php',
4545
'powershell', 'prolog', 'python', 'raku', 'ruby', 'rust', 'sql', 'swift',
4646
'v', 'viml', 'zig'
4747
);

docker/dev.Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ COPY --from=codegolf/lang-cobol ["/", "/langs/cobol/rootfs/" ] # 4.1 M
4040
COPY --from=codegolf/lang-c ["/", "/langs/c/rootfs/" ] # 1.61 MiB
4141
COPY --from=codegolf/lang-bash ["/", "/langs/bash/rootfs/" ] # 1.19 MiB
4242
COPY --from=codegolf/lang-sql ["/", "/langs/sql/rootfs/" ] # 1.05 MiB
43+
COPY --from=codegolf/lang-k ["/", "/langs/k/rootfs/" ] # 864 KiB
4344
COPY --from=codegolf/lang-lua ["/", "/langs/lua/rootfs/" ] # 338 KiB
4445

4546
COPY run-lang.c ./

docker/live.Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ COPY --from=codegolf/lang-cobol ["/", "/langs/cobol/rootfs/" ] # 4.1 M
5353
COPY --from=codegolf/lang-c ["/", "/langs/c/rootfs/" ] # 1.61 MiB
5454
COPY --from=codegolf/lang-bash ["/", "/langs/bash/rootfs/" ] # 1.19 MiB
5555
COPY --from=codegolf/lang-sql ["/", "/langs/sql/rootfs/" ] # 1.05 MiB
56+
COPY --from=codegolf/lang-k ["/", "/langs/k/rootfs/" ] # 864 KiB
5657
COPY --from=codegolf/lang-lua ["/", "/langs/lua/rootfs/" ] # 338 KiB
5758

5859
COPY --from=0 /go/code-golf /go/esbuild.json /

hole/play.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,28 @@ type Scorecard struct {
2929
Took time.Duration
3030
}
3131

32+
func preprocessKCode(holeID, code string) string {
33+
if holeID == "quine" {
34+
length := len(code)
35+
var newCode []byte
36+
37+
// Disable implicit output by inserting a ';' before all newlines, except when
38+
// the next line begins with a space (for a continuation).
39+
for i := 0; i < length; i++ {
40+
x := code[i]
41+
if x != '\n' || i+1 < length && code[i+1] == ' ' {
42+
newCode = append(newCode, x)
43+
} else {
44+
newCode = append(newCode, ';', '\n')
45+
}
46+
}
47+
48+
return string(newCode)
49+
} else {
50+
return code + "\n"
51+
}
52+
}
53+
3254
func getAnswer(holeID, code string) (args []string, answer string) {
3355
args = []string{}
3456

@@ -148,6 +170,8 @@ func Play(ctx context.Context, holeID, langID, code string) (score Scorecard) {
148170
cmd.Args = []string{"/hexagony/Hexagony", "-d", "-"}
149171
case "j":
150172
cmd.Args = []string{"/usr/bin/j", "/tmp/code.ijs"}
173+
case "k":
174+
cmd.Args = []string{"/usr/bin/kwrapper", "/tmp/code.k"}
151175
case "javascript":
152176
cmd.Args = []string{"/usr/bin/d8", "-e", code, "--"}
153177
case "julia":
@@ -189,6 +213,9 @@ func Play(ctx context.Context, holeID, langID, code string) (score Scorecard) {
189213
switch langID {
190214
case "brainfuck", "fish", "javascript":
191215
// For these code is passed as an argument above.
216+
case "k":
217+
code = preprocessKCode(holeID, code)
218+
cmd.Stdin = strings.NewReader(code)
192219
case "php":
193220
code = "<?php " + code + " ;"
194221
fallthrough

langs/k/Dockerfile

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
FROM alpine:3.15 as builder
2+
3+
ENV VERSION=a52e48b43b
4+
5+
RUN mkdir /empty
6+
7+
RUN apk add --no-cache build-base curl
8+
9+
RUN curl -L https://codeberg.org/ngn/k/archive/$VERSION.tar.gz | tar xz \
10+
&& cd /k \
11+
&& make
12+
13+
COPY kwrapper.c /
14+
15+
RUN gcc -s -o kwrapper kwrapper.c
16+
17+
FROM scratch
18+
19+
COPY --from=0 /lib/ld-musl-x86_64.so.1 /lib/
20+
COPY --from=0 /empty /proc
21+
COPY --from=0 /empty /tmp
22+
COPY --from=0 /k/k \
23+
/kwrapper /usr/bin/
24+
25+
ENTRYPOINT ["kwrapper"]

langs/k/kwrapper.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <stdio.h>
2+
#include <string.h>
3+
#include <unistd.h>
4+
5+
int main (int argc, char *argv[]) {
6+
char buffer[4096];
7+
ssize_t nbytes;
8+
FILE *fp = fopen("/tmp/code.k", "w");
9+
10+
if (fp == 0)
11+
return 1;
12+
13+
while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), stdin)) > 0)
14+
if (fwrite(buffer, sizeof(char), nbytes, fp) != nbytes)
15+
return 2;
16+
17+
fclose(fp);
18+
19+
execv("/usr/bin/k", argv);
20+
perror("execv");
21+
}

svg/k.svg

Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)