First they came
SOGL V0.12, 103 102 101 bytes
→∑‘¾ο╤Ε9‘}ψ⁴‘¹"4¡‘Q°‘:¹¹I{ū_:¹"Eā/}l6⁸SÆ□⁴↔b⅜╬I℮;YΥηκ*█⅞F^Κ⅜⁸{x⅔⁵⅟╚?Z‘O}"Ι╚╬√⅔δηvΧχ⁷⁾Η<υL┼!Ο'μΠ⁵╝⁷‘⁾
Try it Here!
Explanation (here I replaced the compressed strings with ..
to save space):
..‘.‘..‘ push "socialist", "trade unionist" and "jew"
¹ wrap in an array: ["socialist", "trade unionist", "jew"]
"..‘..‘ push "first" and "then"
: duplicate the then
¹ wrap in an array: ["first","then","then"]
¹ wrap those two in an array: [["socialist", "trade unionist", "jew"], ["first","then","then"]]
I rotate clockwise: [[first,socialist], [then,trade unionist], [then,jew]]
{ } for each do, pushing the array
ū uppercase the 1st letter of each word in the array - ["First", "Socialist"]
_ splat the contents on the stack "First", "Socialist"
: duplicate the 2nd one "First", "Socialist", "Socialist"
¹ wrap in an array ["First", "Socialist", "Socialist"]
"..‘ push "ŗ they came for the ŗs, and I did not speak out-\nBecause I was not a ŗ." with ŗ replaced with its appropriate item in the array
O output that
"..‘ push "then they came for me-and there was no one left to speak for me."
⁾ uppercase the 1st letter of it
implicitly output it in a new line
6502 machine code (C64), 229 bytes
Kind of boring, still doable on a C64 with a somewhat decent amount of bytes :)
00 C0 A9 17 8D 18 D0 A2 2C 86 FE A6 FE A0 C0 BD B6 C0 20 1E AB C6 FE 10 F2 60
C6 49 52 53 54 20 00 D4 48 45 4E 20 00 54 48 45 20 00 54 48 45 59 20 43 41 4D
45 20 00 46 4F 52 20 00 53 50 45 41 4B 20 00 41 4E 44 20 C9 20 44 49 44 20 4E
4F 54 20 00 4F 55 54 2D 0D 00 C2 45 43 41 55 53 45 20 C9 20 57 41 53 20 4E 4F
54 20 41 20 00 4D 45 2D 41 4E 44 20 54 48 45 52 45 20 57 41 53 20 4E 4F 20 4F
4E 45 20 4C 45 46 54 20 54 4F 20 00 4D 45 2E 00 2E 0D 00 53 2C 20 00 D3 4F 43
49 41 4C 49 53 54 00 D4 52 41 44 45 20 D5 4E 49 4F 4E 49 53 54 00 CA 45 57 00
0D 00 8C 35 3A 6B 2A 1F B4 90 B0 56 50 3A 41 93 B0 25 35 2A 1F B4 90 A1 56 50
3A 41 93 A1 25 35 2A 1F B4 90 97 56 50 3A 41 93 97 25 35 2A 18
Online demo
Usage: SYS49152
Explanation:
As this contains mostly data, instead of a meaningless disassembly listing, here's the ca65
-style assembly source that creates this machine code:
.segment "LDADDR"
.word $c000 ; load address
.code
lda #$17 ; upper/lower mode
sta $d018 ; store in VIC register
ldx #revpoemsize ; initialize ...
stx $fe ; ... counter
loop: ldx $fe ; load current position
ldy #$c0 ; highbyte of strings always same
lda revpoem,x ; load lowbyte from table
jsr $ab1e ; output 0-terminated string
dec $fe ; decrement position
bpl loop ; >=0 ? -> repeat
rts ; done
first: .byte "First ", 0
then: .byte "Then ", 0
the: .byte "the ", 0
came: .byte "they came ", 0
for: .byte "for ", 0
speak: .byte "speak ", 0
didnot: .byte "and I did not ", 0
out: .byte "out-", $d, 0
wasnot: .byte "Because I was not a ", 0
noone: .byte "me-and there was no one left to ", 0
me: .byte "me.", 0
period: .byte ".", $d, 0
comma: .byte "s, ", 0
socialist: .byte "Socialist", 0
unionist: .byte "Trade Unionist", 0
jew: .byte "Jew", 0
p: .byte $d, 0
revpoem: .byte <me, <for, <speak, <noone, <came, <then, <p
.byte <period, <jew, <wasnot, <out, <speak, <didnot
.byte <comma, <jew, <the, <for, <came, <then, <p, <period
.byte <unionist, <wasnot, <out, <speak, <didnot, <comma
.byte <unionist, <the, <for, <came, <then, <p, <period
.byte <socialist, <wasnot, <out, <speak, <didnot, <comma
.byte <socialist, <the, <for, <came, <first
revpoemsize = * - revpoem - 1
Python 3, 209 bytes
t='they came for '
s='First '
for i in'Socialist','Trade Unionist','Jew':s+=t+f'the {i}s, and I did not speak out-\nBecause I was not a {i}.\n\nThen '
print(s+t+'me-and there was no one left to speak for me.')
Try it online!
-5 thanks to Felipe Nardi Batista.