Es hat schon viele "Do __ without _ _" Herausforderungen gegeben, aber ich hoffe, dass dies eine der schwierigsten ist.
Die Herausforderung
Sie müssen ein Programm schreiben, das zwei natürliche Zahlen (ganze Zahlen> 0) von STDIN nimmt und die Summe der beiden Zahlen an STDOUT ausgibt. Die Herausforderung besteht darin, dass Sie so wenig +
und -
Zeichen wie möglich verwenden müssen. Sie dürfen keine Summen- oder Negationsfunktionen verwenden.
Beispiele
Eingang
123
468
Ausgabe
591
Eingang
702
720
Ausgabe
1422
Tie Breaker:
Wenn zwei Programme die gleiche Anzahl von +
und -
Zeichen haben, ist der Gewinner die Person mit weniger /
*
(
)
=
.
,
und 0-9
Zeichen.
Nicht zulässig: Sprachen, in denen die Standardoperatoren für Addition / Subtraktion und Inkrement / Dekrement andere Symbole als +
oder -
nicht zulässig sind. Dies bedeutet, dass Whitespace die Sprache nicht erlaubt.
quelle
+
oder-
...+
,-
und Tie - Break Zeichen? ... oder müssen Sie die Regeln noch einmal ändern :-)Antworten:
Perl (keine +/-, keine Tie-Breaker, 29 Zeichen)
Als Bonus können Sie die Codesumme aus mehr als zwei Zahlen zusammensetzen, indem Sie mehr
x
s zu der hinzufügens!!xx!
.Alternativ gibt es hier zwei 21-char-Lösungen mit 1 bzw. 3 Tie-Breakern
Hinweis: Diese Lösungen verwenden die
say
seit Perl 5.10.0 verfügbare Funktion mit dem-E
Befehlszeilenschalter oder mituse 5.010
. Informationen zu Versionen, die auf älteren Perls funktionieren, finden Sie im Bearbeitungsverlauf dieser Antwort .Wie funktioniert die Lösung ohne Kabelbinder?
s!!xx!
ist ein regexp-Ersetzungsoperator , der standardmäßig die$_
Variable bearbeitet und die leere Zeichenfolge durch die Zeichenfolge ersetztxx
. (Wird/
normalerweise in Perl als reguläres Begrenzungszeichen verwendet, aber es kann wirklich fast jedes Zeichen verwendet werden. Ich habe mich dafür entschieden,!
da es kein Unentschieden ist.) Dies ist nur eine ausgefallene Art"xx"
, vor$_
- oder, da$_
leer zu beginnen (undefiniert, Eigentlich ist es eine Art zu schreiben,$_ = "xx"
ohne das Gleichheitszeichen zu verwenden (und auch mit einem Zeichen weniger).s!x!$"x<>!eg
Ersetzen jedes dieses Mal ist ein weiterer regexp Ersatzx
in$_
mit dem Wert des Ausdrucks$" x <>
. (Derg
Schalter gibt die globale Ersetzung an unde
gibt an, dass die Ersetzung als Perl-Code ausgewertet werden soll, anstatt als Literalzeichenfolge verwendet zu werden.) Dies$"
ist eine spezielle Variable, deren Standardwert zufällig ein einzelnes Leerzeichen ist. Wenn Sie es verwenden, anstatt" "
ein Zeichen zu speichern. (Jede andere Variable, von der bekannt ist, dass sie einen Ein-Zeichen-Wert hat, wie z. B.$&
oder$/
, würde hier genauso gut funktionieren, mit der Ausnahme, dass$/
mich die Verwendung eines solchen Parameters einen Unentschieden kosten würde.)Der
<>
Zeileneingabeoperator liest im skalaren Kontext eine Zeile aus der Standardeingabe und gibt sie zurück. Dasx
Vorher ist der Perl- Zeichenfolge-Wiederholungsoperator und ist wirklich der Kern dieser Lösung: Er gibt seinen linken Operanden (ein einzelnes Leerzeichen) zurück, der so oft wiederholt wird, wie er von seinem rechten Operanden (der gerade als Eingabe gelesenen Zeile) angegeben wurde.y!!!c
Dies ist nur eine obskure Möglichkeit, den Transliterationsoperator (ab) zu verwenden , um die Zeichen in einer Zeichenfolge zu zählen ($_
standardmäßig ebenfalls). Ich hätte gerade schreiben könnensay length
, aber die verschleierte Version ist ein Zeichen kürzer. :)quelle
code-golf
mit einigen Quellenbeschränkungen verbunden?R (24 Zeichen)
Was dies bewirkt:
scan
Liest Eingaben von STDIN (oder einer Datei)sequence
generiert Integer-Sequenzen ab 1 und verkettet die Sequenzen. Beispielsweisesequence(c(2, 3))
ergibt sich der Vektor1 2 1 2 3
length
berechnet die Anzahl der Elemente im verketteten VektorBeispiel 1:
Beispiel 2:
quelle
D
bisschen herumspielen um den Sieg
als Bonus enthält der kompilierte Code keine Add-Operation (kann aber nicht für den readf-Aufruf sprechen)
quelle
Python 2, 43 Bytes
quelle
print sum(input(),input())
GolfScript
Keine +/- oder Tie-Breaker:
Viel einfachere Version mit zwei Breaker-Charakteren, die denselben Listenketten-Trick verwenden, den andere Leute verwenden:
Ich gehe davon aus, dass GolfScript nicht
)
als Inkrement-Operator disqualifiziert ist , da ich es eigentlich nicht benutze.quelle
C (nur 32 Bit)
Zeigerarithmetik ist genauso gut.
Wie passt es zu den Anforderungen?
* Nein
+
oder-
* Nein
/
,=
,.
,0
-9
* Nur drei Paare von Klammern, die minimal mir scheint (man braucht
main
,scanf
,printf
).* Eins
*
(der Zeiger-Ansatz erfordert es).* Vier
,
(könnte eins sparen, indem normale Variablen definiert werden, nichtac,av
)quelle
C ++ 0 +/-, 3 Tie-Breaker
quelle
Haskell, 0 + 2
Dies verwendet keine
+
oder-
Zeichen und nur zwei=
aus dem Satz der Tie Breaker-Zeichen, von denen eines für die Bindung obligatorisch istmain
. Die Summe wird durch Verketten von Listen mit den entsprechenden Längen erreicht.quelle
BEARBEITEN Dies wurde gepostet, BEVOR die Regeln geändert wurden, um zu verbieten
sum
...Die R-Sprache: Keine Anrufe an
+
oder-
... und 9 Breaker-Charaktere!Beispiel:
Das
[1] 579
ist die Antwort 579 (das[1]
ist zu verfolgen, wo in dem Ergebnisvektor Sie sind, da in R alle Werte Vektoren sind - in diesem Fall der Länge 1)Beachten Sie, dass R
+
wie die meisten Sprachen Operatoren hat - es kommt nur so vor, dass es auch so vielesum
Vektoren hat.In diesem Fall wird
readLines
ein Zeichenfolgenvektor der Länge 2 zurückgegeben. Dann erzwinge ich ihn zu numerisch (verdoppelt) und fasse ihn zusammen ...Nur um einige andere Funktionen von R zu zeigen:
quelle
colSums
stattdessen einfach ... Vielleicht verbiete ich auch "negationsähnliche Funktionen", während du dran bist ...Die R-Sprache
Neue Regeln, neue Antwort, gleiche Sprache. Keine Anrufe zu
+
oder-
UPDATE Mit
scan
dieser Option werden 11 (und insgesamt 27) Zeichen für den Tie-Breaker angezeigt.Original: 13 Breaker-Charaktere!
Beispiel:
Diesmal wird das Ergebnis durch Matrixmultiplikation erzielt. Die Antwort wird als 1x1-Matrix angezeigt.
quelle
scan()
stattreadlines(n=2)
Haskell, 0
+
/-
,62 Krawattenbrecher (=
)(verwendet nicht den String / List-Verkettungstrick)
quelle
Javascript, 56
Danke an @JiminP für den ~~ Tipp! Ich gehe für die wenigsten Bytes, also spart das 1 Byte an der p = Eingabeaufforderung; ist es immer noch wert. Ich verstehe Ihre Argumentation über Tie-Breaker-Zeichen, aber um ehrlich zu sein, würden Sie nicht lieber die kleinsten Bytes :-p
Fassung, 69
Dank einiger Rückmeldungen von @Ilmari und @JiminP habe ich 13 Bytes meiner ursprünglichen Lösung eingespart.
Ursprünglich 82
quelle
concat
und Einfügen von Berechnungenalert
ist kürzer.i=parseInt;p=prompt;alert(Array(i(p())).concat(Array(i(p()))).length)
Übrigens wusste ich nicht, dassArray(n)
ein Array mit Länge zurückgibtn
. Die Google Chrome-Konsole gab mir[]
und ich dachte, es gibt nichts ...p=prompt
ist nicht gut. UndparseInt(x)
ist fast gleichbedeutend mit~~x
.alert(Array(~~prompt())['concat'](Array(~~prompt()))['length'])
(12 Tie-Breaker-Zeichen) PS. Ich könnte dies als meine Eingabe verwenden, aber das gibt mir nur das Gefühl zu stehlen.C
quelle
APL (keine +/-, keine Verbindungsunterbrecher, 8 oder 10 Zeichen)
Dieser Eintrag ähnelt den anderen Einträgen, bei denen aus der Eingabe generierte Sequenzen verkettet und die Länge ermittelt werden. Er befindet sich jedoch in APL, was selbst bei einem kleinen Problem wie diesem verwirrend sein kann. Ich habe Dyalog APL verwendet , das eine kostenlose Bildungslizenz anbietet.
Code:
Von rechts nach links:
⎕
) fordert Eingaben vom Benutzer an und wertet diese aus.¨
) wendet die Indexgeneratorfunktion (⍳
) auf jedes der Elemente im Array auf der rechten Seite an./
) auf eine flache Liste reduziert , die das Array mithilfe der Verkettungsfunktion (,
) faltet . Für diese Herausforderung wird der eindimensionale Reduktionsoperator (⌿
) zusammen mit dem Verkettungsoperator entlang der ersten Achse (⍪
) verwendet.⊃
) gibt uns den Inhalt des beiliegenden Arrays (den Beutel) an.⍴
) die Längen der Dimensionen eines Arrays an. In diesem Fall haben wir ein eindimensionales Array, sodass wir die Anzahl der Elemente im Array erhalten, was unser Ergebnis ist.Wenn wir das Ergebnis explizit ausgeben müssen, können wir dies folgendermaßen tun:
Vergleichbarer Python-Code mit den entsprechenden APL-Symbolen oben:
Ich würde gerne wissen , ob es eine kürzere Version möglich in APL ist - eine andere, einfachere Version kam ich mit , dass mehr Gleichstand hat (obwohl immer noch bei 8 Zeichen) ist:
⍴(⍳⎕),⍳⎕
.quelle
Ich habe niemanden gesehen, der es auf elektrotechnische Weise gemacht hat, also hier meine Einstellung (in Ruby):
Es ist ein bisschen hässlich, aber es erledigt die Arbeit. Die beiden Werte werden bitweise verglichen
AND
. Wenn sie keine gemeinsamen Bits haben, gibt es keinen "Übertrag" in die nächste Binärspalte, so dass die Addition durch bitweises Hinzufügen abgeschlossen werdenXOR
kann. Wenn es einen Übertrag gibt, müssen Sie den Übertrag bitweise hinzufügenXOR
. Hier ist ein kleines Rubinskript, mit dem ich sichergestellt habe, dass meine digitale Logik nicht zu verrostet ist:Prost!
quelle
Seed ,
3904384611 Bytes, 0 +/-, 10 Tie Breakerquelle
Shell, 52
Dies ist im Grunde die gleiche Antwort, die ich für ein anderes Problem gegeben habe.
quelle
xargs -n1 jot | wc -l
das kostet die gleiche-
Reduktion,awk
aber ich kann nicht sehen, wie ich das vermeiden kannxargs
C
quelle
/*=.
, 7(
, 7)
, 7,
, 1[0-9]
C #
Es ist nicht die kürzeste Strecke:
quelle
J,
157 Zeichen, 1 Kabelbinder, unvollständiges ProgrammDas ist mein Versuch. Es ist kein vollständiges Programm, weil ich noch nicht herausgefunden habe, wie man eines schreibt. Fügen Sie diese Zeile einfach in ein Skript ein, um die Funktion zu erhalten, mit der Sie
p
eine beliebige Anzahl von Zahlen hinzufügen können. Es ist eine Monade und benötigt eine Liste von Zahlen, die hinzugefügt werden müssen (z. B.p 1 2 3 4
):Die Idee ist sehr einfach. Die Funktion ist stillschweigend oder sinnlos geschrieben. Hier ist eine spitze Definition:
Lesen Sie von rechts nach links. Fasst in der stillschweigenden Version
@
die Teile der Funktion zusammen. (wie ein ∘ in der Mathematik [(f∘g) (x) = f (g (x)])y
ist der Parameter vonp
.~
macht ein Verb reflexiv. Für ein Verbm
,m~ a
ist gleicha m a
.#
(copy,a#b
): Jedes Element ina
wirdi
mal repliziert , wobeii
sich das Element am selben Index befindet wie das aktuelle Elementa
vonb
. So#~
repliziert ein Elementn
n
mal.#
(Anzahl,#b
): Zählt die Anzahl der Elemente inb
.Fazit: J ist furchterregend und weniger lesbar als Perl (was es noch furchterregender macht)
Bearbeitungen
#
statti.
. Ja! Weniger Zeichen als Golfscript.Eher ein Programm
Dieser fragt nach Eingaben, ist aber noch kein vollständiges Programm: (13 Zeichen, 3 Unterbrecher)
quelle
Javascript (17 Breaker-Charaktere)
: P ("Verschleiert", um die Anzahl der Trennzeichen zu verringern. Intern ist es
b=prompt(a=prompt(y=function(a){c=new Uint8Array(a);for(i in c)if(i==~~i)x.push(1)},x=[]));y(a);y(b);alert(x.length);
.)quelle
C #,
Programm funktioniert in 1 Zeile; Auf mehreren Zeilen getrennt, um horizontales Scrollen zu vermeiden.
quelle
Clojure (44 Zeichen)
Bearbeiten: Behoben, auf STDOUT zu drucken, anstatt nur die Summe zurückzugeben.
quelle
Scala
Code:
quelle
K, 11
Gleicher Verkettungstrick wie die R-Lösung. Lesen von rechts nach links: Zählen Sie die beiden Eingabevariablen auf, verketten Sie sie und zählen Sie sie dann.
quelle
PowerShell ,
2742 Bytes, 0+-
,41 sekundärDanke an mazzy für das Speichern von a
+
und 4 SecondariesProbieren Sie es online! oder Pretty Table für zusätzliche 3 Bytes
-Oder- Hinzufügen von vier Sekunden, um 19 Bytes zu sparen:
3223 Bytes,10+-
,125 Sekunden-9 bytes dank mazzy
Probieren Sie es online!
Für jedes Argument verschieben wir
n
Array-Elemente (bestehend aus,[n]
aber das ist nicht wichtig) in die Pipeline, die von den Parens gruppiert und dann gezählt werden.quelle
|fl
für ein hübsches Format hinzufügen Probieren Sie es online!Fass (SBCS im Keg-Wiki)
Grundsätzlich ein Port der R-Antwort.
Erläuterung
quelle
05AB1E , 2
4Bytes, 0+
/-
Probieren Sie es online!
Entschuldigung, wenn ich diese Herausforderung missverstanden habe, aber ich war überrascht, dass es keine 05AB1E-Antwort gab. Die kürzeste Antwort in dieser Sprache, die ich finden könnte, verwendet weder + noch die eingebaute Summenfunktion.
Erläuterung:
-2 Bytes dank Grimy.
quelle
Python 3
Ohne sich auf versteckte Summierungen in anderen Funktionen zu verlassen.
Probieren Sie es online!
quelle
D
diesmal mit Arraylängen
quelle