Bertindak melawan garis panjang

23

Baru-baru ini, seseorang mengusulkan batas yang lebih ketat untuk panjang garis default Python:

Jelas, tidak ada program yang boleh menggunakan lebih dari 80 karakter per baris, untuk sejumlah alasan. Pertama dan terutama, untuk keterbacaan dan pemeliharaan, penting untuk memiliki standar yang kuat, sehingga kita dapat menyesuaikan lebar editor teks kita dengan tepat. Sebagai manfaat sekunder, kode dapat dengan mudah ditransfer ke media yang mungkin memiliki batasan, dan di mana menambahkan jeda baris dapat mengganggu, seperti mencetak halaman untuk ditinjau dalam rapat, atau kartu punch.

Tetapi apakah 80 karakter terlalu tinggi? Beberapa menyarankan 79, atau bahkan serendah 75, untuk memungkinkan terminal lebar 80 karakter agar sesuai dengan kode dengan beberapa kolom yang ditujukan untuk nomor baris. Jelas, pada akhirnya, lebih rendah lebih baik, karena batas bawah memungkinkan kode untuk digunakan dalam lebih banyak situasi tanpa memformat ulang.

Memperkenalkan standar max6

Tujuan Anda adalah untuk menemukan dan menunjukkan panjang garis minimum yang diperlukan oleh Bahasa Favorit Anda dengan menulis varian FizzBuzz dengan jumlah karakter paling sedikit di setiap baris.

Memasukkan

Integer, n , melalui metode apa pun yang diinginkan.

Keluaran

Cetak angka dari 1 hingga n , ( n ≥ 1, n ∈ ℤ) dipisahkan dengan jeda baris, kecuali:

  • untuk kelipatan 3 cetak "Apple"
  • untuk kelipatan 5 cetak "Pie"
  • untuk kelipatan cetak 3 dan 5 "ApplePie"

Mencetak gol

Panjang garis maksimum dalam byte, tidak termasuk jeda baris (Cr, CrLf, Lf, atau jeda standar sistem lainnya, tentukan, seperti yang diinginkan), dan panjang kode total dalam byte sebagai tiebreak.

Aturan

Semua jeda baris harus bermakna. Jeda baris yang dapat dihapus dan garis yang berdekatan langsung digabungkan tanpa berdampak pada output, harus dihilangkan.

Nick T
sumber
2
Pada pembatasan baris baru, jika menghapus grup baris baru tertentu menyebabkannya berfungsi tetapi menghapus baris baru apa pun menyebabkannya gagal, haruskah baris baru dihapus? Mereka yang penting secara sintaksis hanyalah bahwa menghilangkan beberapa dari mereka membatalkan kepentingannya.
Wheat Wizard
3
Tidak yakin bagaimana perasaan saya tentang aturan baris baru yang "bermakna". Ketika datang ke sintaks hukum, sebagian besar bahasa pemrograman tidak peduli tentang baris baru dan akan membiarkan Anda menulis seluruh program pada satu baris - lihat saja sebagian besar solusi kode-golf di sini
-P
1
Mengapa mengubahnya menjadi Apple Pie alih-alih standar
Rohan Jhunjhunwala
5
@RohanJhunjhunwala Untuk mencegah penggunaan perintah FizzBuzz bawaan.
Ørjan Johansen
2
+1 Ini sebenarnya ide yang sangat bagus untuk tantangan kode golf! Sejumlah kecil karakter per baris sepertinya tidak praktis 😅 Aku masih menyukainya
George Willcox

Jawaban:

17

> <> , 1 byte per baris, 243 161 135 byte

-26 byte terima kasih kepada Jo King!

Bahasa 2D FTW! Meskipun menulis loop dan cabang menggunakan instruksi goto bukannya struktur 2D tidak menyenangkan.

v
l
:
:
3
%
:
&
0
4
7
*
&
?
.
~
~
"
e
l
p
p
A
"
o
o
o
o
o
$
5
%
:
&
0
a
5
*
&
?
.
~
~
"
e
i
P
"
o
o
o
*
0
@
?
n
?
~
l
{
:
}
=
?
;
a
o
1

Cobalah online! , atau tonton di taman bermain ikan !

Ikan berenang ke bawah sepanjang kode, menggunakan goto bersyarat untuk melewati sesuatu tergantung pada apa yang membagi akumulator.

Saya percaya ini memenuhi spesifikasi: apa pun baris baru dihapus, ikan selalu mengenai awal v(satu-satunya instruksi yang mengubah arah), sehingga ikan selalu berenang ke bawah di kolom pertama. Dengan demikian menghapus baris baru memiliki efek hanya menghapus karakter berikutnya dari jalur ikan, dan saya tidak berpikir Anda dapat menghapus salah satu karakter tanpa mengubah output.

Bukan pohon
sumber
Berapa byte itu?
L3viathan
1
@ L3viathan, ini 243 byte. (Saya akan mengeditnya.)
Bukan pohon
1
@ L3viathan: Saya mengatur ulangnya sedikit dan sekarang 161 byte!
Bukan pohon
:( Saya rasa saya tidak bisa mengurangi jawaban saya ...
L3viathan
1
135 byte . dan inilah versi horizontal untuk referensi
Jo King
18

Haskell , 3 byte / baris, 494 471 470 463 453 450 461 byte

EDIT:

  • -26 bytes: Menghapus beberapa linebreak yang berlebihan dan marka komentar terkait, dan diubah -1+xmenjadi x-1.
  • +3 byte: Ups, perlu --baris tambahan setelahnya x-.
  • -1 byte: fDigunakan c 47:[]sebagai gantinya [c 47&0].
  • -7 byte: Pindahkan penanganan baris baru ke w.
  • -10 byte: Sebaris a="Apple"dan p="Pie"masuk #dan gunakan rekursi boneka untuk 15 kasing.
  • -3 byte: Sebaris wdalam f. Hapus berlebihan --antara xdan 15.
  • +11 byte: Ups lagi! Teori gap string saya memiliki lubang. Diperbaiki dengan memperkenalkan %fungsi. Akhirnya membuat beberapa pengujian otomatis untuk memastikan tidak ada lagi kejutan.

fmengambil Intdan mengembalikan a String.

{;f
n=
--
[--
1..
--
n--
]--
>>=
\
--
x->
--
gcd
x
15#
--
x++
--
c
47:
--
[--
]--
;1#
--
x=
--
n!!
--
(x-
--
1--
)--
;3#
--
_=
--
"A\
\p\
\p\
\l\
\e\
\"&
--
0--
;5#
--
_=
--
"P\
\i\
\e\
\"&
--
0--
;--
15#
--
_=
--
3#
--
0++
--
5#
--
0--
;n=
--
d++
--
[--
s++
--
t|
--
s<-
--
n--
,--
t<-
--
[c
9]:
--
d--
]--
;d=
--
(:
--
[--
]--
)--
<$>
--
[c
8..
--
c
0--
]--
;c
x=
--
[--
"9\
\"%
--
0--
,--
"8\
\"%
--
0..
--
]!!
--
x--
;--
[--
a]%
--
_=
--
a--
;x&
--
y=
--
x}

Cobalah online!

Pembatasan sumber tes! (Jalur 70 dikecualikan dari pengujian karena menghapus baris barunya menyebabkan loop tak terbatas tanpa output.)

Versi dengan trik meremas yang paling penting dihapus:

{;f n=[1..n]>>= \x->gcd x 15#x++c 47:[]
;1#x=n!!(x-1)
;3#_="Apple"
;5#_="Pie"
;15#_=3#0++5#0
;n=d++[s++t|s<-n,t<-[c 9]:d]
;d=(:[])<$>[c 8..c 0]
;c x=["9"%0,"8"%0..]!!x
;[a]%_=a
;x&y=x}

Bagaimana itu bekerja

  • Kode ini ditulis dalam mode tidak sensitif indentasi yang lebih jarang digunakan Haskell, dipicu misalnya dengan mengelilingi seluruh program dengan {}. Karena saya sebenarnya mendefinisikan fungsi daripada keseluruhan program, saya tidak begitu yakin bagaimana cara menghitung byte; Saya telah memilih untuk membela diri menghitung baik yang {}s dan tambahan ;pemisah deklarasi (yang terakhir biasanya menjadi baris baru dalam mode Haskell normal.)
  • Trik utama untuk membuat baris baru "bermakna" adalah --komentar baris, yang membuat baris baru tidak dapat dilepas, dan juga baris baru sebelumnya dalam kasus ketika baris sebelumnya berakhir dengan karakter operator (yang bukan bagian dari komentar baris) .
  • Trik kedua adalah "string gaps", suatu urutan spasi putih antara \garis miring terbalik dalam string literal, yang di-indentasi untuk kelanjutan garis dengan kemungkinan lekukan. Kesenjangan string dengan pembatas dihapus dari string yang diurai.
    • Jika baris baru dari celah string dihilangkan, itu menjadi garis miring terbalik yang ditambahkan dalam string. Untuk "Apple"dan "Pie"ini muncul langsung di output. Untuk "8"dan "9"pencocokan pola digunakan untuk memberikan kesalahan jika string memiliki lebih dari satu karakter.
  • Trik ketiga adalah &dan %operator, yang memungkinkan memaksa garis untuk mengakhiri karakter operator untuk trik pertama. Kita memerlukan ini untuk mengakhiri string literal, karena \"terlalu lebar untuk ditambahkan --.
    • &adalah yang umum, didefinisikan sedemikian rupa sehingga x&y=x.
    • %didefinisikan sedemikian rupa sehingga [a]%y=a, memungkinkannya untuk menggantikan !!0dan sekaligus memaksakan bahwa argumen stringnya harus memiliki panjang 1.
  • Karakter baris baru menimbulkan masalah khusus, karena \ntampaknya tidak mungkin masuk dalam string literal dengan hanya 3 byte di telepon.
    • Oleh karena itu, semakin mudah didefinisikan c x=["9"%0,"8"%0..]!!xdigunakan untuk mengkonversi dari Intkarakter ke karakter, menghitung dari digit '9'ke bawah.
  • Karena showempat karakter, angka keluaran harus diimplementasikan dengan tangan.
    • dadalah daftar string digit "1".."9".
    • nadalah daftar jumlah tak terbatas dari representasi yang ["1","2","3",...]didefinisikan secara berulang menggunakan d.
  • #mengkonversi suatu Int xke bentuk ApplePie yang diberikan argumen pertama ekstra yaitu gcddari xdengan 15.
Ørjan Johansen
sumber
6

Haskell , 7 byte / baris, 339 byte

Persyaratan agar jeda baris menjadi bermakna menjadikan ini tantangan non-sepele di Haskell. Hampir tidak ada cara untuk menyisipkan jeda baris yang tidak dapat dihapus, jadi semuanya harus dilakukan dengan pernyataan kecil yang sah.

c=cycle
h=head
i=tail
k=[1..]
s=do
 let
  _=0
  _=0
 putStr
t=take
p=print
u=fst
v=snd
z=zip
n=s"\n"
o 5=do
 s"Pie"
 n
o _=n
5%x=o 5
_%x=p x
3!x=do
 s"App"
 s"le"
 o$u x
_!x=do
 let
  y=u x
  z=v x
 y%z
q x=do
 let
  y=u x
  z=v x
 y!z
g[]=s""
g x=do
 q$h x
 g$i x
a=t 3 k
b=t 5 k
l=z$c a
m=z$c b
f n=do
 let
  x=t n
  y=x k
  z=m y
 g$l z

Cobalah online!

Anders Kaseorg
sumber
6

Jelly , 3 2 byte / baris, 106 80 56 byte

“3
,e
5P
ḍ,
T⁾
ịi
⁾e
AF
ps
,5
⁾¤
pȯ
lµ
,€
⁾Y
”Ỵ
¢Z
¢F
¢v

Baris dan kolom string literal dialihkan, jadi menghapus baris baru mengacaukan pesanan mereka.

Baris yang tersisa adalah tautan / fungsi yang terpisah dan berisi panggilan fungsi ( ¢), sehingga hanya dapat digabungkan jika panggilan fungsi dihilangkan juga.

Cobalah online!

Dennis
sumber
6

TI-BASIC, 4 byte per baris

Karena tujuannya hanya untuk meminimalkan panjang garis maksimum, beberapa garis lebih panjang dari yang seharusnya, tetapi yang terkecil yang bisa saya buat adalah garis terpanjang adalah 4 byte. Oleh karena itu saya merasa itu akan membuat kode lebih mudah dibaca jika saya menggabungkan garis yang dapat digabungkan tanpa melebihi 4 byte.

"APP
Ans→Str1
"LE
Str1+Ans
Ans→Str1
"PIE
Ans→Str2
Input N
1→I
While I≤N
fPart(I/3
not(Ans→A
fPart(I/5
not(Ans→B
If A and B
Then
Str1
Ans+Str2
Disp Ans
Else
If A
Then
Disp Str1
Else
If B
Then
Disp Str2
Else
Disp I
End
End
End
I+1
Ans→I
End

Tidak disatukan

"APPLE"→Str1
"PIE"→Str2
Input "N:",N
For(I,1,N)
remainder(I,3)=0→A
remainder(I,5)=0→B
If A and B:Then
Disp Str1+Str2
Else
If A:Then
Disp Str1
Else
If B:Then
Disp Str2
Else
Disp I
End
End
End
End

Tentang Bahasa dan Keterbatasan

TI-BASIC adalah bahasa tokenized, dan, dalam hal ini, masing-masing token adalah 1 byte dengan pengecualian dari StrNvariabel, yaitu 2 byte. Selain itu, Anda dapat meninggalkan kurung tutup sebagian besar waktu. The remainder(fungsi 2 byte, sehingga dengan itu akan membutuhkan setidaknya 5 byte (satu untuk fungsi, dua untuk argumen, dan satu untuk koma di remainder(I,3). Sebagai gantinya, saya menggunakan fPart(dan not(fungsinya untuk membuatnya lebih pendek, yang keduanya merupakan token 1 byte. Juga, Anda dapat melihat saya menggunakan variabel bawaan Anscukup banyak, karena setiap ekspresi yang dievaluasi pada sebuah baris dengan sendirinya akan disimpan secara otomatis ke dalamnya. Jadi, saya dapat menyimpan beberapa byte dengan memisahkan ekspresi dan tugas.

Strategi lain adalah untuk meminimalkan penugasan string. Metode saya untuk melakukannya tergantung pada panjang garis maksimum di sisa kode. Setelah saya menentukannya menjadi 4 byte, saya bisa menjejalkan sebanyak mungkin setiap string pada baris yang sama untuk meminimalkan jumlah tugas yang saya butuhkan. Saya melakukan ini demi keterbacaan.

Faktor pembatas dalam kode ini adalah penugasan ke variabel string dan gabungan dengan variabel string. Garis-garis Ans→Str1dan Str1+Anskeduanya total 4 byte. Saya harus menemukan cara untuk menghilangkan variabel string sepenuhnya untuk lebih meminimalkan panjang garis maksimum dalam kode saya. Segala sesuatu yang lain dapat dipersingkat menjadi maksimal 3 byte atau kurang per baris.

Masalahnya ada pada penugasan ke variabel numerik, seperti 1→I. Anda tidak dapat bermain golf lebih jauh tanpa menghasilkan solusi tanpa variabel yang panjangnya tidak melebihi 2 byte. Itu tidak mungkin terjadi untuk tantangan ini.

Operator biner suka +membutuhkan simbol operator dan argumen kiri dan kanan. Jadi tanpa ini, Anda tidak akan bisa menyatukan senar. Tanpa penggabungan string, tidak akan ada cara untuk menampilkan string yang diperlukan untuk program ini untuk menyelesaikan tantangan tanpa melebihi 2 byte dalam panjang garis. Oleh karena itu batas teoritis untuk tantangan ini dalam bahasa ini adalah 3 byte per baris, yang tidak dapat saya capai.

kamoroso94
sumber
Tetapi garis terpanjang dalam versi If A and B
golf
@jmarkmurphy TI-BASIC adalah bahasa tokenized, dan sebagian besar token diwakili oleh satu byte. Saya menyebutkan hal itu dalam uraian solusi saya. Anda dapat membaca lebih lanjut tentang itu di wiki ini .
kamoroso94
Tetapi premisnya adalah bahwa editor harus memungkinkan jumlah karakter minimum per baris. Saya ragu Anda mengetik token dengan editor. Dan saya tidak berpikir ada bahasa lain yang tidak sepenuhnya ditafsirkan menggunakan objek yang dikompilasi atau jumlah byte tokenized.
jmarkmurphy
@ jmarkmurphy sebenarnya Anda mengetik token di editor. The Anstoken 1 byte, sedangkan tiga karakter berturut-turut Ansadalah 1, 2, dan 2 byte masing-masing untuk total 5. Ini bukan string ASCII, secara harfiah token ketika Anda mengetik pada kalkulator.
kamoroso94
Ada beberapa konsensus tentang ini sudah pada meta .
kamoroso94
6

C (gcc) , 2 byte per baris, 374 368 320 310 262 byte

Saya menganggap itu bisa bermain golf sedikit lebih. Garis miring terbalik yang keluar dari baris baru membuatnya agak sepele.

i\
;\
f\
(\
n\
)\
{\
f\
o\
r\
(\
i\
=\
0\
;\
i\
+\
+\
<\
n\
;\
p\
r\
i\
n\
t\
f\
(\
i\
%\
3\
&\
&\
i\
%\
5\
?\
"\
%\
d\
\\
n\
"\
:\
i\
%\
3\
?\
"\
P\
i\
e\
\\
n\
"\
:\
i\
%\
5\
?\
"\
A\
p\
p\
l\
e\
\\
n\
"\
:\
"\
A\
p\
p\
l\
e\
P\
i\
e\
\\
n\
"\
,\
i\
)\
)\
;\
}

Cobalah online!

gastropner
sumber
@ Ørjan Johansen Ah, benar sekali.
gastropner
Anda dapat menghapus banyak garis miring terbalik, mengurangi skor tie-break Anda. Juga, tidak perlu memisahkan token dua-byte seperti &&.
Toby Speight
5

Python 3 , 4 byte / baris, 113 byte

e=\
exec
def\
f(n\
):i\
=0;\
e('\
pri\
nt(\
i%3\
//2\
*"A\
ppl\
e"+\
i%5\
//4\
*"P\
ie"\
or-\
~i)\
;i+\
=1;\
'*n)

Cobalah online!

Anders Kaseorg
sumber
Anda tahu Anda tidak perlu garis miring untuk baris baru di dalam parens?
Destructible Lemon
oh, tunggu, saya tidak membaca aturan baris baru yang berguna
Destructible Lemon
@NickT: Mengatasi perubahan aturan.
Anders Kaseorg
5

PHP 7, 2 byte per baris

(#
c#
.#
r#
.#
e#
.#
a#
.#
t#
.#
e#
.#
_#
.#
f#
.#
u#
.#
n#
.#
c#
.#
t#
.#
i#
.#
o#
.#
n#
)#
(#
'#
'#
,#
g#
.#
l#
.#
o#
.#
b#
.#
a#
.#
l#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
a#
.#
r#
.#
g#
.#
n#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
8#
+#
3#
)#
.#
w#
.#
h#
.#
i#
.#
l#
.#
e#
.#
(#
c#
.#
h#
.#
r#
)#
(#
5#
*#
8#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
i#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
7#
+#
1#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
7#
+#
1#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
8#
+#
4#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
a#
.#
r#
.#
g#
.#
n#
.#
(#
c#
.#
h#
.#
r#
)#
(#
5#
*#
8#
+#
1#
)#
.#
e#
.#
c#
.#
h#
.#
o#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
i#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
+#
1#
)#
.#
3#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
9#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
5#
*#
8#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
i#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
+#
1#
)#
.#
5#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
9#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
i#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
8#
+#
2#
)#
.#
P#
.#
i#
.#
e#
.#
(#
c#
.#
h#
.#
r#
)#
(#
5#
*#
8#
+#
1#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
8#
+#
2#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
5#
*#
8#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
)#
.#
i#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
6#
+#
1#
)#
.#
5#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
9#
)#
.#
A#
.#
p#
.#
p#
.#
l#
.#
e#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
8#
+#
2#
)#
.#
A#
.#
p#
.#
p#
.#
l#
.#
e#
.#
P#
.#
i#
.#
e#
.#
(#
c#
.#
h#
.#
r#
)#
(#
5#
*#
8#
+#
1#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
6#
*#
7#
+#
2#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
4#
*#
8#
+#
2#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
2#
*#
5#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
4#
*#
8#
+#
2#
)#
.#
(#
c#
.#
h#
.#
r#
)#
(#
7#
*#
8#
+#
3#
)#
)#
(#
)#
;#
pengguna63956
sumber
Bagaimana cara kerjanya dengan titik-titik?
L3viathan
@ L3viathan Dots menunjukkan penggabungan. Mereka digunakan untuk membangun string panjang dari karakter tunggal.
user63956
Saya tahu itu, tetapi apakah PHP hanya membuat string dari nama variabel yang tidak ditetapkan, atau bagaimana cara kerjanya? Saya tidak melihat karakter kutipan.
L3viathan
2
@ L3viathan Karakter-karakter itu adalah konstanta. Jika konstanta belum didefinisikan, PHP menggunakan namanya sebagai nilainya.
user63956
5

Aceto , 1 byte per baris, 230 byte

Yah, itu tidak menyenangkan untuk ditulis. Sebagai fungoid, struktur kontrol Aceto sangat bergantung pada sifat 2D-nya, tetapi kita dapat mengatasinya dengan banyak, banyak lolos bersyarat ( `). Satu-satunya masalah dengan itu adalah bahwa mereka mempengaruhi perintah berikutnya, terlepas dari keberadaannya (semua program Aceto adalah kuadrat, secara internal), itulah sebabnya kita perlu menyelaraskan program di beberapa tempat dengan memasukkan garis kosong di beberapa titik.

String literal tidak dapat digunakan, tetapi literal char dapat (di beberapa tempat; sekali lagi, kita perlu menyelaraskannya).

&
p
$
L
Q
`
L
p
`
L
d
`
L
Q
`
L
Q
`
L
x
`

L
M
!
%
5
d
$
L
Q
`
L
Q
`
L
p
`
L
d
`
L
Q
`
L
x
`
L
M
!
%
3
d
$
L
p
`
L
d
`
L
x
`

L
M
!
%
*
5
3
d
[
X
`

n
=
0
l
)
@
(
z
i
r
{
J
s
]
d
s
}
d
[
~
£
A
'
d
p
'

l
'

e
'

{
~
£
P
'

i
'
e
'

Dipanggil dengan 20, ini mencetak:

1
2
Apple
4
Pie
Apple
7
8
Apple
Pie
11
Apple
13
14
ApplePie
16
17
Apple
19
Pie

Semua jeda baris harus bermakna. Jeda baris yang dapat dihapus dan garis yang berdekatan digabungkan tanpa berdampak pada output, harus dihapus.

Ini tidak pernah terjadi di sini karena berjalan dari bawah ke atas.

Setidaknya ada satu tempat di mana kita dapat menyimpan 2 byte (dengan mengganti `Xdengan a |atau #), tetapi saya menyimpannya karena biaya runtime yang terkait dengan menjalankan melalui kurva Hilbert yang relatif besar.

Saya juga mengabaikan persyaratan implisit untuk menggunakan \ratau \r\nbaris baru karena saya pikir ini adalah kesalahan yang tidak disengaja oleh OP. Jika ada pengeditan atau komentar yang memperkuat persyaratan ini, saya dapat mengubahnya tanpa banyak kesulitan untuk menggunakan CR baris baru.

Bytecount didasarkan pada pengkodean pengkodean Aceto; Latin-7, di mana £satu byte.

L3viathan
sumber
Re Dengan asumsi tiga senar pada stack [...] dan penggantian ini dibiarkan sebagai latihan bagi pembaca. : Harap berikan kode lengkap yang diperlukan untuk menyelesaikan tugas yang dihadapi. Seperti, solusi Anda tidak lengkap. Itu juga tidak memiliki jumlah byte, yang merupakan tie breaker untuk solusi dengan skor 1.
Dennis
@ Dennis Saya sekarang telah mengedit jawaban untuk memberikan kode kerja penuh.
L3viathan
5

Perl 5 , 2 byte per baris, 182 byte

&
#
{'
Er
0h
|R
hR
o
'#
^#
'I
 O
Ro
3f
+~
'#
.#
(#
p#
|#
Y#
)#
}#
(#
'z
;d
y"
"z
7#
vU
aW
zZ
7#
vU
gW
..
~.
4e
r;
|6
'#
^#
('
xR
~R
KR
fR
QR
/R
$R
cR
QR
/R
vR
UR
%R
xR
$R
'#
.#
4#
))

Cobalah online!

Sintaks Perl sangat pemaaf, sehingga banyak celah dapat ditambahkan ke kode dan komentar ditambahkan, yang membuat ide inti cukup mudah. Tujuan utama dari kode ini adalah untuk membangun string yang berisi kode yang ingin kita jalankan, dan evalitu. Di Perl, dimungkinkan untuk memanggil fungsi menggunakan string atau variabel dengan &{...}notasi, sayangnya, evaltidak bisa dipanggil dalam formulir ini, tetapi evalbytes, selama Anda menyebutnya melalui CORE::namespace. Membangun string itu cukup mudah dan program ini diteruskan langsung ke panggilan ini. String dibangun menggunakan baris baru sebagai bagian dari XOR, untuk membangun ini saya menggunakan skrip ini. Agar ini tetap valid, beberapa tempat harus memiliki komentar, sehingga menghapus baris baru akan menghasilkan kode yang tidak berfungsi.

Rutinitas FizzBuzz diambil dari jawaban primo yang luar biasa .


Perl 5 , 1 byte per baris, 172 byte

Jadi, saya (sekarang) tahu ini tidak benar , karena banyak baris baru dapat dihapus, tetapi karena ini adalah pendekatan awal saya untuk masalah saya menambahkannya. Sangat menyenangkan melihat seberapa jauh Anda bisa mendorong sintaks Perl! Saya menikmati masalah ini dengan caranya sendiri, meskipun itu tidak valid.

&
{
(
I
.
'
X
0
o
k
h
~
'
.
(
p
|
Y
)
)
^
'
E
O
0
|
f
s
o
'
}
(
'
x
d
!
K
z
o
Q
U
9
$
Z
o
Q
U
?
v
.
&
%
e
*
$
6
'
^
'

c
~
"
z
f
#
.
/
W
"
c
#
.
/
W
v
U
.
l
x
;
$
4
'
^
p
)

Cobalah online!

Dom Hastings
sumber
Bukankah ini melanggar aturan "Semua jeda baris harus bermakna"?
12Me21
@ 12Me21 ya, saya baru saja melihatnya. Jadi yang pertama memecahnya jika dihapus, tetapi beberapa yang lain memang bisa dihapus, menempatkan ini sebagai panjang 2. Sial, saya menghabiskan waktu lama mendapatkan pendekatan yang bekerja dengan satu karakter per baris!
Dom Hastings
@ 12Me21 Saya pikir saya punya solusi yang berfungsi untuk 2 sekarang, saya telah menambahkan versi golf panjang 1 byte sejak saya menghabiskan waktu untuk membuatnya, aturan sialan! :)
Dom Hastings
5

SmileBASIC, 9 7 byte per baris, 159 155 154 152 byte

Ini adalah tantangan yang sangat menyenangkan. Sayangnya, aturan terhadap jeda baris yang tidak perlu menyebabkan beberapa masalah, (walaupun untungnya tidak mempengaruhi panjang garis maksimum di sini.) Saya harus menambahkan komentar di antara baris seperti A%=I/3dan A=A%*3, karena A%=I/3A=A%*3diuraikan dengan benar dalam SB. Saya dapat menggunakan trik untuk meninggalkan beberapa komentar, karena mengganti Adengan Emembuat garis itu tidak valid (Ini ada hubungannya dengan angka yang ditulis menggunakan Enotasi, saya pikir. 3EDianggap sebagai angka yang tidak valid daripada angka dan nama variabel.)

A$="App
B$="le
P$="Pie
INPUT N
R=N
WHILE R
INC I
R=I<N
A%=I/3'
A=A%*3'
A=A==I
B%=I/5
E=B%*5
E=E==I'
?A$*A;
?B$*E;
?P$*E;
C=A+E
WHILE!C
C=1?I;
WEND?
WEND

Keterbatasan terbesar di sini adalah mendapatkan masukan. INPUT xadalah cara paling sederhana yang diizinkan, alternatifnya adalah mendefinisikan suatu fungsi dengan nilai input seperti DEF F xtetapi itu masih 7 karakter. Membuat pernyataan bersyarat juga sulit; Saya tidak bisa memikirkan yang lebih pendek dari itu WHILE x.

12Me21
sumber
1
Jika A%=I/3A=A%*3secara sintaksis valid tetapi secara logis rusak, Anda tidak perlu char komentar.
Nick T
Ini diuraikan dengan benar sebagai A%=I/3dan A=A%*3, jadi komentar diperlukan.
12Me21
3

JavaScript (ES6), 3 byte per baris

Menggunakan variabel global topuntuk mengakses windowobjek, dari mana kita evalmendapatkan kode berikut:

n=prompt('')
i=0
for(;++i<=n;console.log(i%5?f||i:f+'Pie'))f=i%3?'':'Apple'

Anda harus menjalankannya di konsol karena toptidak dapat diakses dari Stack Snippet.


t//
=//
top
t//
[`\
ev\
al\
`//
]//
(`\
n=\
pr\
om\
pt\
('\
')
i=0
fo\
r(\
;+\
+i\
<=\
n;\
co\
ns\
ol\
e.\
lo\
g(\
i%\
5?\
f|\
|i\
:f\
+'\
Pi\
e'\
))\
f=\
i%\
3?\
''\
:'\
Ap\
pl\
e'\
`)
Darrylyeo
sumber
3

C #, 9 byte per baris, 248 242 230 byte

Karena C # tidak peduli dengan linebreak, perlu komentar oneline di akhir hampir (terima kasih Ørjan Johansen) setiap baris untuk mematuhi aturan. Program ini mengharapkan n sebagai argumen baris perintah. Berikut ini sebanyak mungkin baris baru yang tidak dapat dihapus:

class
A//
{//
static
void
Main//
(//
string//
[//
]//
a//
)//
{//
for//
(//
var
i//
=//
0//
;//
i++//
<//
int//
.Parse//
(//
a//
[//
0//
]//
)//
;//
)//
{//
var
s//
=//
""//
;//
if//
(//
i//
%//
3//
==//
0//
)//
s//
+=//
"A"+//
"p"+//
"p"+//
"l"+//
"e"//
;//
if//
(//
i//
%//
5//
==//
0//
)//
s//
+=//
"P"+//
"i"+//
"e"//
;//
if//
(//
s//
==//
""//
)//
s//
=//
$"{i}"//
;//
System//
.//
Console//
.//
Write//
(//
s//
+//
@"
"//
)//
;//
}//
}//
}

Tetapi karena garis terpanjang adalah 9 byte, jalur lain juga bisa mencapai itu, memotong beberapa byte:

class
A{static
void
Main(//
string[//
]a){//
for(var
i=0;i++//
<int.//
Parse(a//
[0]);){//
var 
s="";if//
(i%3==0//
)s+=//
"Apple"//
;if(i%5//
==0)s+=//
"Pie";//
if(s==//
"")s=//
$"{i}";//
System.//
Console//
.Write(//
s+@"
");}}}
Arthur Rump
sumber
Saya telah menafsirkan rangkaian sebagai "tanpa jarak antara", jadi Anda tidak perlu di //antara token yang akan menyatu bersama, seperti staticdan void.
Ørjan Johansen
@ ØrjanJohansen Terima kasih! Disimpan 6 byte
Arthur Rump
Saya pikir mungkin Anda dapat menyimpan lebih banyak byte dengan mengatur ulang var s="";if// (i%3==0// )s+=// "Apple"// ;if(i%5//.
Ørjan Johansen
Dan ada peluang serupa untuk berpindah Adari baris pertama ke baris kedua.
Ørjan Johansen
Dan juga menyimpan 3 byte dengan mengubah "\ n" menjadi @ "", dengan kutipan kedua pada baris baru, membuat baris baru itu juga diperlukan.
Arthur Rump
2

Python 2, 5 byte / baris, 93 byte

Standar max6 sudah usang.

def\
f(n):
 i=0
 \
exec\
'pri\
nt i\
%3/2\
*"Ap\
ple"\
+i%5\
/4*"\
Pie"\
or-~\
i;i+\
=1;'\
*n

Cobalah online!

Python 2 dan 3, 5 byte / baris, 100 byte

def\
f(n):
 i=0
 \
exec\
('pr\
int(\
i%3/\
/2*"\
Appl\
e"+i\
%5//\
4*"P\
ie"o\
r-~i\
);i+\
=1;'\
*n)

Cobalah online!

Anders Kaseorg
sumber
2

JavaScript, maks 6 byte / baris, 528 byte

Ide merobek dari sini .

Kode robek dari sini .

Terima kasih kepada Anders Kaseorg untuk g=eval, menghemat satu byte per baris.

a="n"
a+="="
a+="p"
a+="r"
a+="o"
a+="m"
a+="p"
a+="t"
a+="("
a+="'"
a+="'"
a+=")"
a+=";"
a+="f"
a+="o"
a+="r"
a+="("
a+="i"
a+="="
a+="0"
a+=";"
a+="+"
a+="+"
a+="i"
a+="<"
a+="="
a+="n"
a+=";"
a+="c"
a+="o"
a+="n"
a+="s"
a+="o"
a+="l"
a+="e"
a+="."
a+="l"
a+="o"
a+="g"
a+="("
a+="i"
a+="%"
a+="5"
a+="?"
a+="f"
a+="|"
a+="|"
a+="i"
a+=":"
a+="f"
a+="+"
a+="'"
a+="P"
a+="i"
a+="e"
a+="'"
a+=")"
a+=")"
a+="f"
a+="="
a+="i"
a+="%"
a+="3"
a+="?"
a+="'"
a+="'"
a+=":"
a+="'"
a+="A"
a+="p"
a+="p"
a+="l"
a+="e"
a+="'"
g=eval
g(a)

Tidak terpelihara:

n=prompt('');for(i=0;++i<=n;console.log(i%5?f||i:f+'Pie'))f=i%3?'':'Apple'
Stephen
sumber
a=""+\n"f"+\n"o"+ ...dan diakhiri dengan eval(\na)sedikit lebih pendek
Nilai Tinta
Aturan sedikit berubah (ApplePie, ambil input), tetapi skema Anda masih harus valid.
Nick T
Perubahan aturan membatalkan saran @ ValueInk, tetapi Anda masih bisa mengakhiri dengan f=evaldan f(a).
Anders Kaseorg
@AndersKaseorg terima kasih :) tidak memikirkan itu
Stephen
1
Anda dapat menyimpan byte dengan meletakkan 2 karakter di string pada baris pertama.
12Me21
2

PHP, 4 Bytes / line

for#
(#
$z=#
${#
ar.#
gn#
};#
$k#
++<#
$z#
;){#
(#
pr.#
in.#
t_.#
r)#
([#
A.#
p.p#
.le#
][#
$k#
%3#
].[#
Pie#
][#
$k#
%5#
]?:#
$k)#
;(#
pr.#
in.#
t_.#
r)#
("
");}

Cobalah online!

Jörg Hülsermann
sumber
Semua jeda baris harus bermakna. Jeda baris yang dapat dihapus dan garis yang berdekatan digabungkan tanpa berdampak pada output, harus dihilangkan.
Julian Wolf
@JulianWolf Saya telah mengubahnya
Jörg Hülsermann
2

APL (Dyalog) , 5 byte per baris

f
A'A'
p'p'
p,←p
e'e'
A,←p
l'l'
A,←l
A,←e
P'P'
i'i'
P,←i
P,←e
{O''
M3|⍵
M0=M
OM/A
M5|⍵
M0=M
MM/P
O,←M
M←⍴O
M0=M
MM/⍵
O,←M
⎕←O
}¨⍳⎕

Cobalah online!

Kritixi Lithos
sumber
2

Retina , 4 byte / baris

.+
$*      Convert the input number to unary.
1
$`1¶    Count from 1 to the input number.
111
A       Divide by 3.
+`A1
1111    If there was a remainder, restore the original number.
A{5}
AP      If the number is divisible by 3, try to divide by 5. 
.*A     The result ends in `AP` if the number is divisible by 15,
Appl    or in `A` if it is only divisible by 3. Replace everything
l       up to the `A` with `Apple`; multiples of 15 become `AppleP`.
le
1{5}    If the number did not divide by 3, try dividing it by 5 anyway.
P
+`P1    If there was a remainder, restore the original number.
6$*1    Otherwise replace the result with `Pie`,
P+      which also fixes multiples of 15.
Pie     If the number was divisible by neither 3 nor 5,
1+      convert it back to decimal.
$.&

Cobalah online!

Neil
sumber
2

R , 10 byte per baris, 800 byte

Aturan "linebreaks yang bermakna" membuat ini menantang. Saat ini ini hanya menjabarkan kode fizzbuzz ke dalam string dan kemudian menjalankannya.

a="x"
a[2]="="
a[3]="y"
a[4]="="
a[5]="1"
a[6]=":"
a[7]="s"
a[8]="c"
a[9]="a"
a[10]="n"
a[11]="("
a[12]=")"
a[13]=";"
a[14]="y"
a[15]="["
a[16]="3"
a[17]="*"
a[18]="x"
a[19]="]"
a[20]="="
a[21]="'"
a[22]="A"
a[23]="p"
a[24]="p"
a[25]="l"
a[26]="e"
a[27]="'"
a[28]=";"
a[29]="y"
a[30]="["
a[31]="5"
a[32]="*"
a[33]="x"
a[34]="]"
a[35]="="
a[36]="'"
a[37]="P"
a[38]="i"
a[39]="e"
a[40]="'"
a[41]=";"
a[42]="y"
a[43]="["
a[44]="1"
a[45]="5"
a[46]="*"
a[47]="x"
a[48]="]"
a[49]="="
a[50]="'"
a[51]="A"
a[52]="p"
a[53]="p"
a[54]="l"
a[55]="e"
a[56]="P"
a[57]="i"
a[58]="e"
a[59]="'"
a[60]=";"
a[61]="w"
a[62]="r"
a[63]="i"
a[64]="t"
a[65]="e"
a[66]="("
a[67]="y"
a[68]="["
a[69]="x"
a[70]="]"
a[71]=","
a[72]="'"
a[73]="'"
a[74]=")"
t=toString
g=gsub
o=", "
l=""
f=t(a)
r=g(o,l,f)
P=parse
p=P(t=r)
eval(p)

Cobalah online!

Berikut ini adalah kode ApplePie yang digabungkan (diadaptasi dari golf MickyT di sini ).

x=y=1:scan()
y[3*x]='Apple'
y[5*x]='Pie'
y[15*x]='ApplePie'
write(y[x],'')

Dan kode parsing versi ungolfed:

eval(t=parse(gsub(", ", "", toString(a))))

Di sini saya gunakan toStringuntuk menggabungkan daftar simbol amenjadi satu string. Namun, perilaku default adalah memisahkan masing-masing simbol dengan ,, jadi kami menelepon gsubuntuk menggantinya dengan nol. Lalu kami berikanparse dan evaluntuk melakukan pekerjaan kotor.

Mungkin saja ada pendekatan yang tidak menggunakan metode parsing string ini dan hanya menerapkan fizzbuzz, tetapi bagi saya tampaknya menggunakan foratau whileatau mendefinisikan functiongaris yang lebih panjang dari pendekatan saat ini.

rturnbull
sumber
2

Ruby, 10 5 byte / baris, 354 214 byte

-140 byte dari skor mentah dari @NieDzejkob.

eval\
"pu"\
"ts"\
" ("\
"1."\
".g"\
"et"\
"s."\
"to"\
"_i"\
")."\
"ma"\
"p{"\
"|i"\
"|i"\
"%1"\
"5<"\
"1?"\
":A"\
"pp"\
"le"\
"Pi"\
"e:"\
"i%"\
"5<"\
"1?"\
":P"\
"ie"\
":i"\
"%3"\
"<1"\
"?:"\
"Ap"\
"pl"\
"e:"\
"i}"

Bagaimana itu bekerja

Ruby akan secara otomatis menggabungkan urutan string literal (kecuali untuk literal karakter tunggal seperti ?a) dalam pernyataan yang sama. Itu berarti x = "a" 'b' "c" %q{d}setara dengan x = "abcd". Kami menggunakan ini untuk membagi kode seperti FizzBuzz menjadi string yang jauh lebih kecil untuk dipanggil eval, karena +akan membatalkan program karena aturan menghapus-baris baru, tetapi \akan menyebabkan kesalahan sintaksis jika baris baru dihapus!

Nilai Tinta
sumber
Saya baru saja akan mengirimkan sesuatu yang serupa
dkudriavtsev
Aturan sedikit berubah ('ApplePie, ambil input), tetapi skema Anda harus tetap valid.
Nick T
Anda dapat menyimpan banyak byte dengan menambahkan dua karakter ke string di setiap baris.
NieDzejkob
@NieDzejkob mekanisme penilaian utama di sini adalah byte per baris, artinya lebih baik mengorbankan total bytecount untuk mengurangi panjang garis.
Nilai Tinta
@NieDzejkob nvm Saya mengerti maksud Anda sekarang, itu karena evalbaris awal lebih panjang dari yang lain, kan?
Nilai Tinta
1

Julia 0,6 , 5 byte per baris, total 168 byte

f=#
n->#
((i,#
a=#
"A"*#
"p"*#
"p"*#
"l"*#
"e",#
p=#
"P"*#
"i"*#
"e"#
)->#
["$i
","$a
","$p
",a*#
p*"
"][#
1+(i#
%3<1#
)+2(#
i%5<#
1)]#
|>[#
print
sin#
][1]#
).(#
1:n)

Cobalah online!

Ini printmembawa ini tak terhindarkan (afaict) ke dalam 5 byte per wilayah baris.

Tidak Disatukan:

function f_ungolfed(n)
  inner = (i,
           a="Apple",
           p="Pie") -> ["$i\n",
                        "$a\n",
                        "$p\n",
                        a*p*"\n"][
                                    1 + (i%3 < 1) + 2(i%5 < 1)
                                   ] |> [print; sin][1]
  inner.(1:n)
end

*adalah operator rangkaian string, jadi a*p*"\n"membentuk "ApplePie \ n". |>adalah operator fungsi chaining (/ perpipaan), sehingga string yang dipilih akan dikirim sebagai argumen untuk print. Tidak sindigunakan, itu hanya ada karena printperlu dalam array untuk memiliki spasi putih yang signifikan setelah itu (menggunakan# trik setelah itu akan membawa jumlah byte per baris max ke 6).


Jika hanya mengembalikan output sebagai array diperbolehkan, itu dapat dilakukan dengan 4 byte max per baris:

Julia 0,6 , 4 byte per baris, total 152 byte

f=#
n->#
((i#
,a=#
"A"#
*#
"p"#
*#
"p"#
*#
"l"#
*#
"e"#
,p=#
"P"#
*#
"i"#
*#
"e"#
)->#
[i,#
a,p#
,a*#
p][#
1+(#
i%3#
<1#
)+#
2(i#
%5<#
1)]#
).(#
1:n#
)

Cobalah online!

Fungsi yang mengambil n dan mengembalikan array yang berisi output yang diharapkan. Panjang garis maks di sini dibatasi oleh n->- Julia perlu bahwa dalam satu baris untuk menguraikannya dengan benar sebagai awal dari lambda.

sundar - Pasang kembali Monica
sumber
1

Pascal (FPC) -Sew , 6 byte per baris, 348 320 byte

var
n,i://
word//
;begin
read//
(n);//
for
i:=1to
n do
if 0=i
mod
15then
write{
$}(//
'A',//
'p',//
'p',//
'l',//
'e',//
'P',//
'i',//
'e',//
#10)//
else
if 0=i
mod
3then
write{
$}(//
'A',//
'p',//
'p',//
'l',//
'e',//
#10)//
else
if 0=i
mod
5then
write{
$}(//
'P',//
'i',//
'e',//
#10)//
else
write{
$}(i//
,#10//
)end.

Cobalah online!

Memanfaatkan FPC untuk mendapatkan 6 byte per baris; tanpanya, hasilnya akan jauh lebih buruk. Ini adalah lebar garis sekecil mungkin karena sesudahnya writeharus salah satu ;atau ((atau spasi kosong yang tidak perlu), jadi komentar khusus dimasukkan untuk menghindari ini. Fitur-fitur dari FPC yang mempengaruhi jawaban ini adalah:

  1. // - Memulai komentar satu baris.
  2. Blokir komentar dalam bentuk {$<something>...}adalah arahan kompiler. Jika arahan tidak ada, FPC akan mengeluarkan peringatan (dan {$ ...}juga pada). Dalam program ini, {dan$ dipisahkan dengan baris baru yang akan mengeluarkan peringatan saat dihapus.
  3. -Sew- Kompiler juga menghentikan peringatan sehingga {dan $bergabung menghentikan kompilasi.
AlexRacer
sumber
1

Japt , 3 byte per baris

Hampir berhasil menurunkannya menjadi dua byte per baris, tetapi pengembalian dari peta akan pecah jika diikuti oleh baris baru.
Implementasi FizzBuzz sendiri dari thread FizzBuzz kanonik .


`A
p
p
l
e
`y
Vx
`P
i
e
`y
Xx
ò1\
 Ë\
;W\
pD\
v3\
)+\
Yp\
Dv\
5)\
ªD\
÷

Cobalah online!

Nit
sumber
1

LOLCODE , 18 8 byte per baris, total 303 byte

HAI 1.2
I HAS A…
B ITZ 0
IM IN…
YR L
B R SUM…
OF B AN…
1
MOD OF…
B AN 15
WTF?
OMG 0
VISIBLE…
"Apple"…
"Pie"
OMGWTF
MOD OF…
B AN 5
WTF?
OMG 0
VISIBLE…
"Pie"
OMGWTF
MOD OF…
B AN 3
WTF?
OMG 0
VISIBLE…
"Apple"
OMGWTF
VISIBLE…
B
OIC
OIC
OIC
BOTH…
SAEM B…
AN 100
O RLY?
YA RLY
GTFO
OIC
IM…
OUTTA…
YR L
KTHXBYE

Cobalah online!

-10 byte per baris menggunakan karakter garis-kelanjutan , terima kasih kepada Ørjan Johansen!

JosiahRyanW
sumber
Anda bisa mendapatkan yang ke 8 dengan ... karakter garis kelanjutan. Cobalah online!
Ørjan Johansen
Saya belajar sesuatu yang baru tentang esolang ini setiap hari. Terima kasih, Oerjan!
JosiahRyanW
0

Python 2 , 5 byte / baris

exec\
'f\
o\
r\
 \
x\
 \
i\
n\
 \
x\
r\
a\
n\
g\
e\
(\
1\
,\
i\
n\
p\
u\
t\
(\
)\
+\
1\
)\
:\
\n\
 \
i\
f\
 \
x\
%\
1\
5\
=\
=\
0\
:\
s\
="\
A\
p\
p\
l\
e\
P\
i\
e"\
\n\
 \
e\
l\
i\
f\
 \
x\
%\
5\
=\
=\
0\
:\
s\
="\
P\
i\
e"\
\n\
 \
e\
l\
i\
f\
 \
x\
%\
3\
=\
=\
0\
:\
s\
="\
A\
p\
p\
l\
e"\
\n\
 \
e\
l\
s\
e\
:\
s\
=\
x\
\n\
 \
p\
r\
i\
n\
t\
(\
s\
)'

Cobalah online!

Martmists
sumber
Cermat! 'z\"'berarti hal yang sama dengan 'z\so "', jadi aturan baris baru yang berlebihan berarti Anda tidak diizinkan memulai garis kelanjutan di dalam string ".
Anders Kaseorg
@AndersKaseorg berhasil r'...'sekarang
Martmists
Ini melempar SyntaxError.
Erik the Outgolfer
TIO berhenti satu nomor lebih awal. Juga, aturan berubah dari menggunakan FizzBuzzke menggunakan ApplePie.
Ørjan Johansen
0

JavaScript (ECMAScript6), 2 byte per baris

'\
'[
'\
b\
i\
g'
][
'\
c\
o\
n\
s\
t\
r\
u\
c\
t\
o\
r'
][
'\
c\
a\
l\
l'
](
0,
`\
n\
=\
p\
r\
o\
m\
p\
t\
(\
'\
'\
)\
;\
i\
=\
0\
;\
f\
o\
r\
(\
;\
+\
+\
i\
<\
=\
n\
;\
c\
o\
n\
s\
o\
l\
e\
.\
l\
o\
g\
(\
i\
%\
5\
?\
f\
|\
|\
i\
:\
f\
+\
'\
P\
i\
e\
'\
)\
)\
f\
=\
i\
%\
3\
?\
'\
'\
:\
'\
A\
p\
p\
l\
e\
'\
`)
()


Penjelasan panjang

Cara kita membuat garis lebih pendek adalah mentransformasikan kode menjadi string dan keluar dari ujung garis, ini akan memaksakan batas 2bytes per baris.

Jadi alert(1)menjadi

"\
a\
l\
e\
r\
(\
1\
)"

Tetapi sekarang kode Anda adalah sebuah string sehingga kami perlu menjalankan string sebagai kode. Saya tahu setidaknya 4 cara Anda dapat mengeksekusi string sebagai kode:

  1. eval (kode) . Yang membutuhkan setidaknya 5 byte untuk meneleponeval(
  2. setTimeout (kode, batas waktu) . Menjalankan berfungsi secara asinkron, tetapi secara opsional jika Anda melewatkan sebuah string, ia akan memanggil eval secara internal.
  3. Anda dapat memanfaatkan DOM dan memasukkan kode Anda ke dalam a onclick="" atribut, tetapi saya tidak dapat mengatur untuk membuat bagian pembuatan elemen menjadi pendek.
  4. Memanggil Function constructor Function baru () akan mem-parsing kode Anda ke dalam fungsi anonim yang dapat Anda panggil nanti (saya menggunakan ini).

Semua kehidupan fungsi asli dalam jendela objek dan di javascript Anda dapat mengakses properti obyek menggunakan notasi dot sehingga eval()menjadi window.eval(), atau Anda dapat mengakses properti menggunakan notasi bracket window['eval']() . Anda dapat memanfaatkan ini untuk memecah evaldalam beberapa baris menggunakan metode yang dijelaskan sebelumnya. Tetapi Anda masih harus mengetikkan jendela , satu triknya adalah jika Anda tidak berada di dalam bingkai, variabel teratas juga adalah jendela, jadi window.eval menjadi top.eval (kurang 3 byte).

w=top
w['eval']

You can shorten the assignment using parenthesis
w=(
top
)
w[
'e\
av\
al'
](
/*string*/
)

Jadi ini akan membuat kode minimal 3 byte. Untuk membuat kode 2 byte saya menggunakan new Function(/*string*/);konstruktor, tetapi saya harus kreatif untuk mengaksesnya tanpa harus mengetiknya.

Pertama, konstruktor Fungsi memungkinkan Anda untuk menyebutnya sebagai fungsi yang menghilangkan kata kunci baru, ini mengurangi 4 byte tetapi juga penting karena alasan lain. Memanggil konstruktor sebagai fungsi masih mengembalikan sebuah instance yang memungkinkan kita beralih new Function(code)ke Function(code). Hal penting lainnya adalah bahwa konstruktor fungsi memiliki callmetode yang memungkinkan Anda memanggil fungsi apa pun tetapi mengabaikan referensi ini, dan konstruktor fungsi itu sendiri adalah fungsi yang Anda dapat memanggil metode seperti itu Function.call(null, code).

Semua fungsi asli adalah turunan dari Function constructor, dan semua objek di javascript memiliki properti constructor . Jadi Anda dapat memiliki akses Function constructor pada fungsi asli seperti apa pun alert.constructor, dan menggunakan metode panggilan kita dapat mengeksekusi constructor sebagai sebuah fungsi. Sekarang kita memiliki alert.constructor.call (null, code) mengembalikan fungsi.

menggabungkan teknik sebelumnya kita bisa mengubahnya menjadi alert['constructor']['call'](null, code)

Sekarang kita hanya perlu menemukan fungsi atau metode bernama singkat, jadi saya memilih metode big () di dalam konstruktor String. Jadi saya bisa mengaksesnya langsung dari string kosong"".big

"".big.constructor.call(null, "code")();
''['big']['constructor']['call'](0,'/* code */')() 

Kemudian saya memecahkan semua hal dalam 2 byte

Singkat er penjelasan (TLDR)

Saya mengakses konstruktor Function (code) baru untuk mengurai string dan bukannya eval (code) . Konstruktor ini tersedia di setiap fungsi asli dengan melakukan Fungsi apa pun. konstruktor , seperti alert.constructor===Function. Saya menggunakan fungsi / metode di dalam String.prototype.big String.prototype.big.constructor.call(null, /*string*/) Tetapi mengaksesnya langsung dari string literal "".bigdan mengubahnya ke notasi braket . ""['big']['constructor']['call'](0, CODE)untuk dapat memecahkannya menggunakan \.

Vitim.us
sumber
1
Sayangnya, saya pikir ini tidak valid karena misalnya ada jeda baris antara 'dan ]dapat dihapus dan program akan tetap berjalan dengan sukses.
darrylyeo
Saya tidak bisa memikirkan cara lain untuk memberikan ini lebar 2. Tapi karena kami memiliki pendekatan yang hampir sama , mungkin Anda dapat menambahkan versi yang disesuaikan dari penjelasan Anda ke jawaban saya, jadi tidak semua hilang?
darrylyeo
0

Pip , 3 byte per baris, total 72 byte

V@Y
YUW
Y"L
a
P
S
T
[
`
A
p
p
l
e
`
`
P
i
e
`
]
X
!
*
+
+
i
%
^
3
5
|
i"

Cobalah online!

Pip sangat fleksibel tentang spasi putih, jadi satu-satunya strategi yang tampaknya layak adalah membuat string, memodifikasinya dengan cara yang mengharuskan baris baru tidak terganggu, dan evaluasi itu.

Kami membuat string di mana setiap karakter lain adalah baris baru, dan mengambil setiap karakter lain menggunakan UW(tidak berombak) dan tidak terarah @(dapatkan elemen pertama):

UW"abcdef"  => ["ace" "bdf"]
@UW"abcdef" => "ace"

Hasilnya @UWharus berupa kode ApplePie kami, yang diadaptasi dari solusi FizzBuzz di sini . Jika ada baris baru dalam string yang dihapus, ini tidak akan menghasilkan kode lengkap, memberikan kesalahan sintaks atau output yang salah.

Masih ada dua baris baru di luar string. Kami membuat ini wajib dengan menggunakan Yoperator (yank) - yang di sini bertindak sebagai no-op - bersama dengan cara Pip mem-parsing huruf besar:

YUW   => Y UW
YUW Y => Y UW Y
YUWY  => YU WY

Jadi jika baris baru ini dihapus, program mem-parsing berbeda dan tidak melakukan apa yang seharusnya.

DLosc
sumber
0

Java 8, 7 byte per baris, 171 byte

Void lambda mengambil int. Saya menduga ini mematuhi persyaratan tentang baris baru, tetapi saya tidak dapat membuktikannya, dan memverifikasi dengan brute force akan memakan waktu sekitar satu bulan di komputer saya. Begitu seterusnya.

a->{//
System
s=//
null;//
for(int
i=0;i//
<a;)s//
.out.//
print//
((++i//
%3*(i//
%5)<1//
?(i%3//
<1?//
"App"//
+"le"//
:"")+//
(i%5<//
1?//
"Pie"//
:"")://
i)+//
"\n");}

Cobalah secara Online

Cukup membosankan karena komentar garis. Satu-satunya hal yang menarik di sini adalah penggunaan Systemreferensi nol , yang tampaknya diperlukan untuk mencetak standar di bawah 8 byte per baris. Perhatikan juga bahwaprint pemanggilan metode adalah bottleneck.

Tidak disatukan tanpa komentar:

a -> {
    System s = null;
    for (int i = 0; i < a; )
        s.out.print(
            (++i % 3 * (i % 5) < 1 ?
                (i % 3 < 1 ? "App"+"le" : "")
                    + (i % 5 < 1 ? "Pie" : "")
                : i
            ) + "\n"
        );
}
Jakob
sumber